diff --git a/org.eclipse.jdt.junit.core/plugin.properties b/org.eclipse.jdt.junit.core/plugin.properties
deleted file mode 100644
index d93dd01..0000000
--- a/org.eclipse.jdt.junit.core/plugin.properties
+++ /dev/null
@@ -1,35 +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=Java Development Tools JUnit support
-providerName=Eclipse.org
-
-testRunListeners.name= Test Run Listeners
-junitQuickFixProcessor= JUnit Quick Fix Processor
-
-View.label= JUnit
-Launch.label= JUnit
-PreferencePage.label= JUnit
-
-TestWizard.description= Create a JUnit Test Case
-SuiteWizard.description= Create a JUnit Test Suite
-UpdateSuiteAction.label= Recreate Test Suite...
-UpdateSuiteAction.tooltip= Recreate JUnit TestSuite with new test classes
-Task.name= JUnit Task
-WizardCategory.name= JUnit
-TestCaseWizard.name= Test Case
-TestSuiteWizard.name= Test Suite
-
-JUnitShortcut.label= JUnit Test
-
-JUnitActionSet.label= JUnit
-
-GotoTestAction.label= Referring Tests...
-GotoTestAction.tooltip= Go to Test Referring to Selection
diff --git a/org.eclipse.jdt.junit.core/plugin.xml b/org.eclipse.jdt.junit.core/plugin.xml
deleted file mode 100644
index c4c65d7..0000000
--- a/org.eclipse.jdt.junit.core/plugin.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jdt.junit"
-   name="%pluginName"
-   version="3.0.0"
-   provider-name="%providerName"
-   class="org.eclipse.jdt.internal.junit.ui.JUnitPlugin">
-
-   <runtime>
-      <library name="junitsupport.jar">
-         <export name="*"/>
-         <packages prefixes="org.eclipse.jdt.internal.junit,org.eclipse.jdt.junit"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.ui.views"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.ui.editors"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.core.runtime.compatibility" optional="true"/>
-      <import plugin="org.eclipse.core.boot"/>
-      <import plugin="org.eclipse.debug.core"/>
-      <import plugin="org.eclipse.debug.ui"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jdt.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.jdt.debug.ui"/>
-      <import plugin="org.eclipse.jdt.junit.runtime"/>
-      <import plugin="org.eclipse.compare"/>
-   </requires>
-
-
-   <extension-point id="testRunListeners" name="%testRunListeners.name" schema="schema/testRunListeners.exsd"/>
-
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="%View.label"
-            icon="icons/full/cview16/junit.gif"
-            category="org.eclipse.jdt.ui.java"
-            fastViewWidthRatio="0.40"
-            class="org.eclipse.jdt.internal.junit.ui.TestRunnerViewPart"
-            id="org.eclipse.jdt.junit.ResultView">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.jdt.ui.JavaPerspective">
-         <view
-               relative="org.eclipse.jdt.ui.PackageExplorer"
-               visible="false"
-               id="org.eclipse.jdt.junit.ResultView"
-               relationship="stack">
-         </view>
-      </perspectiveExtension>
-      <perspectiveExtension
-            targetID="org.eclipse.jdt.ui.JavaPerspective">
-         <actionSet
-               id="org.eclipse.jdt.junit.JUnitActionSet">
-         </actionSet>
-      </perspectiveExtension>
-      <perspectiveExtension
-            targetID="org.eclipse.jdt.ui.JavaBrowsingPerspective">
-         <actionSet
-               id="org.eclipse.jdt.junit.JUnitActionSet">
-         </actionSet>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%PreferencePage.label"
-            category="org.eclipse.jdt.ui.preferences.JavaBasePreferencePage"
-            class="org.eclipse.jdt.internal.junit.ui.JUnitPreferencePage"
-            id="org.eclipse.jdt.junit.preferences">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationTypes">
-      <launchConfigurationType
-            name="%Launch.label"
-            delegate="org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfiguration"
-            modes="run, debug"
-            id="org.eclipse.jdt.junit.launchconfig">
-         <fileExtension
-               default="false"
-               extension="java">
-         </fileExtension>
-         <fileExtension
-               default="false"
-               extension="class">
-         </fileExtension>
-      </launchConfigurationType>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationComparators">
-      <launchConfigurationComparator
-            attribute="org.eclipse.jdt.junit.CONTAINER"
-            class="org.eclipse.jdt.internal.junit.launcher.ContainerComparator"
-            id="org.eclipse.jdt.junit.containerComparator">
-      </launchConfigurationComparator>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-      <launchConfigurationTypeImage
-            icon="icons/full/obj16/julaunch.gif"
-            configTypeID="org.eclipse.jdt.junit.launchconfig"
-            id="org.eclipse.jdt.junit.launchimage">
-      </launchConfigurationTypeImage>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-      <launchConfigurationTabGroup
-            type="org.eclipse.jdt.junit.launchconfig"
-            helpContextId="org.eclipse.jdt.junit.junit_tab_group"
-            class="org.eclipse.jdt.internal.junit.launcher.JUnitTabGroup"
-            id="org.eclipse.jdt.junit.launchConfigurationTabGroup.junit">
-      </launchConfigurationTabGroup>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            name="%WizardCategory.name"
-            parentCategory="org.eclipse.jdt.ui.java"
-            id="org.eclipse.jdt.junit">
-      </category>
-      <wizard
-            javatype="true"
-            name="%TestCaseWizard.name"
-            icon="icons/full/ctool16/new_testcase.gif"
-            category="org.eclipse.jdt.ui.java/org.eclipse.jdt.junit"
-            class="org.eclipse.jdt.internal.junit.wizards.NewTestCaseCreationWizard"
-            id="org.eclipse.jdt.junit.wizards.NewTestCaseCreationWizard">
-         <description>
-            %TestWizard.description
-         </description>
-      </wizard>
-      <wizard
-            name="%TestSuiteWizard.name"
-            icon="icons/full/ctool16/new_testsuite.gif"
-            category="org.eclipse.jdt.ui.java/org.eclipse.jdt.junit"
-            class="org.eclipse.jdt.internal.junit.wizards.NewTestSuiteCreationWizard"
-            id="org.eclipse.jdt.junit.wizards.NewTestSuiteCreationWizard">
-         <description>
-            %SuiteWizard.description
-         </description>
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            objectClass="org.eclipse.jdt.core.ICompilationUnit"
-            nameFilter="AllTests.java"
-            id="org.eclipse.jdt.junit.wizards.UpdateTestSuite">
-         <action
-               label="%UpdateSuiteAction.label"
-               class="org.eclipse.jdt.internal.junit.wizards.UpdateTestSuite"
-               tooltip="%UpdateSuiteAction.tooltip"
-               enablesFor="1"
-               id="updateTestSuite">
-         </action>
-      </objectContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="%JUnitActionSet.label"
-            visible="false"
-            id="org.eclipse.jdt.junit.JUnitActionSet">
-         <action
-               label="%GotoTestAction.label"
-               helpContextId="org.eclipse.jdt.junit.goto_referenced_test_action_context"
-               class="org.eclipse.jdt.internal.junit.ui.GotoReferencedTestAction"
-               tooltip="%GotoTestAction.tooltip"
-               menubarPath="navigate/goTo/"
-               id="junit.actions.GotoTestAction">
-         </action>
-      </actionSet>
-   </extension>
-   <extension
-         id="junit_task"
-         name="%Task.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.core.resources.taskmarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchShortcuts">
-      <shortcut
-            label="%JUnitShortcut.label"
-            icon="icons/full/obj16/julaunch.gif"
-            helpContextId="org.eclipse.jdt.junit.launch_shortcut"
-            class="org.eclipse.jdt.internal.junit.launcher.JUnitLaunchShortcut"
-            modes="run, debug"
-            id="org.eclipse.jdt.junit.junitShortcut">
-         <perspective
-               id="org.eclipse.jdt.ui.JavaPerspective">
-         </perspective>
-         <perspective
-               id="org.eclipse.jdt.ui.JavaHierarchyPerspective">
-         </perspective>
-         <perspective
-               id="org.eclipse.jdt.ui.JavaBrowsingPerspective">
-         </perspective>
-         <perspective
-               id="org.eclipse.debug.ui.DebugPerspective">
-         </perspective>
-      </shortcut>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.core.classpathVariableInitializer">
-      <classpathVariableInitializer
-            variable="JUNIT_HOME"
-            class="org.eclipse.jdt.internal.junit.ui.JUnitHomeInitializer">
-      </classpathVariableInitializer>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.ui.quickFixProcessors">
-      <quickFixProcessor
-            name="%junitQuickFixProcessor"
-            class="org.eclipse.jdt.internal.junit.ui.JUnitQuickFixProcessor"
-            id="org.eclipse.jdt.internal.junit.ui.JUnitQuickFixProcessor">
-      </quickFixProcessor>
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.jdt.junit.core/schema/testRunListeners.exsd b/org.eclipse.jdt.junit.core/schema/testRunListeners.exsd
deleted file mode 100644
index 46d5661..0000000
--- a/org.eclipse.jdt.junit.core/schema/testRunListeners.exsd
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jdt.junit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jdt.junit" id="testRunListeners" name="Test Run Listeners"/>
-      </appInfo>
-      <documentation>
-         Extension point to register additional test run listeners. A test run listeners is notified about the execution of a test run.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <documentation>
-            a fully qualified identifier of the target extension point
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="testRunListener"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="testRunListener">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Test run class implementing org.eclipse.jdt.junit.ITestRunListener
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jdt.junit.ITestRunListener"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a test run listener contribution:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.jdt.junit.testRunListeners&quot;&gt;
-  &lt;testRunListener class=&quot;com.example.SampleTestRunListener&quot;/&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Test run listeners must must implement the org.eclipse.jdt.junit.ITestRunListener interface.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-&lt;a href=&quot;hglegal.htm&quot;&gt;
- &lt;img SRC=&quot;ngibmcpy.gif&quot;
-   ALT=&quot;Copyright (c) 2000, 2003 IBM Corporation and others. All Rights Reserved.&quot;
-   BORDER=0 height=14 width=324&gt;&lt;/a&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitCorePlugin.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitCorePlugin.java
deleted file mode 100644
index 9d90c07..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitCorePlugin.java
+++ /dev/null
@@ -1,412 +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
- *   Julien Ruaux: jruaux@octo.com
- * 	 Vincent Massol: vmassol@octo.com
- ******************************************************************************/
-
-package org.eclipse.jdt.internal.junit.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.launcher.JUnitBaseLaunchConfiguration;
-import org.eclipse.jdt.junit.ITestRunListener;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The plug-in runtime class for the JUnit plug-in.
- */
-public class JUnitPlugin extends AbstractUIPlugin implements ILaunchListener {
-	/**
-	 * The single instance of this plug-in runtime class.
-	 */
-	private static JUnitPlugin fgPlugin= null;
-
-	public static final String PLUGIN_ID= "org.eclipse.jdt.junit"; //$NON-NLS-1$
-	public static final String ID_EXTENSION_POINT_TESTRUN_LISTENERS= PLUGIN_ID + "." + "testRunListeners"; //$NON-NLS-1$ //$NON-NLS-2$
-
-	public final static String TEST_SUPERCLASS_NAME= "junit.framework.TestCase"; //$NON-NLS-1$
-	public final static String TEST_INTERFACE_NAME= "junit.framework.Test"; //$NON-NLS-1$
-	
-	/**
-	 * The class path variable referring to the junit home location
-	 */
-	public final static String JUNIT_HOME= "JUNIT_HOME"; //$NON-NLS-1$
-
-	private static URL fgIconBaseURL;
-
-	/**
-	 * Use to track new launches. We need to do this
-	 * so that we only attach a TestRunner once to a launch.
-	 * Once a test runner is connected it is removed from the set.
-	 */
-	private AbstractSet fTrackedLaunches= new HashSet(20);
-
-	/**
-	 * List storing the registered test run listeners
-	 */
-	private List fTestRunListeners;
-
-	public JUnitPlugin(IPluginDescriptor desc) {
-		super(desc);
-		fgPlugin= this;
-		String pathSuffix= "icons/full/"; //$NON-NLS-1$
-		try {
-			fgIconBaseURL= new URL(getDescriptor().getInstallURL(), pathSuffix);
-		} catch (MalformedURLException e) {
-			// do nothing
-		}
-	}
-
-	public static JUnitPlugin getDefault() {
-		return fgPlugin;
-	}
-
-	public static Shell getActiveWorkbenchShell() {
-		IWorkbenchWindow workBenchWindow= getActiveWorkbenchWindow();
-		if (workBenchWindow == null)
-			return null;
-		return workBenchWindow.getShell();
-	}
-
-	/**
-	 * Returns the active workbench window
-	 * 
-	 * @return the active workbench window
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (fgPlugin == null)
-			return null;
-		IWorkbench workBench= fgPlugin.getWorkbench();
-		if (workBench == null)
-			return null;
-		return workBench.getActiveWorkbenchWindow();
-	}
-
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow activeWorkbenchWindow= getActiveWorkbenchWindow();
-		if (activeWorkbenchWindow == null)
-			return null;
-		return activeWorkbenchWindow.getActivePage();
-	}
-
-	public static String getPluginId() {
-		return getDefault().getDescriptor().getUniqueIdentifier();
-	}
-
-	/*
-	 * @see AbstractUIPlugin#initializeDefaultPreferences
-	 */
-	protected void initializeDefaultPreferences(IPreferenceStore store) {
-		super.initializeDefaultPreferences(store);
-		JUnitPreferencePage.initializeDefaults(store);
-	}
-
-	public static void log(Throwable e) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, "Error", e)); //$NON-NLS-1$
-	}
-
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-
-	public static URL makeIconFileURL(String name) throws MalformedURLException {
-		if (JUnitPlugin.fgIconBaseURL == null)
-			throw new MalformedURLException();
-		return new URL(JUnitPlugin.fgIconBaseURL, name);
-	}
-
-	static ImageDescriptor getImageDescriptor(String relativePath) {
-		try {
-			return ImageDescriptor.createFromURL(makeIconFileURL(relativePath));
-		} catch (MalformedURLException e) {
-			// should not happen
-			return ImageDescriptor.getMissingImageDescriptor();
-		}
-	}
-
-	/*
-	 * @see ILaunchListener#launchRemoved(ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {
-		fTrackedLaunches.remove(launch);
-		TestRunnerViewPart testRunnerViewPart= findTestRunnerViewPartInActivePage();
-		if (testRunnerViewPart != null && testRunnerViewPart.isCreated() && launch.equals(testRunnerViewPart.getLastLaunch()))
-			testRunnerViewPart.reset();
-	}
-
-	/*
-	 * @see ILaunchListener#launchAdded(ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-		fTrackedLaunches.add(launch);
-	}
-
-	public void connectTestRunner(ILaunch launch, IType launchedType, int port) {
-		TestRunnerViewPart testRunnerViewPart= showTestRunnerViewPartInActivePage(findTestRunnerViewPartInActivePage());
-		if (testRunnerViewPart != null)
-			testRunnerViewPart.startTestRunListening(launchedType, port, launch);
-	}
-
-	private TestRunnerViewPart showTestRunnerViewPartInActivePage(TestRunnerViewPart testRunner) {
-		IWorkbenchPart activePart= null;
-		IWorkbenchPage page= null;
-		try {
-			// TODO: have to force the creation of view part contents 
-			// otherwise the UI will not be updated
-			if (testRunner != null && testRunner.isCreated())
-				return testRunner;
-			page= getActivePage();
-			if (page == null)
-				return null;
-			activePart= page.getActivePart();
-			//	show the result view if it isn't shown yet
-			return (TestRunnerViewPart) page.showView(TestRunnerViewPart.NAME);
-		} catch (PartInitException pie) {
-			log(pie);
-			return null;
-		} finally{
-			//restore focus stolen by the creation of the result view
-			if (page != null && activePart != null)
-				page.activate(activePart);
-		}
-	}
-
-	private TestRunnerViewPart findTestRunnerViewPartInActivePage() {
-		IWorkbenchPage page= getActivePage();
-		if (page == null)
-			return null;
-		return (TestRunnerViewPart) page.findView(TestRunnerViewPart.NAME);
-	}
-
-	/*
-	 * @see ILaunchListener#launchChanged(ILaunch)
-	 */
-	public void launchChanged(final ILaunch launch) {
-		if (!fTrackedLaunches.contains(launch))
-			return;
-
-		ILaunchConfiguration config= launch.getLaunchConfiguration();
-		IType launchedType= null;
-		int port= -1;
-		if (config != null) {
-			// test whether the launch defines the JUnit attributes
-			String portStr= launch.getAttribute(JUnitBaseLaunchConfiguration.PORT_ATTR);
-			String typeStr= launch.getAttribute(JUnitBaseLaunchConfiguration.TESTTYPE_ATTR);
-			if (portStr != null && typeStr != null) {
-				port= Integer.parseInt(portStr);
-				IJavaElement element= JavaCore.create(typeStr);
-				if (element instanceof IType)
-					launchedType= (IType) element;
-			}
-		}
-		if (launchedType != null) {
-			fTrackedLaunches.remove(launch);
-			final int finalPort= port;
-			final IType finalType= launchedType;
-			getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					connectTestRunner(launch, finalType, finalPort);
-				}
-			});
-		}
-	}
-
-	/*
-	 * @see Plugin#startup()
-	 */
-	public void startup() throws CoreException {
-		super.startup();
-		ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-		launchManager.addLaunchListener(this);
-	}
-
-	/*
-	 * @see Plugin#shutdown()
-	 */
-	public void shutdown() throws CoreException {
-		super.shutdown();
-		ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-		launchManager.removeLaunchListener(this);
-	}
-
-	public static Display getDisplay() {
-		Shell shell= getActiveWorkbenchShell();
-		if (shell != null) {
-			return shell.getDisplay();
-		}
-		Display display= Display.getCurrent();
-		if (display == null) {
-			display= Display.getDefault();
-		}
-		return display;
-	}
-	/**
-	 * Utility method to create and return a selection dialog that allows
-	 * selection of a specific Java package.  Empty packages are not returned.
-	 * If Java Projects are provided, only packages found within those projects
-	 * are included.  If no Java projects are provided, all Java projects in the
-	 * workspace are considered.
-	 */
-	public static ElementListSelectionDialog createAllPackagesDialog(Shell shell, IJavaProject[] originals, final boolean includeDefaultPackage) throws JavaModelException {
-		final List packageList= new ArrayList();
-		if (originals == null) {
-			IWorkspaceRoot wsroot= ResourcesPlugin.getWorkspace().getRoot();
-			IJavaModel model= JavaCore.create(wsroot);
-			originals= model.getJavaProjects();
-		}
-		final IJavaProject[] projects= originals;
-		final JavaModelException[] exception= new JavaModelException[1];
-		ProgressMonitorDialog monitor= new ProgressMonitorDialog(shell);
-		IRunnableWithProgress r= new IRunnableWithProgress() {
-			public void run(IProgressMonitor pm) {
-				try {
-					Set packageNameSet= new HashSet();
-					pm.beginTask(JUnitMessages.getString("JUnitPlugin.searching"), projects.length); //$NON-NLS-1$
-					for (int i= 0; i < projects.length; i++) {
-						IPackageFragment[] pkgs= projects[i].getPackageFragments();
-						for (int j= 0; j < pkgs.length; j++) {
-							IPackageFragment pkg= pkgs[j];
-							if (!pkg.hasChildren() && (pkg.getNonJavaResources().length > 0))
-								continue;
-
-							String pkgName= pkg.getElementName();
-							if (!includeDefaultPackage && pkgName.length() == 0)
-								continue;
-
-							if (packageNameSet.add(pkgName))
-								packageList.add(pkg);
-						}
-						pm.worked(1);
-					}
-					pm.done();
-				} catch (JavaModelException jme) {
-					exception[0]= jme;
-				}
-			}
-		};
-		try {
-			monitor.run(false, false, r);
-		} catch (InvocationTargetException e) {
-			JUnitPlugin.log(e);
-		} catch (InterruptedException e) {
-			JUnitPlugin.log(e);
-		}
-		if (exception[0] != null)
-			throw exception[0];
-
-		int flags= JavaElementLabelProvider.SHOW_DEFAULT;
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(shell, new JavaElementLabelProvider(flags));
-		dialog.setIgnoreCase(false);
-		dialog.setElements(packageList.toArray()); // XXX inefficient
-		return dialog;
-	}
-
-	/**
-	 * Initializes TestRun Listener extensions
-	 */
-	private void loadTestRunListeners() {
-		fTestRunListeners= new ArrayList();
-		IExtensionPoint extensionPoint= Platform.getPluginRegistry().getExtensionPoint(ID_EXTENSION_POINT_TESTRUN_LISTENERS);
-		if (extensionPoint == null) {
-			return;
-		}
-		IConfigurationElement[] configs= extensionPoint.getConfigurationElements();
-		MultiStatus status= new MultiStatus(PLUGIN_ID, IStatus.OK, "Could not load some testRunner extension points", null); //$NON-NLS-1$ 	
-
-		for (int i= 0; i < configs.length; i++) {
-			try {
-				ITestRunListener testRunListener= (ITestRunListener) configs[i].createExecutableExtension("class"); //$NON-NLS-1$
-				fTestRunListeners.add(testRunListener);
-			} catch (CoreException e) {
-				status.add(e.getStatus());
-			}
-		}
-		if (!status.isOK()) {
-			JUnitPlugin.log(status);
-		}
-	}
-
-	/**
-	 * Returns an array of all TestRun listeners
-	 */
-	public List getTestRunListeners() {
-		if (fTestRunListeners == null) {
-			loadTestRunListeners();
-		}
-		return fTestRunListeners;
-	}
-
-	/**
-	 * Adds a TestRun listener to the collection of listeners
-	 */
-	public void addTestRunListener(ITestRunListener newListener) {
-		if (fTestRunListeners == null) 
-			loadTestRunListeners();
-		for (Iterator iter= fTestRunListeners.iterator(); iter.hasNext();) {
-			Object o= iter.next();
-			if (o == newListener)
-				return;
-		}
-		fTestRunListeners.add(newListener);
-	}
-
-	/**
-	 * Removes a TestRun listener to the collection of listeners
-	 */
-	public void removeTestRunListener(ITestRunListener newListener) {
-		if (fTestRunListeners != null) 
-			fTestRunListeners.remove(newListener);
-	}
-
-}
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitMessages.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitMessages.java
deleted file mode 100644
index f7bb5dd..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitMessages.java
+++ /dev/null
@@ -1,49 +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.jdt.internal.junit.ui;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class JUnitMessages {
-
-	private static final String BUNDLE_NAME= "org.eclipse.jdt.internal.junit.ui.JUnitMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE= ResourceBundle.getBundle(BUNDLE_NAME);
-
-	private JUnitMessages() {
-	}
-
-	/**
-	 * Gets a string from the resource bundle and formats it with the argument
-	 * 
-	 * @param key	the string used to get the bundle value, must not be null
-	 */
-	public static String getFormattedString(String key, Object arg) {
-		return MessageFormat.format(getString(key), new Object[] { arg });
-	}
-
-	/**
-	 * Gets a string from the resource bundle and formats it with arguments
-	 */	
-	public static String getFormattedString(String key, Object[] args) {
-		return MessageFormat.format(getString(key), args);
-	}
-
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitMessages.properties b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitMessages.properties
deleted file mode 100644
index 350b519..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/JUnitMessages.properties
+++ /dev/null
@@ -1,181 +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
-###############################################################################
-CopyTrace.action.label=Copy Trace
-CopyTraceAction.problem=Problem Copying to Clipboard
-CopyTraceAction.clipboard_busy=There was a problem when accessing the system clipboard. Retry?
-
-CopyFailureList.action.label=Copy Failure List
-CopyFailureList.problem=Problem Copying Failure List to Clipboard
-CopyFailureList.clipboard_busy=There was a problem when accessing the system clipboard. Retry?
-
-CounterPanel.label.runs=Runs: 
-CounterPanel.label.errors=Errors: 
-CounterPanel.label.failures=Failures: 
-CounterPanel.runcount= {0}/{1}
-
-EnableStackFilterAction.action.label=Filter
-EnableStackFilterAction.action.description=Filter the stack trace
-EnableStackFilterAction.action.tooltip=Filter Stack Trace
-
-ScrollLockAction.action.label=Scroll Lock
-ScrollLockAction.action.description=Scroll lock
-ScrollLockAction.action.tooltip=Scroll Lock
-
-FailureRunView.tab.tooltip=Failures and Errors
-FailureRunView.tab.title=Failures
-FailureRunView.labelfmt= {0} - {1}
-
-FilterPatternsDialog.message.notempty=Filter must not be empty
-
-HierarchyRunView.tab.tooltip=Test Hierarchy
-HierarchyRunView.tab.title=Hierarchy
-
-JUnitPlugin.error.cannotshow=Could not show JUnit Result View
-JUnitPlugin.searching=Searching
-
-JUnitPreferencePage.description=JUnit settings:
-JUnitPreferencePage.addfilterbutton.label=Add &Filter
-JUnitPreferencePage.addfilterbutton.tooltip=Key in the Name of a New Stack Filter
-JUnitPreferencePage.addtypebutton.label=Add &Class...
-JUnitPreferencePage.addtypebutton.tooltip=Choose a Java Type and Add It to Stack Filters
-JUnitPreferencePage.addpackagebutton.label=Add &Packages...
-JUnitPreferencePage.addpackagebutton.tooltip=Choose Package(s) to Add to Stack Filters
-JUnitPreferencePage.removefilterbutton.label=&Remove
-JUnitPreferencePage.removefilterbutton.tooltip=Remove All Selected Stack Filters
-JUnitPreferencePage.enableallbutton.label=&Enable All
-JUnitPreferencePage.enableallbutton.tooltip=Enables All Stack Filters
-JUnitPreferencePage.disableallbutton.label=Disa&ble All
-JUnitPreferencePage.disableallbutton.tooltip=Disables All Stack Filters
-JUnitPreferencePage.filter.label=&Stack trace filter patterns (changes only apply to new test runs):
-JUnitPreferencePage.adddialog.title=Add Stack Filter Pattern
-JUnitPreferencePage.addialog.prompt=Enter Filter Pattern:
-JUnitPreferencePage.showcheck.label=Show the JUnit results &view only when an error or failure occurs
-JUnitPreferencePage.invalidstepfilterreturnescape=Invalid stack filter. Press Return to continue editing or Escape to cancel.  
-JUnitPreferencePage.addtypedialog.title=Add Class to Stack Filters
-JUnitPreferencePage.addtypedialog.message=&Select a class to filter in the failure stack trace.
-JUnitPreferencePage.addtypedialog.error.message=Could not open type selection dialog for stack filters.
-JUnitPreferencePage.addpackagedialog.title=Add Packages to Stack Filters
-JUnitPreferencePage.addpackagedialog.message=&Select a package to filter in the failure stack trace.
-JUnitPreferencePage.addpackagedialog.error.message=Could not open package selection dialog for stack filters.
-
-OpenEditorAction.action.label=&Go to File
-OpenEditorAction.error.cannotopen.title=Cannot Open Editor
-OpenEditorAction.error.cannotopen.message=Test class not found in project
-OpenEditorAction.error.dialog.title=Error
-OpenEditorAction.error.dialog.message=Could not open editor
-OpenEditorAction.message.cannotopen=Could not open editor
-
-OpenTestAction.error.title=Go To Test
-OpenTestAction.error.methodNoFound=Method ''{0}'' not found. Opening the test class.
-
-RerunAction.action.label=&Rerun
-
-TestRunnerViewPart.stopaction.text=Stop JUnit Test
-TestRunnerViewPart.stopaction.tooltip=Stop JUnit Test Run
-TestRunnerViewPart.rerunaction.label=Rerun last Test
-TestRunnerViewPart.rerunaction.tooltip=Rerun last Test
-TestRunnerViewPart.error.cannotrerun=Could not rerun test
-TestRunnerViewPart.message.terminated=Terminated
-TestRunnerViewPart.message.launching=Launching TestRunner
-TestRunnerViewPart.cannotrerun.title=Rerun Test
-TestRunnerViewPart.cannotrerurn.message=Can only rerun tests when they are launched under the debugger\nand when the \'keep JUnit running\' is set in the launch configuration.
-TestRunnerViewPart.message.cannotshow=Could not show JUnit Result View
-TestRunnerViewPart.label.failure=Failure Trace
-TestRunnerViewPart.message.finish= JUnit test run finished: {0} seconds (Errors: {1}, Failures: {2})
-TestRunnerViewPart.message.stopped= JUnit test run stopped after: {0} seconds
-TestRunnerViewPart.message.started= JUnit test run started: {0} - {1}
-TestRunnerViewPart.message.failure= {0}({1}) had a failure
-TestRunnerViewPart.message.error= {0}({1}) had an error
-TestRunnerViewPart.message.success= {0}({1}) was successful
-TestRunnerViewPart.title= JUnit ({0})
-TestRunnerViewPart.title_no_type=JUnit
-TestRunnerViewPart.toggle.vertical.label=&Vertical View Orientation
-TestRunnerViewPart.toggle.horizontal.label=&Horizontal View Orientation
-
-JUnitBaseLaunchConfiguration.error.invalidproject=Invalid project specified
-JUnitBaseLaunchConfiguration.error.novmrunner=Internal error: JRE {0} does not specify a VM Runner
-JUnitBaseLaunchConfiguration.error.notests=No tests found
-
-JUnitMainTab.label.oneTest=&Run a single test
-JUnitMainTab.label.project=&Project:
-JUnitMainTab.label.browse=&Browse...
-JUnitMainTab.label.test=T&est class:
-JUnitMainTab.label.search=&Search...
-JUnitMainTab.label.containerTest=Run &all tests in the selected project, package or source folder:
-JUnitMainTab.label.keeprunning=&Keep JUnit running after a test run when debugging
-JUnitMainTab.testdialog.title=Test Selection
-JUnitMainTab.testdialog.message=Choose a test case or test suite:
-JUnitMainTab.projectdialog.title=Project Selection
-JUnitMainTab.projectdialog.message=Choose a project to constrain the search for main types:
-JUnitMainTab.tab.label=Test
-JUnitMainTab.label.defaultpackage=(default package)
-JUnitMainTab.label.method=Test method: 
-JUnitMainTab.folderdialog.title=Folder Selection
-JUnitMainTab.folderdialog.message=Choose a Project, Source Folder or Package:
-JUnitMainTab.error.projectnotdefined=Project not specified
-JUnitMainTab.error.projectnotexists=Project does not exist
-JUnitMainTab.error.notJavaProject=Specified project is not a Java project
-JUnitMainTab.error.testnotdefined=Test not specified
-JUnitMainTab.error.testnotexists=Test class does not exist
-JUnitMainTab.error.invalidTest=Specified class is not a valid test class
-JUnitMainTab.error.noContainer=No project, source folder or package is specified 
-
-TestSearchEngine.message.searching=Searching suites
-LaunchTestAction.dialog.title=JUnit Launch
-LaunchTestAction.message.notests=No JUnit tests found.
-LaunchTestAction.dialog.title2=Test Selection
-LaunchTestAction.message.selectTestToRun=Select Test to debug
-LaunchTestAction.message.selectTestToDebug=Select Test to run
-LaunchTestAction.message.launchFailed=JUnit Launch Failed
-LaunchTestAction.message.selectConfiguration=Select a Test Configuration
-LaunchTestAction.message.selectDebugConfiguration=Select JUnit configuration to debug
-LaunchTestAction.message.selectRunConfiguration=Select JUnit configuration to run
-
-ShowNextFailureAction.label=Next Failure
-ShowNextFailureAction.tooltip=Next Failed Test
-ShowPreviousFailureAction.label=Previous Failure
-ShowPreviousFailureAction.tooltip=Previous Failed Test
-
-GotoReferencedTestAction.dialog.message=Select a method, type, or compilation unit to open tests that refer to them.
-GotoReferencedTestAction.dialog.title=Go to Test
-GotoReferencedTestAction.dialog.error.nomethod=Selection is not inside of a type or method.
-GotoReferencedTestAction.dialog.error=Test cannot be found
-GotoReferencedTestAction.selectdialog.title=Select Test
-GotoReferencedTestAction.dialog.select_message=Select a test that refers to ''{0}''.
-
-TestMethodSelectionDialog.error.title=Select Test
-TestMethodSelectionDialog.no_tests.title=Go to Test
-TestMethodSelectionDialog.error.notfound.title=Find Test
-TestMethodSelectionDialog.error.notfound.message=Could not find test
-TestMethodSelectionDialog.select_dialog.title=Select Test
-TestMethodSelectionDialog.dialog.title=Go to Referring Tests
-TestMethodSelectionDialog.notfound_message=No tests found that reference ''{0}''.
-TestMethodSelectionDialog.test_not_found=Cannot find ''{0}'' - make sure that JUnit is on the project's classpath.
-TestMethodSelectionDialog.testproject=Multiple projects contain ''{0}''. Select one project to be used when searching for tests.
-
-Resources.outOfSyncResources= Some resources are out of sync
-Resources.outOfSync= Resource ''{0}'' is out of sync with file system.
-Resources.modifiedResources= There are modified resources
-Resources.fileModified= File ''{0}'' has been modified since the beginning of the operation
-
-ExpandAllAction.text=Expand All
-ExpandAllAction.tooltip=Expand All Nodes
-JUnitAddLibraryProposal.info=Add the JUnit library to the project\'s build class path
-JUnitAddLibraryProposal.label=Add JUnit libraries
-
-CompareResultsAction.label=Compare Result
-CompareResultsAction.description=Compare the actual and expected test result
-CompareResultsAction.tooltip=Compare the actual and expected test result
-
-CompareResultDialog.title=Result Comparison
-CompareResultDialog.labelOK=OK
-CompareResultDialog.expectedLabel=Expected
-CompareResultDialog.actualLabel=Actual
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/ContainerComparator.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/ContainerComparator.java
deleted file mode 100644
index 477362d..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/ContainerComparator.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.launcher;
-
-import java.util.Comparator;
-
-public class ContainerComparator implements Comparator {
-
-    public int compare(Object o1, Object o2) {
-		String container1= (String)o1;
-		String container2= (String)o2;
-		if (container1 == null)
-			container1= ""; //$NON-NLS-1$
-		if (container2 == null)
-			container2= ""; //$NON-NLS-1$
-		return container1.compareTo(container2);
-    }
-}
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/util/IJUnitStatusConstants.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/util/IJUnitStatusConstants.java
deleted file mode 100644
index 7f3b293..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/util/IJUnitStatusConstants.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.util;
-
-public interface IJUnitStatusConstants {
-
-	// JUnit UI status constants start at 10000 to make sure that we don't
-	// collide with resource and java model constants.
-	
-	public static final int INTERNAL_ERROR= 10001;
-	
-	/**
-	 * Status constant indicating that an validateEdit call has changed the
-	 * content of a file on disk.
-	 */
-	public static final int VALIDATE_EDIT_CHANGED_CONTENT= 10003;
-	
-}
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/util/TestSearchEngine.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/util/TestSearchEngine.java
deleted file mode 100644
index cab1ecb..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/util/TestSearchEngine.java
+++ /dev/null
@@ -1,222 +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.jdt.internal.junit.util;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import org.eclipse.ui.IFileEditorInput;
-
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.ISourceReference;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchResultCollector;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.ISearchPattern;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitMessages;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-
-/**
- * Custom Search engine for suite() methods
- */
-public class TestSearchEngine {
-
-	private class JUnitSearchResultCollector implements IJavaSearchResultCollector {
-		IProgressMonitor fProgressMonitor;
-		List fList;
-		Set fFailed= new HashSet();
-		Set fMatches= new HashSet();
-		
-		public JUnitSearchResultCollector(List list, IProgressMonitor progressMonitor) {
-			fProgressMonitor= progressMonitor;
-			fList= list;
-		}
-		
-		public void accept(IResource resource, int start, int end, IJavaElement enclosingElement, int accuracy) throws JavaModelException{
-			if (!(enclosingElement instanceof IMethod)) 
-				return;
-			
-			IMethod method= (IMethod)enclosingElement;		
-			
-			IType declaringType= method.getDeclaringType();
-			if (fMatches.contains(declaringType) || fFailed.contains(declaringType))
-				return;
-			if (!hasSuiteMethod(declaringType) && !isTestType(declaringType)) {
-				fFailed.add(declaringType);
-				return;
-			}
-			fMatches.add(declaringType);
-		}
-		
-		public IProgressMonitor getProgressMonitor() {
-			return fProgressMonitor;
-		}
-				
-		public void aboutToStart() {
-		}
-		
-		public void done() {
-			fList.addAll(fMatches);
-		}
-	}
-	
-	private List searchMethod(IProgressMonitor pm, final IJavaSearchScope scope) throws JavaModelException {
-		final List typesFound= new ArrayList(200);	
-		searchMethod(typesFound, scope, pm);
-		return typesFound;	
-	}
-
-	private List searchMethod(final List v, IJavaSearchScope scope, final IProgressMonitor progressMonitor) throws JavaModelException {		
-		IJavaSearchResultCollector collector= new JUnitSearchResultCollector(v, progressMonitor);
-		ISearchPattern suitePattern= SearchEngine.createSearchPattern("suite() Test", IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, true); //$NON-NLS-1$
-		ISearchPattern testPattern= SearchEngine.createSearchPattern("test*() void", IJavaSearchConstants.METHOD , IJavaSearchConstants.DECLARATIONS, true); //$NON-NLS-1$
-		SearchEngine engine= new SearchEngine();
-		engine.search(ResourcesPlugin.getWorkspace(), SearchEngine.createOrSearchPattern(suitePattern, testPattern), scope, collector); 
-		return v;
-	}
-	
-	public static IType[] findTests(IRunnableContext context, final Object[] elements) throws InvocationTargetException, InterruptedException{
-		final Set result= new HashSet();
-	
-		if (elements.length > 0) {
-			IRunnableWithProgress runnable= new IRunnableWithProgress() {
-				public void run(IProgressMonitor pm) throws InterruptedException {
-					doFindTests(elements, result, pm);
-				}
-			};
-			context.run(true, true, runnable);			
-		}
-		return (IType[]) result.toArray(new IType[result.size()]) ;
-	}
-
-	public static void doFindTests(Object[] elements, Set result, IProgressMonitor pm) throws InterruptedException {
-		int nElements= elements.length;
-		pm.beginTask(JUnitMessages.getString("TestSearchEngine.message.searching"), nElements);  //$NON-NLS-1$
-		try {
-			for (int i= 0; i < nElements; i++) {
-				try {
-					collectTypes(elements[i], new SubProgressMonitor(pm, 1), result);
-				} catch (JavaModelException e) {
-					JUnitPlugin.log(e.getStatus());
-				}
-				if (pm.isCanceled()) {
-					throw new InterruptedException();
-				}
-			}
-		} finally {
-			pm.done();
-		}
-	}
-
-	private static void collectTypes(Object element, IProgressMonitor pm, Set result) throws JavaModelException/*, InvocationTargetException*/ {
-		element= computeScope(element);
-		while((element instanceof IJavaElement) && !(element instanceof ICompilationUnit) && (element instanceof ISourceReference)) {
-			if(element instanceof IType) {
-				if (hasSuiteMethod((IType)element) || isTestType((IType)element)) {
-					result.add(element);
-					return;
-				}
-			}
-			element= ((IJavaElement)element).getParent();
-		}
-		if (element instanceof ICompilationUnit) {
-			ICompilationUnit cu= (ICompilationUnit)element;
-			IType[] types= cu.getAllTypes();
-			for (int i= 0; i < types.length; i++) {
-				if (hasSuiteMethod(types[i])  || isTestType(types[i]))
-					result.add(types[i]);
-			}
-		} 
-		else if (element instanceof IJavaElement) {
-			List found= searchSuiteMethods(pm, (IJavaElement)element);
-			result.addAll(found);
-		}
-	}
-
-	private static Object computeScope(Object element) throws JavaModelException {
-		if (element instanceof IFileEditorInput)
-			element= ((IFileEditorInput)element).getFile();
-		if (element instanceof IResource)
-			element= JavaCore.create((IResource)element);
-		if (element instanceof IClassFile) {
-			IClassFile cf= (IClassFile)element;
-			element= cf.getType();
-		}
-		return element;
-	}
-	
-	private static List searchSuiteMethods(IProgressMonitor pm, IJavaElement element) throws JavaModelException {	
-		IJavaSearchScope scope= SearchEngine.createJavaSearchScope(new IJavaElement[] { element });
-		TestSearchEngine searchEngine= new TestSearchEngine(); 
-		return searchEngine.searchMethod(pm, scope);
-	}
-		
-	public static boolean hasSuiteMethod(IType type) throws JavaModelException {
-		IMethod method= type.getMethod("suite", new String[0]); //$NON-NLS-1$
-		if (method == null || !method.exists()) 
-			return false;
-		
-		if (!Flags.isStatic(method.getFlags()) ||	
-			!Flags.isPublic(method.getFlags()) ||			
-			!Flags.isPublic(method.getDeclaringType().getFlags())) { 
-			return false;
-		}
-		return true;
-	}
-	
-	private static boolean isTestType(IType type) throws JavaModelException {
-		if (Flags.isAbstract(type.getFlags())) 
-			return false;
-		if (!Flags.isPublic(type.getFlags())) 
-			return false;
-		
-		IType[] interfaces= type.newSupertypeHierarchy(null).getAllSuperInterfaces(type);
-		for (int i= 0; i < interfaces.length; i++)
-			if(interfaces[i].getFullyQualifiedName().equals(JUnitPlugin.TEST_INTERFACE_NAME))
-				return true;
-		return false;
-	}
-
-	public static boolean isTestImplementor(IType type) throws JavaModelException {
-		ITypeHierarchy typeHier= type.newSupertypeHierarchy(null);
-		IType[] superInterfaces= typeHier.getAllInterfaces();
-		for (int i= 0; i < superInterfaces.length; i++) {
-			if (superInterfaces[i].getFullyQualifiedName().equals(JUnitPlugin.TEST_INTERFACE_NAME))
-				return true;
-		}
-		return false;
-	}
-
-	public static boolean isTestOrTestSuite(IType type) throws JavaModelException {
-		return hasSuiteMethod(type) || isTestType(type);
-	}
-}
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/ITestRunListener.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/ITestRunListener.java
deleted file mode 100644
index 97a7d3c..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/ITestRunListener.java
+++ /dev/null
@@ -1,109 +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.jdt.junit;
-  
-/**
- * A listener interface for observing the execution of a test run.
- * <p>
- * Clients contributing to the 
- * <code>org.eclipse.jdt.junit.testRunListener</code>
- * extension point implement this interface.
- * </p>
- * 
- * @since 2.1
- */
- public interface ITestRunListener {
-	/**
-   	 * Status constant indicating that a test passed (constant value 0).
- 	 * 
-     * @see #testFailed
- 	 */
- 	public static final int STATUS_OK= 0;
- 	/**
-	 * Status constant indicating that a test had an error an unanticipated
-	 * exception (constant value 1).
- 	 * 
-	 * @see #testFailed
- 	 */
- 	public static final int STATUS_ERROR= 1;
- 	/**
-	 * Status constant indicating that a test failed an assertion
-	 * (constant value 2).
- 	 * 
- 	 * @see #testFailed
-	 */
- 	public static final int STATUS_FAILURE= 2;
- 	/**
- 	 * A test run has started.
- 	 * 
- 	 * @param testCount the number of individual tests that will be run
- 	 */
-	public void testRunStarted(int testCount);
-	/**
- 	 * A test run has ended.
-	 *
-	 * @param elapsedTime the total elapsed time of the test run
-	 */
-	public void testRunEnded(long elapsedTime);
-	/**
-	 * A test run has been stopped prematurely.
-	 *
- 	 * @param elapsedTime the time elapsed before the test run was stopped
-	 */
-	public void testRunStopped(long elapsedTime);
-	/**
-	 * An individual test has started.
-	 * 
-	 * @param testId a unique Id identifying the test
-	 * @param testName the name of the test that started
-	 */
-	public void testStarted(String testId, String testName);
-	/**
-	 * An individual test has ended.
-	 * 
-	 * @param testId a unique Id identifying the test
-	 * @param testName the name of the test that ended
-	 */
-	public void testEnded(String testId, String testName);
-	/**
-	 * An individual test has failed with a stack trace.
-	 * 
-	 * @param testId a unique Id identifying the test
- 	 * @param testName the name of the test that failed
-	 * @param status the outcome of the test; one of 
-	 * {@link #STATUS_ERROR STATUS_ERROR} or
-	 * {@link #STATUS_FAILURE STATUS_FAILURE}
-	 * @param trace the stack trace
-	 */
-	public void testFailed(int status, String testId, String testName, String trace);	
-			
-	/**
-	 * The VM instance performing the tests has terminated.
-	 */
-	public void testRunTerminated();
-	
-	/**
- 	 * An individual test has been rerun.
-	 * 
-	 * @param testId a unique Id identifying the test
-	 * @param testClass the name of the test class that was rerun
-	 * @param testName the name of the test that was rerun
-	 * @param status the outcome of the test that was rerun; one of 
-	 * {@link #STATUS_OK STATUS_OK}, {@link #STATUS_ERROR STATUS_ERROR},
-	 * or {@link #STATUS_FAILURE STATUS_FAILURE}
-	 * @param trace the stack trace in the case of abnormal termination,
-	 * or the empty string if none
-	 */
-	public void testReran(String testId, String testClass, String testName, int status, String trace);
-}
-
-
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/JUnitCore.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/JUnitCore.java
deleted file mode 100644
index 7b5cbbc..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/JUnitCore.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.jdt.junit;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-
-/**
- * Class for accessing JUnit support; all functionality is provided by 
- * static methods.
- * </p>
- * 
- * @since 2.1
- */
-public class JUnitCore {
-
-	/**
-	 * Adds a listener for test runs.
-	 * 
-	 * @param listener listener to be added
-	 */
-	public static void addTestRunListener(ITestRunListener listener) {
-		JUnitPlugin.getDefault().addTestRunListener(listener);
-	}
-
-	/**
-	 * Removes a listener for test runs.
-	 * 
-	 * @param listener listener to be removed
-	 */
-	public static void removeTestRunListener(ITestRunListener listener) {
-		JUnitPlugin.getDefault().removeTestRunListener(listener);
-	}
-}
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/package.html b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/package.html
deleted file mode 100644
index 63db8cf..0000000
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/junit/package.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Application programming interfaces for interaction
-with the Eclipse Java Development Tools JUnit support.
-<h2>
-Package Specification</h2>
-An API to track the execution of a JUnit test run.
-</body>
-</html>
diff --git a/org.eclipse.jdt.junit.runtime/.classpath b/org.eclipse.jdt.junit.runtime/.classpath
deleted file mode 100644
index 275b34c..0000000
--- a/org.eclipse.jdt.junit.runtime/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src/"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.junit.runtime/.cvsignore b/org.eclipse.jdt.junit.runtime/.cvsignore
deleted file mode 100644
index fe99505..0000000
--- a/org.eclipse.jdt.junit.runtime/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-
diff --git a/org.eclipse.jdt.junit.runtime/.project b/org.eclipse.jdt.junit.runtime/.project
deleted file mode 100644
index 8d1f69a..0000000
--- a/org.eclipse.jdt.junit.runtime/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt.junit.runtime</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.junit</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.jdt.junit.runtime/.template b/org.eclipse.jdt.junit.runtime/.template
deleted file mode 100644
index f3bcd41..0000000
--- a/org.eclipse.jdt.junit.runtime/.template
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<form>
-   <p/><p><b>Tips on working with this plug-in project</b></p><li>For the view of the new plug-in at a glance, go to the <img href="pageImage"/><a href="OverviewPage">Overview</a>.</li><li>You can test the contributions of this plug-in by launching another instance of the workbench. On the <b>Run</b> menu, click <b>Run As</b> and choose <img href="runTimeWorkbenchImage"/><a href="action.run">Run-time Workbench</a> from the available choices.</li><li>You can add more functionality to this plug-in by adding extensions using the <a href="action.newExtension">New Extension Wizard</a>.</li><li>The plug-in project contains Java code that you can debug. Place breakpoints in Java classes. On the <b>Run</b> menu, select <b>Debug As</b> and choose <img href="runTimeWorkbenchImage"/><a href="action.debug">Run-time Workbench</a> from the available choices.</li>
-</form>
diff --git a/org.eclipse.jdt.junit.runtime/about.html b/org.eclipse.jdt.junit.runtime/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/org.eclipse.jdt.junit.runtime/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/org.eclipse.jdt.junit.runtime/build.properties b/org.eclipse.jdt.junit.runtime/build.properties
deleted file mode 100644
index 7d547d4..0000000
--- a/org.eclipse.jdt.junit.runtime/build.properties
+++ /dev/null
@@ -1,18 +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.junitruntime.jar = src/
-
-bin.includes = plugin.xml,\
-               about.html,\
-               plugin.properties,\
-               *.jar
-
-src.includes = about.html
diff --git a/org.eclipse.jdt.junit.runtime/plugin.properties b/org.eclipse.jdt.junit.runtime/plugin.properties
deleted file mode 100644
index 9676024..0000000
--- a/org.eclipse.jdt.junit.runtime/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=Java Development Tools JUnit runtime support
-providerName=Eclipse.org
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit.runtime/plugin.xml b/org.eclipse.jdt.junit.runtime/plugin.xml
deleted file mode 100644
index 4c05bfe..0000000
--- a/org.eclipse.jdt.junit.runtime/plugin.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jdt.junit.runtime"
-   name="%pluginName"
-   version="3.0.0"
-   provider-name="%providerName">
-
-   <runtime>
-      <library name="junitruntime.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-		<import plugin="org.junit"/>
-		<import plugin="org.eclipse.core.runtime.compatibility" optional="true"/>
-   </requires>
-</plugin>
diff --git a/org.eclipse.jdt.junit.runtime/scripts/exportplugin.xml b/org.eclipse.jdt.junit.runtime/scripts/exportplugin.xml
deleted file mode 100644
index 40b2b64..0000000
--- a/org.eclipse.jdt.junit.runtime/scripts/exportplugin.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!-- build script to create JUnit Plugin -->
-<project name="org.eclipse.jdt.junit.runtime" default="export" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.jdt.junit.runtime" />
-		<property name="version"  value="_3.0.0" />
-		<property name="dest"  value="${destdir}/${plugin}${version}" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		
-		<jar 
-			jarfile="${dest}/junitruntime.jar"
-			basedir="bin"
-		/>
-				
-		<jar 		
-			jarfile="${dest}/junitruntimesrc.jar"
-			basedir="src"
-		/>
-		
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<copy file="about.html" todir="${dest}"/>
-	</target>
-</project>
diff --git a/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/JUnitMessages.java b/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/JUnitMessages.java
deleted file mode 100644
index a1173a8..0000000
--- a/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/JUnitMessages.java
+++ /dev/null
@@ -1,49 +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.jdt.internal.junit.runner;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class JUnitMessages {
-
-	private static final String BUNDLE_NAME= "org.eclipse.jdt.internal.junit.runner.JUnitMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE= ResourceBundle.getBundle(BUNDLE_NAME);
-
-	private JUnitMessages() {
-	}
-
-	/**
-	 * Gets a string from the resource bundle and formats it with the argument
-	 * 
-	 * @param key	the string used to get the bundle value, must not be null
-	 */
-	public static String getFormattedString(String key, Object arg) {
-		return MessageFormat.format(getString(key), new Object[] { arg });
-	}
-
-	/**
-	 * Gets a string from the resource bundle and formats it with arguments
-	 */	
-	public static String getFormattedString(String key, Object[] args) {
-		return MessageFormat.format(getString(key), args);
-	}
-
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/JUnitMessages.properties b/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/JUnitMessages.properties
deleted file mode 100644
index 1f4944f..0000000
--- a/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/JUnitMessages.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
-###############################################################################
-
-RemoteTestRunner.error.classnotfound= Class not found {0}
-RemoteTestRunner.error.exception= "Error:  " {0}
-RemoteTestRunner.error.invoke= Failed to invoke suite(): {0}
-RemoteTestRunner.error.load= Could not reload Test: {0}
-RemoteTestRunner.error.connect= Could not connect to: {0} : {1}			
-RemoteTestRunner.error.classnamemissing=Error: parameter '-classNames' or '-className' not specified
-RemoteTestRunner.error.portmissing=Error: parameter '-port' not specified
-RemoteTestRunner.error.notestreturn=setUpTest should return junit.framework.Test
-RemoteTestRunner.error.shouldbepublic=setUpTest should be public
-RemoteTestRunner.error.shouldbestatic=setUpTest should be static
-RemoteTestRunner.error.nullreturn=setUpTest returned null
-RemoteTestRunner.error.couldnotinvoke=setUpTest could not invoke setup: {0}
-RemoteTestRunner.error.invocationexception=setUpTest invocation exception: {0}
-RemoteTestRunner.error.couldnotcreate=Could not create test: 
-
diff --git a/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/MessageIds.java b/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/MessageIds.java
deleted file mode 100644
index 03a85d6..0000000
--- a/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/MessageIds.java
+++ /dev/null
@@ -1,124 +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.jdt.internal.junit.runner;
-
-/**
- * Message identifiers for messages sent by the
- * RemoteTestRunner. 
- * 
- * @see RemoteTestRunner
- */
-public class MessageIds { 
-	/**
-	 * The header length of a message, all messages
-	 * have a fixed header length
-	 */
-	public static final int MSG_HEADER_LENGTH= 8;
-	
-	/**
-	 * Notification that a test trace has started.
-	 * The end of the trace is signaled by a TRACE_END
-	 * message. In between the TRACE_START and TRACE_END
-	 * the stack trace is submitted as multiple lines.
-	 */
-	public static final String TRACE_START= "%TRACES "; //$NON-NLS-1$
-	/**
-	 * Notification that a trace ends.
-	 */
-	public static final String TRACE_END=   "%TRACEE "; //$NON-NLS-1$
-	/**
-	 * Notification that the expected result has started.
-	 * The end of the expected result is signaled by a Trace_END.
-	 */
-	public static final String EXPECTED_START= "%EXPECTS"; //$NON-NLS-1$
-	/**
-	 * Notification that an expected result ends.
-	 */
-	public static final String EXPECTED_END=   "%EXPECTE"; //$NON-NLS-1$
-	/**
-	 * Notification that the expected result has started.
-	 * The end of the expected result is signaled by a Trace_END.
-	 */
-	public static final String ACTUAL_START= "%ACTUALS"; //$NON-NLS-1$
-	/**
-	 * Notification that an expected result ends.
-	 */
-	public static final String ACTUAL_END=   "%ACTUALE"; //$NON-NLS-1$
-	/**
-	 * Notification that a trace for a reran test has started.
-	 * The end of the trace is signaled by a RTrace_END
-	 * message.
-	 */
-	public static final String RTRACE_START= "%RTRACES"; //$NON-NLS-1$
-	/**
-	 * Notification that a trace of a reran trace ends.
-	 */
-	public static final String RTRACE_END=  "%RTRACEE"; //$NON-NLS-1$
-	/**
-	 * Notification that a test run has started. 
-	 * MessageIds.TEST_RUN_START+testCount.toString+" "+version
-	 */
-	public static final String TEST_RUN_START=  "%TESTC  "; //$NON-NLS-1$
-	/**
-	 * Notification that a test has started.
-	 * MessageIds.TEST_START + testID + "," + testName
-	 */
-	public static final String TEST_START=  "%TESTS  ";		 //$NON-NLS-1$
-	/**
-	 * Notification that a test has started.
-	 * TEST_END + testID + "," + testName
-	 */
-	public static final String TEST_END=    "%TESTE  ";		 //$NON-NLS-1$
-	/**
-	 * Notification that a test had a error.
-	 * TEST_ERROR + testID + "," + testName.
-	 * After the notification follows the stack trace.
-	 */
-	public static final String TEST_ERROR=  "%ERROR  ";		 //$NON-NLS-1$
-	/**
-	 * Notification that a test had a failure.
-	 * TEST_FAILED + testID + "," + testName.
-	 * After the notification follows the stack trace.
-	 */
-	public static final String TEST_FAILED= "%FAILED ";	 //$NON-NLS-1$
-	/**
-	 * Notification that a test run has ended.
-	 * TEST_RUN_END+elapsedTime.toString().
-	 */ 	
-	public static final String TEST_RUN_END="%RUNTIME";	 //$NON-NLS-1$
-	/**
-	 * Notification that a test run was successfully stopped.
-	 */ 
-	public static final String TEST_STOPPED="%TSTSTP "; //$NON-NLS-1$
-	/**
-	 * Notification that a test was reran.
-	 * TEST_RERAN+testId+" "+testClass+" "+testName+STATUS.
-	 * Status = "OK" or "FAILURE".
-	 */ 
-	public static final String TEST_RERAN=  "%TSTRERN"; //$NON-NLS-1$
-	/**
-	 * Notification about a test inside the test suite.
-	 * TEST_TREE+ testId"," + testName","isSuite","testcount
-	 * isSuite = "true" or "false"
-	 */ 
-	public static final String TEST_TREE="%TSTTREE"; //$NON-NLS-1$
-	/**
-	 * Request to stop the current test run.
-	 */
-	public static final String TEST_STOP=	">STOP   "; //$NON-NLS-1$
-	/**
-	 * Request to rerun a test.
-	 * TEST_RERUN+testId+" "+ClassName+" "+testName
-	 */
-	public static final String TEST_RERUN=	">RERUN  "; //$NON-NLS-1$
-}
-
-
diff --git a/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/RemoteTestRunner.java b/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/RemoteTestRunner.java
deleted file mode 100644
index a0edddd..0000000
--- a/org.eclipse.jdt.junit.runtime/src/org/eclipse/jdt/internal/junit/runner/RemoteTestRunner.java
+++ /dev/null
@@ -1,798 +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
- *     Sebastian Davids: sdavids@gmx.de bug 26754 
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.runner;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.net.Socket;
-import java.util.Vector;
-
-import junit.extensions.TestDecorator;
-import junit.framework.AssertionFailedError;
-import junit.framework.ComparisonFailure;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestFailure;
-import junit.framework.TestListener;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-/**
- * A TestRunner that reports results via a socket connection.
- * See MessageIds for more information about the protocl.
- */
-public class RemoteTestRunner implements TestListener {
-	/**
-	 * Holder for information for a rerun request
-	 */
-	private static class RerunRequest {
-		String fRerunClassName;
-		String fRerunTestName;
-		int fRerunTestId;
-		
-		public RerunRequest(int testId, String className, String testName) {
-			fRerunTestId= testId;
-			fRerunClassName= className;
-			fRerunTestName= testName;
-		}
-
-	}
-	
-	private static final String SET_UP_TEST_METHOD_NAME= "setUpTest"; //$NON-NLS-1$
-	
-	private static final String SUITE_METHODNAME= "suite";	 //$NON-NLS-1$
-	
-	/**
-	 * The name of the test classes to be executed
-	 */
-	private String[] fTestClassNames;
-	/**
-	 * The name of the test (argument -test)
-	 */
-	private String fTestName;
-	/**
-	 * The current test result
-	 */
-	private TestResult fTestResult;
-
-	/**
-	 * The version expected by the client
-	 */
-	private String fVersion= "";
-	
-	/**
-	 * The client socket.
-	 */
-	private Socket fClientSocket;
-	/**
-	 * Print writer for sending messages
-	 */
-	private PrintWriter fWriter;
-	/**
-	 * Reader for incoming messages
-	 */
-	private BufferedReader fReader;
-	/**
-	 * Host to connect to, default is the localhost
-	 */
-	private String fHost= ""; //$NON-NLS-1$
-	/**
-	 * Port to connect to.
-	 */
-	private int fPort= -1;
-	/**
-	 * Is the debug mode enabled?
-	 */
-	private boolean fDebugMode= false;	
-	/**
-	 * Keep the test run server alive after a test run has finished.
-	 * This allows to rerun tests.
-	 */
-	private boolean fKeepAlive= false;
-	/**
-	 * Has the server been stopped
-	 */
-	private boolean fStopped= false;
-	/**
-	 * Queue of rerun requests.
-	 */
-	private Vector fRerunRequests= new Vector(10);
-	/**
-	 * Thread reading from the socket
-	 */
-	private ReaderThread fReaderThread;
-	/**
-	 * Reader thread that processes messages from the client.
-	 */
-	private class ReaderThread extends Thread {
-		public ReaderThread() {
-			super("ReaderThread"); //$NON-NLS-1$
-		}
-
-		public void run(){
-			try { 
-				String message= null; 
-				while (true) { 
-					if ((message= fReader.readLine()) != null) {
-						
-						if (message.startsWith(MessageIds.TEST_STOP)){
-							fStopped= true;
-							RemoteTestRunner.this.stop();
-							synchronized(RemoteTestRunner.this) {
-								RemoteTestRunner.this.notifyAll();
-							}
-							break;
-						}
-						
-						else if (message.startsWith(MessageIds.TEST_RERUN)) {
-							String arg= message.substring(MessageIds.MSG_HEADER_LENGTH);
-							//format: testId className testName
-							int c0= arg.indexOf(' '); //$NON-NLS-1$
-							int c1= arg.indexOf(' ', c0+1);
-							String s= arg.substring(0, c0);
-							int testId= Integer.parseInt(s);
-							String className= arg.substring(c0+1, c1);
-							String testName= arg.substring(c1+1, arg.length());
-							synchronized(RemoteTestRunner.this) {
-								fRerunRequests.add(new RerunRequest(testId, className, testName));
-								RemoteTestRunner.this.notifyAll();
-							}
-						}
-					}
-				} 
-			} catch (Exception e) {
-				RemoteTestRunner.this.stop();
-			}
-		}
-	}	
-	
-	/** 
-	 * The main entry point.
-	 * Parameters<pre>
-	 * -classnames: the name of the test suite class
-	 * -testfilename: the name of a file containing classnames of test suites
-	 * -test: the test method name (format classname testname) 
-	 * -host: the host to connect to default local host 
-	 * -port: the port to connect to, mandatory argument 
-	 * -keepalive: keep the process alive after a test run
-     * </pre>
-     */
-	public static void main(String[] args) {
-		RemoteTestRunner testRunServer= new RemoteTestRunner();
-		testRunServer.init(args);
-		testRunServer.run();
-		// fix for 14434
-		System.exit(0);
-	}
-	
-	/**
-	 * Parse command line arguments. Hook for subclasses to process
-	 * additional arguments.
-	 */
-	protected void init(String[] args) {
-		defaultInit(args);		
-	}	
-	
-	/**
-	 * The class loader to be used for loading tests.
-	 * Subclasses may override to use another class loader.
-	 */
-	protected ClassLoader getClassLoader() {
-		return getClass().getClassLoader();
-	}
-	
-	/**
-	 * Process the default arguments.
-	 */
-	protected final void defaultInit(String[] args) {
-		for(int i= 0; i < args.length; i++) {
-			if(args[i].toLowerCase().equals("-classnames") || args[i].toLowerCase().equals("-classname")){ //$NON-NLS-1$ //$NON-NLS-2$
-				Vector list= new Vector();
-				for (int j= i+1; j < args.length; j++) {
-					if (args[j].startsWith("-")) //$NON-NLS-1$
-						break;
-					list.add(args[j]);
-				}
-				fTestClassNames= (String[]) list.toArray(new String[list.size()]);
-			}	
-			else if(args[i].toLowerCase().equals("-test")) { //$NON-NLS-1$
-				String testName= args[i+1];
-				int p= testName.indexOf(':');
-				if (p == -1)
-					throw new IllegalArgumentException("Testname not separated by \'%\'"); //$NON-NLS-1$
-				fTestName= testName.substring(p+1);
-				fTestClassNames= new String[]{ testName.substring(0, p)  };
-				i++;
-			}			
-			else if(args[i].toLowerCase().equals("-testnamefile")) { //$NON-NLS-1$
-				String testNameFile= args[i+1];
-				try {
-					readTestNames(testNameFile);
-				} catch (IOException e) {
-					throw new IllegalArgumentException("Cannot read testname file.");		 //$NON-NLS-1$
-				}
-				i++;
-			
-			} else if(args[i].toLowerCase().equals("-port")) { //$NON-NLS-1$
-				fPort= Integer.parseInt(args[i+1]);
-				i++;
-			}
-			else if(args[i].toLowerCase().equals("-host")) { //$NON-NLS-1$
-				fHost= args[i+1];
-				i++;
-			}
-			else if(args[i].toLowerCase().equals("-keepalive")) { //$NON-NLS-1$
-				fKeepAlive= true;
-			}
-			else if(args[i].toLowerCase().equals("-debugging") || args[i].toLowerCase().equals("-debug")){ //$NON-NLS-1$ //$NON-NLS-2$
-			    fDebugMode= true;
-			}
-			else if(args[i].toLowerCase().equals("-version")){ //$NON-NLS-1$
-			    fVersion= args[i+1];
-			    i++;
-			}
-		}
-		if(fTestClassNames == null || fTestClassNames.length == 0)
-			throw new IllegalArgumentException(JUnitMessages.getString("RemoteTestRunner.error.classnamemissing")); //$NON-NLS-1$
-
-		if (fPort == -1)
-			throw new IllegalArgumentException(JUnitMessages.getString("RemoteTestRunner.error.portmissing")); //$NON-NLS-1$
-		if (fDebugMode)
-			System.out.println("keepalive "+fKeepAlive); //$NON-NLS-1$
-	}
-
-	private void readTestNames(String testNameFile) throws IOException {
-		BufferedReader br= new BufferedReader(new FileReader(new File(testNameFile)));
-		try {
-			String line;
-			Vector list= new Vector();
-			while ((line= br.readLine()) != null) {
-				list.add(line);
-			}
-			fTestClassNames= (String[]) list.toArray(new String[list.size()]);
-		}
-		finally {
-			br.close();
-		}
-		if (fDebugMode) {
-			System.out.println("Tests:"); //$NON-NLS-1$
-			for (int i= 0; i < fTestClassNames.length; i++) {
-				System.out.println("    "+fTestClassNames[i]); //$NON-NLS-1$
-			}
-		}
-	}
-
-	
-	/**
-	 * Connects to the remote ports and runs the tests.
-	 */
-	protected void run() {
-		if (!connect())
-			return;
-			
-		fTestResult= new TestResult();
-		fTestResult.addListener(this);
-		runTests(fTestClassNames, fTestName);
-		fTestResult.removeListener(this);
-		
-		if (fTestResult != null) {
-			fTestResult.stop();
-			fTestResult= null;
-		}
-		if (fKeepAlive)
-			waitForReruns();
-			
-		shutDown();
-		
-	}
-
-	/**
-	 * Waits for rerun requests until an explicit stop request
-	 */
-	private synchronized void waitForReruns() {
-		while (!fStopped) {
-			try {
-				wait();
-				if (!fStopped && fRerunRequests.size() > 0) {
-					RerunRequest r= (RerunRequest)fRerunRequests.remove(0);
-					rerunTest(r.fRerunTestId, r.fRerunClassName, r.fRerunTestName);
-				}
-			} catch (InterruptedException e) {
-			}
-		}
-	}
-	
-	/**
-	 * Returns the Test corresponding to the given suite. 
-	 */
-	private Test getTest(String suiteClassName, String testName) {
-		Class testClass= null;
-		try {
-			testClass= loadSuiteClass(suiteClassName);
-		} catch (ClassNotFoundException e) {
-			String clazz= e.getMessage();
-			if (clazz == null) 
-				clazz= suiteClassName;
-			runFailed(JUnitMessages.getFormattedString("RemoteTestRunner.error.classnotfound", clazz)); //$NON-NLS-1$
-			return null;
-		} catch(Exception e) {
-			runFailed(JUnitMessages.getFormattedString("RemoteTestRunner.error.exception", e )); //$NON-NLS-1$
-			return null;
-		}
-		if (testName != null) {
-			return setupTest(testClass, createTest(testName, testClass));
-		}
-		Method suiteMethod= null;
-		try {
-			suiteMethod= testClass.getMethod(SUITE_METHODNAME, new Class[0]);
-	 	} catch(Exception e) {
-	 		// try to extract a test suite automatically
-			return new TestSuite(testClass);
-		}
-		Test test= null;
-		try {
-			test= (Test)suiteMethod.invoke(null, new Class[0]); // static method
-		} 
-		catch (InvocationTargetException e) {
-			runFailed(JUnitMessages.getFormattedString("RemoteTestRunner.error.invoke", e.getTargetException().toString() )); //$NON-NLS-1$
-			return null;
-		}
-		catch (IllegalAccessException e) {
-			runFailed(JUnitMessages.getFormattedString("RemoteTestRunner.error.invoke", e.toString() )); //$NON-NLS-1$
-			return null;
-		}
-		return test;
-	}
-
-	protected void runFailed(String message) {
-		System.err.println(message);
-	}
-	
-	/**
-	 * Loads the test suite class.
-	 */
-	private Class loadSuiteClass(String className) throws ClassNotFoundException {
-		if (className == null) 
-			return null;
-		return getClassLoader().loadClass(className);
-	}
-			
-	/**
-	 * Runs a set of tests.
-	 */
-	private void runTests(String[] testClassNames, String testName) {
-		// instantiate all tests
-		Test[] suites= new Test[testClassNames.length];
-		
-		for (int i= 0; i < suites.length; i++) {
-			suites[i]= getTest(testClassNames[i], testName);
-		}
-		
-		// count all testMethods and inform ITestRunListeners		
-		int count= countTests(suites);
-		notifyTestRunStarted(count);
-		
-		if (count == 0) {
-			notifyTestRunEnded(0);
-			return;
-		}
-		
-		long startTime= System.currentTimeMillis();
-		if (fDebugMode)
-			System.out.print("start send tree..."); //$NON-NLS-1$
-		for (int i= 0; i < suites.length; i++) {
-			sendTree(suites[i]);
-		}
-		if (fDebugMode)
-			System.out.println("done send tree - time(ms): "+(System.currentTimeMillis()-startTime)); //$NON-NLS-1$
-
-		long testStartTime= System.currentTimeMillis();
-		for (int i= 0; i < suites.length; i++) {
-			suites[i].run(fTestResult);
-		}
-		// inform ITestRunListeners of test end
-		if (fTestResult == null || fTestResult.shouldStop())
-			notifyTestRunStopped(System.currentTimeMillis() - testStartTime);
-		else
-			notifyTestRunEnded(System.currentTimeMillis() - testStartTime);
-	}
-	
-	private int countTests(Test[] tests) {
-		int count= 0;
-		for (int i= 0; i < tests.length; i++) {
-			if (tests[i] != null)
-				count= count + tests[i].countTestCases();
-		}
-		return count;
-	}
-	
-	/**
-	 * Reruns a test as defined by the fully qualified class name and
-	 * the name of the test.
-	 */
-	public void rerunTest(int testId, String className, String testName) {
-		Test reloadedTest= null;
-		Class reloadedTestClass= null;
-		try {
-			reloadedTestClass= getClassLoader().loadClass(className);
-			reloadedTest= createTest(testName, reloadedTestClass);
-		} catch(Exception e) {
-			reloadedTest= warning(JUnitMessages.getFormattedString("RemoteTestRunner.error.couldnotcreate", testName));  //$NON-NLS-1$ 
-		}
-		Test rerunTest= setupTest(reloadedTestClass, reloadedTest);
-		TestResult result= new TestResult();
-		rerunTest.run(result);
-		notifyTestReran(result, Integer.toString(testId), className, testName);
-	}
-
-	/**
-	 * Prepare a single test to be run standalone. If the test case class provides
-	 * a static method Test setUpTest(Test test) then this method will be invoked.
-	 * Instead of calling the test method directly the "decorated" test returned from
-	 * setUpTest will be called. The purpose of this mechanism is to enable
-	 * tests which requires a set-up to be run individually.
-	 */
-	private Test setupTest(Class reloadedTestClass, Test reloadedTest) {
-		Method setup= null;
-		try {
-			setup= reloadedTestClass.getMethod(SET_UP_TEST_METHOD_NAME, new Class[] {Test.class});
-		} catch (SecurityException e1) {
-			return reloadedTest;
-		} catch (NoSuchMethodException e) {
-			return reloadedTest;
-		}
-		if (setup.getReturnType() != Test.class)
-			return warning(JUnitMessages.getString("RemoteTestRunner.error.notestreturn")); //$NON-NLS-1$
-		if (!Modifier.isPublic(setup.getModifiers()))
-			return warning(JUnitMessages.getString("RemoteTestRunner.error.shouldbepublic"));  //$NON-NLS-1$
-		if (!Modifier.isStatic(setup.getModifiers()))
-			return warning(JUnitMessages.getString("RemoteTestRunner.error.shouldbestatic"));  //$NON-NLS-1$
-		try {
-			Test test= (Test)setup.invoke(null, new Object[] {reloadedTest});
-			if (test == null)
-				return warning(JUnitMessages.getString("RemoteTestRunner.error.nullreturn")); //$NON-NLS-1$
-			return test;
-		} catch (IllegalArgumentException e) {
-			return warning(JUnitMessages.getFormattedString("RemoteTestRunner.error.couldnotinvoke", e)); //$NON-NLS-1$
-		} catch (IllegalAccessException e) {
-			return warning(JUnitMessages.getFormattedString("RemoteTestRunner.error.couldnotinvoke", e)); //$NON-NLS-1$
-		} catch (InvocationTargetException e) {
-			return warning(JUnitMessages.getFormattedString("RemoteTestRunner.error.invocationexception", e.getTargetException())); //$NON-NLS-1$
-		} 
-	}
-
-	/**
-	 * Returns a test which will fail and log a warning message.
-	 */
-	 private Test warning(final String message) {
-		return new TestCase("warning") { //$NON-NLS-1$
-			protected void runTest() {
-				fail(message);
-			}
-		};		
-	}
-
-	private Test createTest(String testName, Class testClass) {
-		Class[] classArgs= { String.class };
-		Test test;
-		Constructor constructor= null;
-		try {
-			try {
-				constructor= testClass.getConstructor(classArgs);
-				test= (Test)constructor.newInstance(new Object[]{testName});
-			} catch (NoSuchMethodException e) {
-				// try the no arg constructor supported in 3.8.1
-				constructor= testClass.getConstructor(new Class[0]);
-				test= (Test)constructor.newInstance(new Object[0]);
-				if (test instanceof TestCase)
-					((TestCase) test).setName(testName);
-			}
-			if (test != null)
-				return test;
-		} catch (InstantiationException e) {
-		} catch (IllegalAccessException e) {
-		} catch (InvocationTargetException e) {
-		} catch (NoSuchMethodException e) {
-		} catch (ClassCastException e) {
-		}
-		return warning("Could not create test \'"+testName+"\' "); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-
-	/*
-	 * @see TestListener#addError(Test, Throwable)
-	 */
-	public final void addError(Test test, Throwable throwable) {
-		notifyTestFailed(test, MessageIds.TEST_ERROR, getTrace(throwable));
-	}
-
-	/*
-	 * @see TestListener#addFailure(Test, AssertionFailedError)
-	 */
-	public final void addFailure(Test test, AssertionFailedError assertionFailedError) {
-		if ("3".equals(fVersion)) {
-		    if (assertionFailedError instanceof ComparisonFailure) {
-		        // transmit the expected and the actual string
-		        String expected = getField(assertionFailedError, "fExpected");
-		        String actual = getField(assertionFailedError, "fActual");
-		        if (expected != null && actual != null) {
-		            notifyTestFailed2(test, MessageIds.TEST_FAILED, getTrace(assertionFailedError), expected, actual);
-		            return;
-		       }
-		    }
-		} 
-		notifyTestFailed(test, MessageIds.TEST_FAILED, getTrace(assertionFailedError));
-	}
-
-	/*
-	 * @see TestListener#endTest(Test)
-	 */
-	public void endTest(Test test) {
-		notifyTestEnded(test);
-	}
-
-	/*
-	 * @see TestListener#startTest(Test)
-	 */
-	public void startTest(Test test) {
-		notifyTestStarted(test);
-	}
-	
-	private void sendTree(Test test){
-		if(test instanceof TestDecorator){
-			TestDecorator decorator= (TestDecorator) test;
-			sendTree(decorator.getTest());		
-		}
-		else if(test instanceof TestSuite){
-			TestSuite suite= (TestSuite) test;
-			notifyTestTreeEntry(getTestId(test)+','+escapeComma(suite.toString().trim()) + ',' + true + ',' + suite.testCount());
-			for(int i=0; i < suite.testCount(); i++){	
-				sendTree(suite.testAt(i));		
-			}				
-		}
-		else {
-			notifyTestTreeEntry(getTestId(test)+ ',' + escapeComma(getTestName(test).trim()) + ',' + false + ',' +  test.countTestCases());
-		}
-	}
-	
-	private String escapeComma(String s) {
-		if ((s.indexOf(',') < 0) && (s.indexOf('\\') < 0))
-			return s;
-		StringBuffer sb= new StringBuffer(s.length()+10);
-		for (int i= 0; i < s.length(); i++) {
-			char c= s.charAt(i);
-			if (c == ',') 
-				sb.append("\\,"); //$NON-NLS-1$
-			else if (c == '\\')
-				sb.append("\\\\"); //$NON-NLS-1$
-			else
-				sb.append(c);
-		}
-		return sb.toString();
-	}
-
-	private String getTestId(Test test) {
-		return Integer.toString(System.identityHashCode(test));
-	}
-	
-	private String getTestName(Test test) {
-		if (test instanceof TestCase) {
-			TestCase testCase= (TestCase) test;
-			return testCase.getName() + "(" + test.getClass().getName() + ")";
-		}
-		if (test instanceof TestSuite) {
-			TestSuite suite= (TestSuite) test;
-			if (suite.getName() != null)
-				return suite.getName();
-			return getClass().getName();
-		}
-		return test.toString();
-	}
-	
-	/**
-	 * Returns the stack trace for the given throwable.
-	 */
-	private String getTrace(Throwable t) { 
-		StringWriter stringWriter= new StringWriter();
-		PrintWriter writer= new PrintWriter(stringWriter);
-		t.printStackTrace(writer);
-		StringBuffer buffer= stringWriter.getBuffer();
-		return buffer.toString();
-	}	
-
-	/**
-	 * Stop the current test run.
-	 */
-	protected void stop() {
-		if (fTestResult != null) {
-			fTestResult.stop();
-		}
-	}
-	
-	/**
-	 * Connect to the remote test listener.
-	 */
-	private boolean connect() {
-		if (fDebugMode)
-			System.out.println("RemoteTestRunner: trying to connect" + fHost + ":" + fPort); //$NON-NLS-1$ //$NON-NLS-2$
-		Exception exception= null;
-		for (int i= 1; i < 20; i++) {
-			try{
-				fClientSocket= new Socket(fHost, fPort);
-				fWriter= new PrintWriter(fClientSocket.getOutputStream(), false/*true*/);
-				fReader= new BufferedReader(new InputStreamReader(fClientSocket.getInputStream()));
-				fReaderThread= new ReaderThread();
-				fReaderThread.start();
-				return true;
-			} catch(IOException e){
-				exception= e;
-			}
-			try {
-				Thread.sleep(2000);
-			} catch(InterruptedException e) {
-			}
-		}
-		runFailed(JUnitMessages.getFormattedString("RemoteTestRunner.error.connect", new String[]{fHost, Integer.toString(fPort)} )); //$NON-NLS-1$
-		exception.printStackTrace();
-		return false;
-	}
-
-	/**
-	 * Shutsdown the connection to the remote test listener.
-	 */
-	private void shutDown() {
-		if (fWriter != null) {
-			fWriter.close();
-			fWriter= null;
-		}
-		try {
-			if (fReaderThread != null)   {
-				// interrupt reader thread so that we don't block on close
-				// on a lock held by the BufferedReader
-				// fix for bug: 38955
-				fReaderThread.interrupt();
-			}
-			if (fReader != null) {
-				fReader.close();
-				fReader= null;
-			}
-		} catch(IOException e) {
-			if (fDebugMode)
-				e.printStackTrace();
-		}
-		
-		try {
-			if (fClientSocket != null) {
-				fClientSocket.close();
-				fClientSocket= null;
-			}
-		} catch(IOException e) {
-			if (fDebugMode)	
-				e.printStackTrace();
-		}
-	}
-
-
-	private void sendMessage(String msg) {
-		if(fWriter == null) 
-			return;
-		fWriter.println(msg);
-	}
-
-
-	private void notifyTestRunStarted(int testCount) {
-		sendMessage(MessageIds.TEST_RUN_START + testCount + " " + "v2"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-
-	private void notifyTestRunEnded(long elapsedTime) {
-		sendMessage(MessageIds.TEST_RUN_END + elapsedTime);
-		fWriter.flush();
-		//shutDown();
-	}
-
-
-	private void notifyTestRunStopped(long elapsedTime) {
-		sendMessage(MessageIds.TEST_STOPPED + elapsedTime );
-		fWriter.flush();
-		//shutDown();
-	}
-
-	private void notifyTestStarted(Test test) {
-		sendMessage(MessageIds.TEST_START + getTestId(test) + ','+test.toString());
-		fWriter.flush();
-	}
-
-	private void notifyTestEnded(Test test) {
-		sendMessage(MessageIds.TEST_END + getTestId(test)+','+getTestName(test));
-	}
-
-	private void notifyTestFailed(Test test, String status, String trace) {
-		sendMessage(status + getTestId(test) + ',' + getTestName(test));
-		sendMessage(MessageIds.TRACE_START);
-		sendMessage(trace);
-		sendMessage(MessageIds.TRACE_END);
-		fWriter.flush();
-	}
-
-	private void notifyTestFailed2(Test test, String status, String trace, String expected, String actual) {
-	    sendMessage(status + getTestId(test) + ',' + getTestName(test));
-	    
-	    sendMessage(MessageIds.EXPECTED_START);
-	    sendMessage(expected);
-	    sendMessage(MessageIds.EXPECTED_END);
-	    
-	    sendMessage(MessageIds.ACTUAL_START);
-	    sendMessage(actual);
-	    sendMessage(MessageIds.ACTUAL_END);
-	    
-	    sendMessage(MessageIds.TRACE_START);
-	    sendMessage(trace);
-	    sendMessage(MessageIds.TRACE_END);
-	    
-	    fWriter.flush();
-	}
-	
-	private void notifyTestTreeEntry(String treeEntry) {
-		sendMessage(MessageIds.TEST_TREE + treeEntry);
-	}
-	
-	private void notifyTestReran(TestResult result, String testId, String testClass, String testName) {
-		TestFailure failure= null;
-		if (result.errorCount() > 0) {
-			failure= (TestFailure)result.errors().nextElement();
-		}
-		if (result.failureCount() > 0) {
-			failure= (TestFailure)result.failures().nextElement();
-		}
-		if (failure != null) {
-			Throwable t= failure.thrownException();
-			String trace= getTrace(t);
-			sendMessage(MessageIds.RTRACE_START);
-			sendMessage(trace);
-			sendMessage(MessageIds.RTRACE_END);
-			fWriter.flush();
-		}
-		String status= "OK"; //$NON-NLS-1$
-		if (result.errorCount() > 0)
-			status= "ERROR"; //$NON-NLS-1$
-		else if (result.failureCount() > 0)
-			status= "FAILURE"; //$NON-NLS-1$
-		if (fPort != -1) {
-			sendMessage(MessageIds.TEST_RERAN + testId+ " "+testClass+" "+testName+" "+status); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			fWriter.flush();
-		}
-	}
-	
-	private String getField(Object object, String fieldName) {
-	    Class clazz= object.getClass();
-	    try {
-	        Field field= clazz.getDeclaredField(fieldName);
-	        field.setAccessible(true);
-	        Object result= field.get(object);
-	        return result.toString();
-	    } catch (Exception e) {
-	        // fall through
-	    }
-	    return null;
-	}
-}	
diff --git a/org.eclipse.jdt.junit/.classpath b/org.eclipse.jdt.junit/.classpath
deleted file mode 100644
index 0510763..0000000
--- a/org.eclipse.jdt.junit/.classpath
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="/org.eclipse.ui.ide"/>
-	<classpathentry kind="src" path="/org.eclipse.ui.views"/>
-	<classpathentry kind="src" path="/org.eclipse.jface.text"/>
-	<classpathentry kind="src" path="/org.eclipse.ui.workbench.texteditor"/>
-	<classpathentry kind="src" path="/org.eclipse.ui.editors"/>
-	<classpathentry kind="src" path="/org.eclipse.ui"/>
-	<classpathentry kind="src" path="/org.eclipse.core.resources"/>
-	<classpathentry kind="src" path="/org.eclipse.core.runtime.compatibility"/>
-	<classpathentry kind="src" path="/org.eclipse.core.boot"/>
-	<classpathentry kind="src" path="/org.eclipse.debug.core"/>
-	<classpathentry kind="src" path="/org.eclipse.debug.ui"/>
-	<classpathentry kind="src" path="/org.eclipse.jdt.core"/>
-	<classpathentry kind="src" path="/org.eclipse.jdt.ui"/>
-	<classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-	<classpathentry kind="src" path="/org.eclipse.jdt.launching"/>
-	<classpathentry kind="src" path="/org.eclipse.jdt.debug.ui"/>
-	<classpathentry kind="src" path="/org.eclipse.jdt.junit.runtime"/>
-	<classpathentry kind="src" path="/org.eclipse.compare"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.junit/.cvsignore b/org.eclipse.jdt.junit/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.jdt.junit/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.jdt.junit/.project b/org.eclipse.jdt.junit/.project
deleted file mode 100644
index 45f4c5e..0000000
--- a/org.eclipse.jdt.junit/.project
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt.junit</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.compare</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.debug.core</project>
-		<project>org.eclipse.debug.ui</project>
-		<project>org.eclipse.jdt.core</project>
-		<project>org.eclipse.jdt.debug.ui</project>
-		<project>org.eclipse.jdt.junit.runtime</project>
-		<project>org.eclipse.jdt.launching</project>
-		<project>org.eclipse.jdt.ui</project>
-		<project>org.eclipse.jdt.ui.tests</project>
-		<project>org.eclipse.jface.text</project>
-		<project>org.eclipse.junit.server</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.editors</project>
-		<project>org.eclipse.ui.ide</project>
-		<project>org.eclipse.ui.views</project>
-		<project>org.eclipse.ui.workbench.texteditor</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.jdt.junit/about.html b/org.eclipse.jdt.junit/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/org.eclipse.jdt.junit/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/org.eclipse.jdt.junit/build.properties b/org.eclipse.jdt.junit/build.properties
deleted file mode 100644
index 814ba25..0000000
--- a/org.eclipse.jdt.junit/build.properties
+++ /dev/null
@@ -1,20 +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.xml,\
-               about.html,\
-               icons/,\
-               plugin.properties,\
-               *.jar
-
-source.junitsupport.jar = src/
-
-src.includes = about.html,\
-               schema/
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/cfilter.gif b/org.eclipse.jdt.junit/icons/full/clcl16/cfilter.gif
deleted file mode 100644
index 0c3470d..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/cfilter.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/compare.gif b/org.eclipse.jdt.junit/icons/full/clcl16/compare.gif
deleted file mode 100644
index 2b645a8..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/compare.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/lock.gif b/org.eclipse.jdt.junit/icons/full/clcl16/lock.gif
deleted file mode 100644
index d47ecfd..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/lock.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/relaunch.gif b/org.eclipse.jdt.junit/icons/full/clcl16/relaunch.gif
deleted file mode 100644
index 6b0c23d..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/relaunch.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/select_next.gif b/org.eclipse.jdt.junit/icons/full/clcl16/select_next.gif
deleted file mode 100644
index 8392f33..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/select_next.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/select_prev.gif b/org.eclipse.jdt.junit/icons/full/clcl16/select_prev.gif
deleted file mode 100644
index 9b278e6..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/select_prev.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/stop.gif b/org.eclipse.jdt.junit/icons/full/clcl16/stop.gif
deleted file mode 100644
index d47876f..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/stop.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/th_horizontal.gif b/org.eclipse.jdt.junit/icons/full/clcl16/th_horizontal.gif
deleted file mode 100644
index f4c14a4..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/th_horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/clcl16/th_vertical.gif b/org.eclipse.jdt.junit/icons/full/clcl16/th_vertical.gif
deleted file mode 100644
index f685839..0000000
--- a/org.eclipse.jdt.junit/icons/full/clcl16/th_vertical.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/ctool16/debugjunit.gif b/org.eclipse.jdt.junit/icons/full/ctool16/debugjunit.gif
deleted file mode 100644
index 3d218a1..0000000
--- a/org.eclipse.jdt.junit/icons/full/ctool16/debugjunit.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/ctool16/new_testcase.gif b/org.eclipse.jdt.junit/icons/full/ctool16/new_testcase.gif
deleted file mode 100644
index 08b508b..0000000
--- a/org.eclipse.jdt.junit/icons/full/ctool16/new_testcase.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/ctool16/new_testsuite.gif b/org.eclipse.jdt.junit/icons/full/ctool16/new_testsuite.gif
deleted file mode 100644
index 93c2cf1..0000000
--- a/org.eclipse.jdt.junit/icons/full/ctool16/new_testsuite.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/ctool16/runjunit.gif b/org.eclipse.jdt.junit/icons/full/ctool16/runjunit.gif
deleted file mode 100644
index 8d950f5..0000000
--- a/org.eclipse.jdt.junit/icons/full/ctool16/runjunit.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/cview16/junit.gif b/org.eclipse.jdt.junit/icons/full/cview16/junit.gif
deleted file mode 100644
index 3db90db..0000000
--- a/org.eclipse.jdt.junit/icons/full/cview16/junit.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/cview16/juniterr.gif b/org.eclipse.jdt.junit/icons/full/cview16/juniterr.gif
deleted file mode 100644
index adc4b32..0000000
--- a/org.eclipse.jdt.junit/icons/full/cview16/juniterr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/cview16/juniterrq.gif b/org.eclipse.jdt.junit/icons/full/cview16/juniterrq.gif
deleted file mode 100644
index 94f3619..0000000
--- a/org.eclipse.jdt.junit/icons/full/cview16/juniterrq.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/cview16/junitsucc.gif b/org.eclipse.jdt.junit/icons/full/cview16/junitsucc.gif
deleted file mode 100644
index 7b1d00c..0000000
--- a/org.eclipse.jdt.junit/icons/full/cview16/junitsucc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/cview16/junitsuccq.gif b/org.eclipse.jdt.junit/icons/full/cview16/junitsuccq.gif
deleted file mode 100644
index aaeb0d1..0000000
--- a/org.eclipse.jdt.junit/icons/full/cview16/junitsuccq.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/cview16/stackframe.gif b/org.eclipse.jdt.junit/icons/full/cview16/stackframe.gif
deleted file mode 100644
index 924e1c8..0000000
--- a/org.eclipse.jdt.junit/icons/full/cview16/stackframe.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/cfilter.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/cfilter.gif
deleted file mode 100644
index 297b472..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/cfilter.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/compare.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/compare.gif
deleted file mode 100644
index 27b96a7..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/compare.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/lock.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/lock.gif
deleted file mode 100644
index c67c0d8..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/lock.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/relaunch.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/relaunch.gif
deleted file mode 100644
index d390fab..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/relaunch.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/select_next.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/select_next.gif
deleted file mode 100644
index 6cbeced..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/select_next.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/select_prev.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/select_prev.gif
deleted file mode 100644
index a3441a0..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/select_prev.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/stop.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/stop.gif
deleted file mode 100644
index bf15460..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/stop.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/th_horizontal.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/th_horizontal.gif
deleted file mode 100644
index 02e35a4..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/th_horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dlcl16/th_vertical.gif b/org.eclipse.jdt.junit/icons/full/dlcl16/th_vertical.gif
deleted file mode 100644
index e548d11..0000000
--- a/org.eclipse.jdt.junit/icons/full/dlcl16/th_vertical.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dtool16/debugjunit.gif b/org.eclipse.jdt.junit/icons/full/dtool16/debugjunit.gif
deleted file mode 100644
index e5721db..0000000
--- a/org.eclipse.jdt.junit/icons/full/dtool16/debugjunit.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/dtool16/runjunit.gif b/org.eclipse.jdt.junit/icons/full/dtool16/runjunit.gif
deleted file mode 100644
index e42021c..0000000
--- a/org.eclipse.jdt.junit/icons/full/dtool16/runjunit.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/cfilter.gif b/org.eclipse.jdt.junit/icons/full/elcl16/cfilter.gif
deleted file mode 100644
index 51057e8..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/cfilter.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/compare.gif b/org.eclipse.jdt.junit/icons/full/elcl16/compare.gif
deleted file mode 100644
index bcd5f22..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/compare.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/lock.gif b/org.eclipse.jdt.junit/icons/full/elcl16/lock.gif
deleted file mode 100644
index be3943a..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/lock.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/relaunch.gif b/org.eclipse.jdt.junit/icons/full/elcl16/relaunch.gif
deleted file mode 100644
index 7a95d09..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/relaunch.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/select_next.gif b/org.eclipse.jdt.junit/icons/full/elcl16/select_next.gif
deleted file mode 100644
index 1d0b40a..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/select_next.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/select_prev.gif b/org.eclipse.jdt.junit/icons/full/elcl16/select_prev.gif
deleted file mode 100644
index 1372957..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/select_prev.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/stop.gif b/org.eclipse.jdt.junit/icons/full/elcl16/stop.gif
deleted file mode 100644
index 8ea6ff73..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/stop.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/th_horizontal.gif b/org.eclipse.jdt.junit/icons/full/elcl16/th_horizontal.gif
deleted file mode 100644
index a1b054f..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/th_horizontal.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/elcl16/th_vertical.gif b/org.eclipse.jdt.junit/icons/full/elcl16/th_vertical.gif
deleted file mode 100644
index 1795443..0000000
--- a/org.eclipse.jdt.junit/icons/full/elcl16/th_vertical.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/etool16/debugjunit.gif b/org.eclipse.jdt.junit/icons/full/etool16/debugjunit.gif
deleted file mode 100644
index 162b956..0000000
--- a/org.eclipse.jdt.junit/icons/full/etool16/debugjunit.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/etool16/runjunit.gif b/org.eclipse.jdt.junit/icons/full/etool16/runjunit.gif
deleted file mode 100644
index 50ead9d..0000000
--- a/org.eclipse.jdt.junit/icons/full/etool16/runjunit.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/junit.gif b/org.eclipse.jdt.junit/icons/full/eview16/junit.gif
deleted file mode 100644
index 5f1d7e1..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/junit.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/juniterr.gif b/org.eclipse.jdt.junit/icons/full/eview16/juniterr.gif
deleted file mode 100644
index 3e6586b..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/juniterr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/juniterrq.gif b/org.eclipse.jdt.junit/icons/full/eview16/juniterrq.gif
deleted file mode 100644
index 9348b7d..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/juniterrq.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/junitfail.gif b/org.eclipse.jdt.junit/icons/full/eview16/junitfail.gif
deleted file mode 100644
index 4de4d13..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/junitfail.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/junitfailq.gif b/org.eclipse.jdt.junit/icons/full/eview16/junitfailq.gif
deleted file mode 100644
index 44a86ba..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/junitfailq.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/junitsuc.gif b/org.eclipse.jdt.junit/icons/full/eview16/junitsuc.gif
deleted file mode 100644
index 2cd5a81..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/junitsuc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/junitsucc.gif b/org.eclipse.jdt.junit/icons/full/eview16/junitsucc.gif
deleted file mode 100644
index 0e20c00..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/junitsucc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/junitsuccq.gif b/org.eclipse.jdt.junit/icons/full/eview16/junitsuccq.gif
deleted file mode 100644
index 1345316..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/junitsuccq.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/junitsucq.gif b/org.eclipse.jdt.junit/icons/full/eview16/junitsucq.gif
deleted file mode 100644
index 6ffc1e5..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/junitsucq.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/eview16/stackframe.gif b/org.eclipse.jdt.junit/icons/full/eview16/stackframe.gif
deleted file mode 100644
index 4e444db..0000000
--- a/org.eclipse.jdt.junit/icons/full/eview16/stackframe.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/exc_catch.gif b/org.eclipse.jdt.junit/icons/full/obj16/exc_catch.gif
deleted file mode 100644
index 037eef1..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/exc_catch.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/faillist.gif b/org.eclipse.jdt.junit/icons/full/obj16/faillist.gif
deleted file mode 100644
index a67a320..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/faillist.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/failures.gif b/org.eclipse.jdt.junit/icons/full/obj16/failures.gif
deleted file mode 100644
index 1ff549c..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/failures.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/julaunch.gif b/org.eclipse.jdt.junit/icons/full/obj16/julaunch.gif
deleted file mode 100644
index e3c749a..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/julaunch.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/stkfrm_obj.gif b/org.eclipse.jdt.junit/icons/full/obj16/stkfrm_obj.gif
deleted file mode 100644
index 567ea42..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/stkfrm_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/test.gif b/org.eclipse.jdt.junit/icons/full/obj16/test.gif
deleted file mode 100644
index 2e472d4..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/test.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/testerr.gif b/org.eclipse.jdt.junit/icons/full/obj16/testerr.gif
deleted file mode 100644
index 7314764..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/testerr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/testfail.gif b/org.eclipse.jdt.junit/icons/full/obj16/testfail.gif
deleted file mode 100644
index 5f15ff7..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/testfail.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/testhier.gif b/org.eclipse.jdt.junit/icons/full/obj16/testhier.gif
deleted file mode 100644
index 72861a5..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/testhier.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/testok.gif b/org.eclipse.jdt.junit/icons/full/obj16/testok.gif
deleted file mode 100644
index c68bd2c..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/testok.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/testrun.gif b/org.eclipse.jdt.junit/icons/full/obj16/testrun.gif
deleted file mode 100644
index 730d658..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/testrun.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/tsuite.gif b/org.eclipse.jdt.junit/icons/full/obj16/tsuite.gif
deleted file mode 100644
index 4fe79e7..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/tsuite.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/tsuiteerror.gif b/org.eclipse.jdt.junit/icons/full/obj16/tsuiteerror.gif
deleted file mode 100644
index db32174..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/tsuiteerror.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/tsuitefail.gif b/org.eclipse.jdt.junit/icons/full/obj16/tsuitefail.gif
deleted file mode 100644
index c373376..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/tsuitefail.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/tsuiteok.gif b/org.eclipse.jdt.junit/icons/full/obj16/tsuiteok.gif
deleted file mode 100644
index ede2c0b..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/tsuiteok.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/obj16/tsuiterun.gif b/org.eclipse.jdt.junit/icons/full/obj16/tsuiterun.gif
deleted file mode 100644
index ccde7bd..0000000
--- a/org.eclipse.jdt.junit/icons/full/obj16/tsuiterun.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/ovr16/error_ovr.gif b/org.eclipse.jdt.junit/icons/full/ovr16/error_ovr.gif
deleted file mode 100644
index 8612eaf..0000000
--- a/org.eclipse.jdt.junit/icons/full/ovr16/error_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/ovr16/failed_ovr.gif b/org.eclipse.jdt.junit/icons/full/ovr16/failed_ovr.gif
deleted file mode 100644
index d45b970..0000000
--- a/org.eclipse.jdt.junit/icons/full/ovr16/failed_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/ovr16/success_ovr.gif b/org.eclipse.jdt.junit/icons/full/ovr16/success_ovr.gif
deleted file mode 100644
index 0f0cf30..0000000
--- a/org.eclipse.jdt.junit/icons/full/ovr16/success_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff1.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff1.gif
deleted file mode 100644
index 25f7579..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff1.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff2.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff2.gif
deleted file mode 100644
index b6a4782..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff2.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff3.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff3.gif
deleted file mode 100644
index 11cbcb5..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff3.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff4.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff4.gif
deleted file mode 100644
index 30b31e6..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff4.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff5.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff5.gif
deleted file mode 100644
index c826bdc..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff5.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff6.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff6.gif
deleted file mode 100644
index 24a3452..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff6.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff7.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff7.gif
deleted file mode 100644
index 52e1ad0..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff7.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff8.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff8.gif
deleted file mode 100644
index 62597bc..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff8.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ff9.gif b/org.eclipse.jdt.junit/icons/full/prgss/ff9.gif
deleted file mode 100644
index 5471191..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ff9.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss1.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss1.gif
deleted file mode 100644
index e08e842..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss1.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss2.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss2.gif
deleted file mode 100644
index 67f852f..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss2.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss3.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss3.gif
deleted file mode 100644
index 69ee58a..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss3.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss4.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss4.gif
deleted file mode 100644
index 6553766..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss4.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss5.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss5.gif
deleted file mode 100644
index f1af0d5..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss5.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss6.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss6.gif
deleted file mode 100644
index 14406e2..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss6.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss7.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss7.gif
deleted file mode 100644
index 14d6602..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss7.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss8.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss8.gif
deleted file mode 100644
index 3562961..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss8.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/prgss/ss9.gif b/org.eclipse.jdt.junit/icons/full/prgss/ss9.gif
deleted file mode 100644
index 9077dcd..0000000
--- a/org.eclipse.jdt.junit/icons/full/prgss/ss9.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/wizban/newsuite_wiz.gif b/org.eclipse.jdt.junit/icons/full/wizban/newsuite_wiz.gif
deleted file mode 100644
index a4f146b..0000000
--- a/org.eclipse.jdt.junit/icons/full/wizban/newsuite_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/icons/full/wizban/newtest_wiz.gif b/org.eclipse.jdt.junit/icons/full/wizban/newtest_wiz.gif
deleted file mode 100644
index b753340..0000000
--- a/org.eclipse.jdt.junit/icons/full/wizban/newtest_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.junit/plugin.properties b/org.eclipse.jdt.junit/plugin.properties
deleted file mode 100644
index d93dd01..0000000
--- a/org.eclipse.jdt.junit/plugin.properties
+++ /dev/null
@@ -1,35 +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=Java Development Tools JUnit support
-providerName=Eclipse.org
-
-testRunListeners.name= Test Run Listeners
-junitQuickFixProcessor= JUnit Quick Fix Processor
-
-View.label= JUnit
-Launch.label= JUnit
-PreferencePage.label= JUnit
-
-TestWizard.description= Create a JUnit Test Case
-SuiteWizard.description= Create a JUnit Test Suite
-UpdateSuiteAction.label= Recreate Test Suite...
-UpdateSuiteAction.tooltip= Recreate JUnit TestSuite with new test classes
-Task.name= JUnit Task
-WizardCategory.name= JUnit
-TestCaseWizard.name= Test Case
-TestSuiteWizard.name= Test Suite
-
-JUnitShortcut.label= JUnit Test
-
-JUnitActionSet.label= JUnit
-
-GotoTestAction.label= Referring Tests...
-GotoTestAction.tooltip= Go to Test Referring to Selection
diff --git a/org.eclipse.jdt.junit/plugin.xml b/org.eclipse.jdt.junit/plugin.xml
deleted file mode 100644
index c4c65d7..0000000
--- a/org.eclipse.jdt.junit/plugin.xml
+++ /dev/null
@@ -1,236 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jdt.junit"
-   name="%pluginName"
-   version="3.0.0"
-   provider-name="%providerName"
-   class="org.eclipse.jdt.internal.junit.ui.JUnitPlugin">
-
-   <runtime>
-      <library name="junitsupport.jar">
-         <export name="*"/>
-         <packages prefixes="org.eclipse.jdt.internal.junit,org.eclipse.jdt.junit"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.ui.views"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.ui.editors"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.core.runtime.compatibility" optional="true"/>
-      <import plugin="org.eclipse.core.boot"/>
-      <import plugin="org.eclipse.debug.core"/>
-      <import plugin="org.eclipse.debug.ui"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jdt.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.jdt.debug.ui"/>
-      <import plugin="org.eclipse.jdt.junit.runtime"/>
-      <import plugin="org.eclipse.compare"/>
-   </requires>
-
-
-   <extension-point id="testRunListeners" name="%testRunListeners.name" schema="schema/testRunListeners.exsd"/>
-
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="%View.label"
-            icon="icons/full/cview16/junit.gif"
-            category="org.eclipse.jdt.ui.java"
-            fastViewWidthRatio="0.40"
-            class="org.eclipse.jdt.internal.junit.ui.TestRunnerViewPart"
-            id="org.eclipse.jdt.junit.ResultView">
-      </view>
-   </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.jdt.ui.JavaPerspective">
-         <view
-               relative="org.eclipse.jdt.ui.PackageExplorer"
-               visible="false"
-               id="org.eclipse.jdt.junit.ResultView"
-               relationship="stack">
-         </view>
-      </perspectiveExtension>
-      <perspectiveExtension
-            targetID="org.eclipse.jdt.ui.JavaPerspective">
-         <actionSet
-               id="org.eclipse.jdt.junit.JUnitActionSet">
-         </actionSet>
-      </perspectiveExtension>
-      <perspectiveExtension
-            targetID="org.eclipse.jdt.ui.JavaBrowsingPerspective">
-         <actionSet
-               id="org.eclipse.jdt.junit.JUnitActionSet">
-         </actionSet>
-      </perspectiveExtension>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            name="%PreferencePage.label"
-            category="org.eclipse.jdt.ui.preferences.JavaBasePreferencePage"
-            class="org.eclipse.jdt.internal.junit.ui.JUnitPreferencePage"
-            id="org.eclipse.jdt.junit.preferences">
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationTypes">
-      <launchConfigurationType
-            name="%Launch.label"
-            delegate="org.eclipse.jdt.internal.junit.launcher.JUnitLaunchConfiguration"
-            modes="run, debug"
-            id="org.eclipse.jdt.junit.launchconfig">
-         <fileExtension
-               default="false"
-               extension="java">
-         </fileExtension>
-         <fileExtension
-               default="false"
-               extension="class">
-         </fileExtension>
-      </launchConfigurationType>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationComparators">
-      <launchConfigurationComparator
-            attribute="org.eclipse.jdt.junit.CONTAINER"
-            class="org.eclipse.jdt.internal.junit.launcher.ContainerComparator"
-            id="org.eclipse.jdt.junit.containerComparator">
-      </launchConfigurationComparator>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-      <launchConfigurationTypeImage
-            icon="icons/full/obj16/julaunch.gif"
-            configTypeID="org.eclipse.jdt.junit.launchconfig"
-            id="org.eclipse.jdt.junit.launchimage">
-      </launchConfigurationTypeImage>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-      <launchConfigurationTabGroup
-            type="org.eclipse.jdt.junit.launchconfig"
-            helpContextId="org.eclipse.jdt.junit.junit_tab_group"
-            class="org.eclipse.jdt.internal.junit.launcher.JUnitTabGroup"
-            id="org.eclipse.jdt.junit.launchConfigurationTabGroup.junit">
-      </launchConfigurationTabGroup>
-   </extension>
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            name="%WizardCategory.name"
-            parentCategory="org.eclipse.jdt.ui.java"
-            id="org.eclipse.jdt.junit">
-      </category>
-      <wizard
-            javatype="true"
-            name="%TestCaseWizard.name"
-            icon="icons/full/ctool16/new_testcase.gif"
-            category="org.eclipse.jdt.ui.java/org.eclipse.jdt.junit"
-            class="org.eclipse.jdt.internal.junit.wizards.NewTestCaseCreationWizard"
-            id="org.eclipse.jdt.junit.wizards.NewTestCaseCreationWizard">
-         <description>
-            %TestWizard.description
-         </description>
-      </wizard>
-      <wizard
-            name="%TestSuiteWizard.name"
-            icon="icons/full/ctool16/new_testsuite.gif"
-            category="org.eclipse.jdt.ui.java/org.eclipse.jdt.junit"
-            class="org.eclipse.jdt.internal.junit.wizards.NewTestSuiteCreationWizard"
-            id="org.eclipse.jdt.junit.wizards.NewTestSuiteCreationWizard">
-         <description>
-            %SuiteWizard.description
-         </description>
-      </wizard>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            objectClass="org.eclipse.jdt.core.ICompilationUnit"
-            nameFilter="AllTests.java"
-            id="org.eclipse.jdt.junit.wizards.UpdateTestSuite">
-         <action
-               label="%UpdateSuiteAction.label"
-               class="org.eclipse.jdt.internal.junit.wizards.UpdateTestSuite"
-               tooltip="%UpdateSuiteAction.tooltip"
-               enablesFor="1"
-               id="updateTestSuite">
-         </action>
-      </objectContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="%JUnitActionSet.label"
-            visible="false"
-            id="org.eclipse.jdt.junit.JUnitActionSet">
-         <action
-               label="%GotoTestAction.label"
-               helpContextId="org.eclipse.jdt.junit.goto_referenced_test_action_context"
-               class="org.eclipse.jdt.internal.junit.ui.GotoReferencedTestAction"
-               tooltip="%GotoTestAction.tooltip"
-               menubarPath="navigate/goTo/"
-               id="junit.actions.GotoTestAction">
-         </action>
-      </actionSet>
-   </extension>
-   <extension
-         id="junit_task"
-         name="%Task.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.core.resources.taskmarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchShortcuts">
-      <shortcut
-            label="%JUnitShortcut.label"
-            icon="icons/full/obj16/julaunch.gif"
-            helpContextId="org.eclipse.jdt.junit.launch_shortcut"
-            class="org.eclipse.jdt.internal.junit.launcher.JUnitLaunchShortcut"
-            modes="run, debug"
-            id="org.eclipse.jdt.junit.junitShortcut">
-         <perspective
-               id="org.eclipse.jdt.ui.JavaPerspective">
-         </perspective>
-         <perspective
-               id="org.eclipse.jdt.ui.JavaHierarchyPerspective">
-         </perspective>
-         <perspective
-               id="org.eclipse.jdt.ui.JavaBrowsingPerspective">
-         </perspective>
-         <perspective
-               id="org.eclipse.debug.ui.DebugPerspective">
-         </perspective>
-      </shortcut>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.core.classpathVariableInitializer">
-      <classpathVariableInitializer
-            variable="JUNIT_HOME"
-            class="org.eclipse.jdt.internal.junit.ui.JUnitHomeInitializer">
-      </classpathVariableInitializer>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.ui.quickFixProcessors">
-      <quickFixProcessor
-            name="%junitQuickFixProcessor"
-            class="org.eclipse.jdt.internal.junit.ui.JUnitQuickFixProcessor"
-            id="org.eclipse.jdt.internal.junit.ui.JUnitQuickFixProcessor">
-      </quickFixProcessor>
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.jdt.junit/schema/testRunListeners.exsd b/org.eclipse.jdt.junit/schema/testRunListeners.exsd
deleted file mode 100644
index 46d5661..0000000
--- a/org.eclipse.jdt.junit/schema/testRunListeners.exsd
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jdt.junit">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jdt.junit" id="testRunListeners" name="Test Run Listeners"/>
-      </appInfo>
-      <documentation>
-         Extension point to register additional test run listeners. A test run listeners is notified about the execution of a test run.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <documentation>
-            a fully qualified identifier of the target extension point
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="testRunListener"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  a fully qualified identifier of the target extension point
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="testRunListener">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  Test run class implementing org.eclipse.jdt.junit.ITestRunListener
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jdt.junit.ITestRunListener"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.1
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         The following is an example of a test run listener contribution:
-
-&lt;p&gt;
-&lt;pre&gt;
- &lt;extension point=&quot;org.eclipse.jdt.junit.testRunListeners&quot;&gt;
-  &lt;testRunListener class=&quot;com.example.SampleTestRunListener&quot;/&gt;
- &lt;/extension&gt;
-&lt;/pre&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         Test run listeners must must implement the org.eclipse.jdt.junit.ITestRunListener interface.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;
-&lt;a href=&quot;hglegal.htm&quot;&gt;
- &lt;img SRC=&quot;ngibmcpy.gif&quot;
-   ALT=&quot;Copyright (c) 2000, 2003 IBM Corporation and others. All Rights Reserved.&quot;
-   BORDER=0 height=14 width=324&gt;&lt;/a&gt;
-&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/org.eclipse.jdt.junit/scripts/exportplugin.xml b/org.eclipse.jdt.junit/scripts/exportplugin.xml
deleted file mode 100644
index 87c542a..0000000
--- a/org.eclipse.jdt.junit/scripts/exportplugin.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<!-- build script to create JUnit Plugin -->
-<project name="org.eclipse.jdt.junit" default="export" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.jdt.junit" />
-		<property name="version"  value="_3.0.0" />
-		<property name="dest"  value="${destdir}/${plugin}${version}" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		
-		<jar 
-			jarfile="${dest}/junitsupport.jar"
-			basedir="bin"
-		/>
-				
-		<jar 		
-			jarfile="${dest}/junitsupportsrc.jar"
-			basedir="src"
-		/>
-		
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<copy file="about.html" todir="${dest}"/>
-		<copy todir="${dest}/icons">
-			<fileset dir="icons" />
-		</copy>		
-	</target>
-</project>
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/ContainerComparator.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/ContainerComparator.java
deleted file mode 100644
index 477362d..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/ContainerComparator.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.launcher;
-
-import java.util.Comparator;
-
-public class ContainerComparator implements Comparator {
-
-    public int compare(Object o1, Object o2) {
-		String container1= (String)o1;
-		String container2= (String)o2;
-		if (container1 == null)
-			container1= ""; //$NON-NLS-1$
-		if (container2 == null)
-			container2= ""; //$NON-NLS-1$
-		return container1.compareTo(container2);
-    }
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitBaseLaunchConfiguration.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitBaseLaunchConfiguration.java
deleted file mode 100644
index 6369bbc..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitBaseLaunchConfiguration.java
+++ /dev/null
@@ -1,180 +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.jdt.internal.junit.launcher;
-
- 
-import java.io.File;
-import java.text.MessageFormat;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.ui.JUnitMessages;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.junit.util.TestSearchEngine;
-import org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate;
-import org.eclipse.jdt.launching.ExecutionArguments;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jdt.launching.IVMInstall;
-import org.eclipse.jdt.launching.IVMRunner;
-import org.eclipse.jdt.launching.SocketUtil;
-import org.eclipse.jdt.launching.VMRunnerConfiguration;
-
-/**
- * Abstract launch configuration delegate for a JUnit test.
- */
-public abstract class JUnitBaseLaunchConfiguration extends AbstractJavaLaunchConfigurationDelegate {
-
-	public static final String PORT_ATTR= JUnitPlugin.PLUGIN_ID+".PORT"; //$NON-NLS-1$
-	public static final String TESTTYPE_ATTR= JUnitPlugin.PLUGIN_ID+".TESTTYPE"; //$NON-NLS-1$
-	public static final String TESTNAME_ATTR= JUnitPlugin.PLUGIN_ID+".TESTNAME"; //$NON-NLS-1$
-	public static final String ATTR_KEEPRUNNING = JUnitPlugin.PLUGIN_ID+ ".KEEPRUNNING_ATTR"; //$NON-NLS-1$
-	public static final String LAUNCH_CONTAINER_ATTR= JUnitPlugin.PLUGIN_ID+".CONTAINER"; //$NON-NLS-1$
-	/**
-	 * @see ILaunchConfigurationDelegate#launch(ILaunchConfiguration, String)
-	 */
-	
-	public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor pm) throws CoreException {		
-		IJavaProject javaProject= getJavaProject(configuration);
-		if ((javaProject == null) || !javaProject.exists()) {
-			abort(JUnitMessages.getString("JUnitBaseLaunchConfiguration.error.invalidproject"), null, IJavaLaunchConfigurationConstants.ERR_NOT_A_JAVA_PROJECT); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		IType[] testTypes = getTestTypes(configuration, javaProject, pm);
-		if (testTypes.length == 0) {
-			abort(JUnitMessages.getString("JUnitBaseLaunchConfiguration.error.notests"), null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE); //$NON-NLS-1$
-		}
-		IVMInstall install= getVMInstall(configuration);
-		IVMRunner runner = install.getVMRunner(mode);
-		if (runner == null) {
-			abort(MessageFormat.format(JUnitMessages.getString("JUnitBaseLaunchConfiguration.error.novmrunner"), new String[]{install.getId()}), null, IJavaLaunchConfigurationConstants.ERR_VM_RUNNER_DOES_NOT_EXIST); //$NON-NLS-1$
-		}
-		
-		int port= SocketUtil.findFreePort();
-		VMRunnerConfiguration runConfig= launchTypes(configuration, mode, testTypes, port);
-		setDefaultSourceLocator(launch, configuration);
-		
-		launch.setAttribute(PORT_ATTR, Integer.toString(port));
-		launch.setAttribute(TESTTYPE_ATTR, testTypes[0].getHandleIdentifier());
-		runner.run(runConfig, launch, pm);		
-	}
-
-	protected VMRunnerConfiguration launchTypes(ILaunchConfiguration configuration,
-					String mode, IType[] tests, int port) throws CoreException {
-		File workingDir = verifyWorkingDirectory(configuration);
-		String workingDirName = null;
-		if (workingDir != null) 
-			workingDirName = workingDir.getAbsolutePath();
-		
-		// Program & VM args
-		String vmArgs= getVMArguments(configuration);
-		ExecutionArguments execArgs = new ExecutionArguments(vmArgs, ""); //$NON-NLS-1$
-				
-		VMRunnerConfiguration runConfig= createVMRunner(configuration, tests, port, mode);
-		runConfig.setVMArguments(execArgs.getVMArgumentsArray());
-		runConfig.setWorkingDirectory(workingDirName);
-		
-		String[] bootpath = getBootpath(configuration);
-		runConfig.setBootClassPath(bootpath);
-		String[][] bootpathInfo = getBootpathExt(configuration);
-		runConfig.setPrependBootClassPath(bootpathInfo[0]);
-		runConfig.setMainBootClassPath(bootpathInfo[1]);
-		runConfig.setAppendBootClassPath(bootpathInfo[2]);
-		
-		return runConfig;
-	}
-
-	public IType[] getTestTypes(ILaunchConfiguration configuration, IJavaProject javaProject, IProgressMonitor pm) throws CoreException {
-		String testTypeName = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, (String)null);
-		if (pm == null)
-			pm= new NullProgressMonitor();
-		
-		String containerHandle = configuration.getAttribute(LAUNCH_CONTAINER_ATTR, ""); //$NON-NLS-1$
-		if (containerHandle.length() == 0) {
-			return findSingleTest(javaProject, testTypeName);
-		}
-		else 
-			return findTestsInContainer(javaProject, containerHandle, pm);
-	}
-	/**
-	 * @inheritdoc 
-	 * @param javaProject
-	 * @param containerHandle
-	 * @param pm
-	 * @return
-	 */
-	private IType[] findTestsInContainer(IJavaProject javaProject, String containerHandle, IProgressMonitor pm) {
-		IJavaElement container= JavaCore.create(containerHandle);
-		Set result= new HashSet();
-		try {
-			TestSearchEngine.doFindTests(new Object[]{container}, result, pm);
-		} catch (InterruptedException e) {
-		}
-		return (IType[]) result.toArray(new IType[result.size()]) ;
-	}
-
-
-	public IType[] findSingleTest(IJavaProject javaProject, String testName) throws CoreException {
-		IType type = null;
-		try {
-			type = findType(javaProject, testName);
-		} catch (JavaModelException jme) {
-			abort("Test type does not exist", null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE); //$NON-NLS-1$
-		}
-		if (type == null) {
-			abort("Test type does not exist", null, IJavaLaunchConfigurationConstants.ERR_UNSPECIFIED_MAIN_TYPE); //$NON-NLS-1$
-		}
-		return new IType[]{type};
-	}
-	
-	/**
-	 * Throws a core exception with the given message and optional
-	 * exception. The exception's status code will indicate an error.
-	 * 
-	 * @param message error message
-	 * @param exception cause of the error, or <code>null</code>
-	 * @exception CoreException with the given message and underlying
-	 *  exception
-	 */
-	protected void abort(String message, Throwable exception, int code) throws CoreException {
-		throw new CoreException(new Status(IStatus.ERROR, JUnitPlugin.PLUGIN_ID, code, message, exception));
-	}
-	
-	/**
-	 * Find the specified (fully-qualified) type name in the specified java project.
-	 */
-	private IType findType(IJavaProject javaProject, String mainTypeName) throws JavaModelException {
-		return javaProject.findType(mainTypeName);
-	}
-	
-	/**
-	 * Override to create a custom VMRunnerConfiguration for a launch configuration.
-	 */
-	protected abstract VMRunnerConfiguration createVMRunner(ILaunchConfiguration configuration, IType[] testTypes, int port, String runMode) throws CoreException;
-
-	protected boolean keepAlive(ILaunchConfiguration config) {
-		try {
-			return config.getAttribute(ATTR_KEEPRUNNING, false);
-		} catch(CoreException e) {
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchConfiguration.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchConfiguration.java
deleted file mode 100644
index 0ced46e..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchConfiguration.java
+++ /dev/null
@@ -1,151 +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.jdt.internal.junit.launcher;
-
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Vector;
-
-import org.eclipse.core.boot.BootLoader;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IPluginRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchManager;
-
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.launching.ExecutionArguments;
-import org.eclipse.jdt.launching.VMRunnerConfiguration;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-
-/**
- * Launch configuration delegate for a plain JUnit test.
- */
-public class JUnitLaunchConfiguration extends JUnitBaseLaunchConfiguration {
-	public static final String ID_JUNIT_APPLICATION= "org.eclipse.jdt.junit.launchconfig"; //$NON-NLS-1$
-	/**
-	 * Add a VMRunner with a class path that includes org.eclipse.jdt.junit plugin.
-	 * In addition it adds the port for the RemoteTestRunner as an argument
-	 */
-	protected VMRunnerConfiguration createVMRunner(ILaunchConfiguration configuration, IType[] testTypes, int port, String runMode) throws CoreException {
-		String[] classPath= createClassPath(configuration);	
-		String progArgs= getProgramArguments(configuration);
-		VMRunnerConfiguration vmConfig= new VMRunnerConfiguration("org.eclipse.jdt.internal.junit.runner.RemoteTestRunner", classPath); //$NON-NLS-1$
-		String testName= configuration.getAttribute(JUnitBaseLaunchConfiguration.TESTNAME_ATTR, ""); //$NON-NLS-1$
-		
-		// insert the program arguments
-		Vector argv= new Vector(10);
-		ExecutionArguments execArgs = new ExecutionArguments("", progArgs); //$NON-NLS-1$
-		String[] pa= execArgs.getProgramArgumentsArray();
-		for (int i= 0; i < pa.length; i++) {
-			argv.add(pa[i]);
-		}
-	
-		argv.add("-version"); //$NON-NLS-1$
-		argv.add("3"); //$NON-NLS-1$
-		
-		argv.add("-port"); //$NON-NLS-1$
-		argv.add(Integer.toString(port));
-		//argv("-debugging");
-				
-		if (keepAlive(configuration) && runMode.equals(ILaunchManager.DEBUG_MODE))
-			argv.add(0, "-keepalive"); //$NON-NLS-1$
-		
-		// a testname was specified just run the single test
-		if (testName.length() > 0) {
-			argv.add("-test"); //$NON-NLS-1$
-			argv.add(testTypes[0].getFullyQualifiedName()+":"+testName);			 //$NON-NLS-1$
-		} else if (testTypes.length > 1) {
-			String fileName= createTestNamesFile(testTypes);
-			argv.add("-testNameFile"); //$NON-NLS-1$
-			argv.add(fileName);
-		} else {
-			argv.add("-classNames"); //$NON-NLS-1$
-			for (int i= 0; i < testTypes.length; i++) 
-				argv.add(testTypes[i].getFullyQualifiedName());
-		}
-		String[] args= new String[argv.size()];
-		argv.copyInto(args);
-		vmConfig.setProgramArguments(args);
-		return vmConfig;
-	}
-
-	private String createTestNamesFile(IType[] testTypes) throws CoreException {
-		try {
-			File file= File.createTempFile("testNames", ".txt"); //$NON-NLS-1$ //$NON-NLS-2$
-			file.deleteOnExit();
-			BufferedWriter bw= null;
-			try {
-				bw= new BufferedWriter(new FileWriter(file));
-				for (int i= 0; i < testTypes.length; i++) {
-					String testName= testTypes[i].getFullyQualifiedName();
-					bw.write(testName);
-					bw.newLine();
-				}
-			} finally {
-				if (bw != null) {
-					bw.close();
-				}
-			}
-			return file.getAbsolutePath();
-		} catch (IOException e) {
-			throw new CoreException(new Status(IStatus.ERROR, JUnitPlugin.PLUGIN_ID, IStatus.ERROR, "", e)); //$NON-NLS-1$
-		}
-	}
-	
-	private String[] createClassPath(ILaunchConfiguration configuration) throws CoreException {
-		IPluginRegistry registry= Platform.getPluginRegistry();
-		IPluginDescriptor descriptor= registry.getPluginDescriptor("org.eclipse.jdt.junit.runtime"); //$NON-NLS-1$
-		URL runtimeURL= descriptor.getInstallURL();
-		
-		URL url= JUnitPlugin.getDefault().getDescriptor().getInstallURL();
-		
-		String[] cp= getClasspath(configuration);
-		String[] classPath= null;
-		
-		try {
-			if (BootLoader.inDevelopmentMode()) {
-				// assumption is that the output folder is called bin!
-				classPath= new String[cp.length + 4];
-				System.arraycopy(cp, 0, classPath, 4, cp.length);
-				classPath[0]= Platform.asLocalURL(new URL(url, "bin")).getFile(); //$NON-NLS-1$
-				classPath[1]= Platform.asLocalURL(new URL(url, "junitsupport.jar")).getFile(); //$NON-NLS-1$
-				classPath[2]= Platform.asLocalURL(new URL(runtimeURL, "bin")).getFile(); //$NON-NLS-1$
-				classPath[3]= Platform.asLocalURL(new URL(runtimeURL, "junitruntime.jar")).getFile(); //$NON-NLS-1$
-			}
-			else {
-				classPath= new String[cp.length + 2];
-				System.arraycopy(cp, 0, classPath, 2, cp.length);
-				classPath[0]= Platform.asLocalURL(new URL(url, "junitsupport.jar")).getFile(); //$NON-NLS-1$
-				classPath[1]= Platform.asLocalURL(new URL(runtimeURL, "junitruntime.jar")).getFile(); //$NON-NLS-1$
-			}
-		} catch (IOException e) {
-			JUnitPlugin.log(e); // TODO abort run and inform user
-		}
-		return classPath;
-	}	
-	
-	
-	
-	
-	
-		
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchConfigurationTab.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchConfigurationTab.java
deleted file mode 100644
index ded4098..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchConfigurationTab.java
+++ /dev/null
@@ -1,93 +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.jdt.internal.junit.launcher;
-
- 
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
-import org.eclipse.jdt.internal.ui.util.SWTUtil;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.*;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-
-/**
- * Common function for Java launch configuration tabs.
- */
-public abstract class JUnitLaunchConfigurationTab extends AbstractLaunchConfigurationTab {
-		
-	/**
-	 * Returns the current Java element context from which to initialize
-	 * default settings, or <code>null</code> if none.
-	 * 
-	 * @return Java element context.
-	 */
-	protected IJavaElement getContext() {
-		IWorkbenchPage page = JDIDebugUIPlugin.getActivePage();
-		if (page != null) {
-			ISelection selection = page.getSelection();
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection ss = (IStructuredSelection)selection;
-				if (!ss.isEmpty()) {
-					Object obj = ss.getFirstElement();
-					if (obj instanceof IJavaElement) {
-						return (IJavaElement)obj;
-					}
-					if (obj instanceof IResource) {
-						IJavaElement je = JavaCore.create((IResource)obj);
-						if (je == null) {
-							IProject pro = ((IResource)obj).getProject();
-							je = JavaCore.create(pro);
-						}
-						if (je != null) {
-							return je;
-						}
-					}
-				}
-			}
-			IEditorPart part = page.getActiveEditor();
-			if (part != null) {
-				IEditorInput input = part.getEditorInput();
-				return (IJavaElement) input.getAdapter(IJavaElement.class);
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Set the java project attribute based on the IJavaElement.
-	 */
-	protected void initializeJavaProject(IJavaElement javaElement, ILaunchConfigurationWorkingCopy config) {
-		IJavaProject javaProject = javaElement.getJavaProject();
-		String name = null;
-		if (javaProject != null && javaProject.exists()) {
-			name = javaProject.getElementName();
-		}
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, name);
-	}
-
-	protected void setButtonGridData(Button button) {
-		GridData gridData= new GridData();
-		button.setLayoutData(gridData);
-		SWTUtil.setButtonDimensionHint(button);
-	}
-	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchShortcut.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchShortcut.java
deleted file mode 100644
index a4b0e6f..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitLaunchShortcut.java
+++ /dev/null
@@ -1,320 +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.jdt.internal.junit.launcher;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.ILaunchShortcut;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.debug.ui.JavaUISourceLocator;
-import org.eclipse.jdt.internal.junit.ui.JUnitMessages;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.junit.util.TestSearchEngine;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-
-public class JUnitLaunchShortcut implements ILaunchShortcut {
-	
-	/**
-	 * @see ILaunchShortcut#launch(IEditorPart, String)
-	 */
-	public void launch(IEditorPart editor, String mode) {
-		IJavaElement element= null;
-		IEditorInput input = editor.getEditorInput();
-		element = (IJavaElement) input.getAdapter(IJavaElement.class);
-
-		if (element != null) {
-			searchAndLaunch(new Object[] {element}, mode);
-		} 
-	}
-	
-	/**
-	 * @see ILaunchShortcut#launch(ISelection, String)
-	 */
-	public void launch(ISelection selection, String mode) {
-		if (selection instanceof IStructuredSelection) {
-			searchAndLaunch(((IStructuredSelection)selection).toArray(), mode);
-		} 
-	}
-
-	protected void searchAndLaunch(Object[] search, String mode) {
-		if (search != null) {
-			if (search.length == 0) {
-				MessageDialog.openInformation(getShell(), JUnitMessages.getString("LaunchTestAction.dialog.title"), JUnitMessages.getString("LaunchTestAction.message.notests")); //$NON-NLS-1$ //$NON-NLS-2$
-				return;
-			}	
-			if (search[0] instanceof IJavaElement) {
-				IJavaElement element= (IJavaElement)search[0];
-				if (element.getElementType() < IJavaElement.COMPILATION_UNIT) {
-					launchContainer(element, mode);
-					return;
-				}
-				if (element.getElementType() == IJavaElement.METHOD) {
-					launchMethod((IMethod)element, mode);
-					return;
-				}
-			}
-			// launch a CU or type
-			launchType(search, mode);
-		}
-	}
-	
-	protected void launchType(Object[] search, String mode) {
-		IType[] types= null;
-		try {
-			types= TestSearchEngine.findTests(new ProgressMonitorDialog(getShell()), search);
-		} catch (InterruptedException e) {
-			JUnitPlugin.log(e);
-			return;
-		} catch (InvocationTargetException e) {
-			JUnitPlugin.log(e);
-			return;
-		}
-		IType type= null;
-		if (types.length == 0) {
-			MessageDialog.openInformation(getShell(), JUnitMessages.getString("LaunchTestAction.dialog.title"), JUnitMessages.getString("LaunchTestAction.message.notests")); //$NON-NLS-1$ //$NON-NLS-2$
-		} else if (types.length > 1) {
-			type= chooseType(types, mode);
-		} else {
-			type= types[0];
-		}
-		if (type != null) {
-			launch(type, mode);
-		}
-	}
-
-	private void launchContainer(IJavaElement container, String mode) {
-		String handleIdentifier= container.getHandleIdentifier();
-		ILaunchConfiguration config = findLaunchConfiguration(
-			mode, 
-			container, 
-			handleIdentifier, 
-			"",  //$NON-NLS-1$
-			"" //$NON-NLS-1$
-		);
-		if (config == null) {
-			config = createConfiguration(
-				container.getJavaProject(),
-				container.getElementName(),
-				"", //$NON-NLS-1$
-				handleIdentifier,
-				"" //$NON-NLS-1$
-			);
-		}
-		launchConfiguration(mode, config);
-	}
-	
-	private void launch(IType type, String mode) {
-		String fullyQualifiedName= type.getFullyQualifiedName();
-		ILaunchConfiguration config = findLaunchConfiguration(
-			mode, 
-			type, 
-			"",  //$NON-NLS-1$
-			fullyQualifiedName, 
-			"" //$NON-NLS-1$
-		);
-		if (config == null) {
-			config= createConfiguration(
-				type.getJavaProject(),
-				type.getElementName(),
-				fullyQualifiedName,
-				"", //$NON-NLS-1$
-				"" //$NON-NLS-1$
-			);
-		}
-		launchConfiguration(mode, config);
-	}
-
-	private void launchMethod(IMethod method, String mode) {
-		IType declaringType= method.getDeclaringType();
-		String fullyQualifiedName= declaringType.getFullyQualifiedName();
-		ILaunchConfiguration config = findLaunchConfiguration(
-			mode, 
-			method, 
-			"",  //$NON-NLS-1$
-			fullyQualifiedName, 
-			method.getElementName()
-		);
-
-		if (config == null) {
-			config= createConfiguration(
-				method.getJavaProject(),
-				declaringType.getElementName()+"."+method.getElementName(), //$NON-NLS-1$
-				fullyQualifiedName,
-				"", //$NON-NLS-1$
-				method.getElementName()
-			);
-		}
-		launchConfiguration(mode, config);
-	}
-
-
-	protected void launchConfiguration(String mode, ILaunchConfiguration config) {
-		try { 
-			if (config != null) {
-				DebugUITools.saveAndBuildBeforeLaunch();
-				config.launch(mode, null);
-			}			
-		} catch (CoreException e) {
-			ErrorDialog.openError(getShell(), JUnitMessages.getString("LaunchTestAction.message.launchFailed"), e.getMessage(), e.getStatus());  //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Prompts the user to select a type
-	 * 
-	 * @return the selected type or <code>null</code> if none.
-	 */
-	protected IType chooseType(IType[] types, String mode) {
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_POST_QUALIFIED));
-		dialog.setElements(types);
-		dialog.setTitle(JUnitMessages.getString("LaunchTestAction.dialog.title2")); //$NON-NLS-1$
-		if (mode.equals(ILaunchManager.DEBUG_MODE)) {
-			dialog.setMessage(JUnitMessages.getString("LaunchTestAction.message.selectTestToRun"));  //$NON-NLS-1$
-		} else {
-			dialog.setMessage(JUnitMessages.getString("LaunchTestAction.message.selectTestToDebug")); //$NON-NLS-1$
-		}
-		dialog.setMultipleSelection(false);
-		if (dialog.open() == ElementListSelectionDialog.OK) {
-			return (IType)dialog.getFirstResult();
-		}
-		return null;
-	}
-	
-	private ILaunchConfiguration findLaunchConfiguration(String mode, IJavaElement element, String container, String testClass, String testName) {
-		ILaunchConfigurationType configType= getJUnitLaunchConfigType();
-		List candidateConfigs= Collections.EMPTY_LIST;
-		try {
-			ILaunchConfiguration[] configs= getLaunchManager().getLaunchConfigurations(configType);
-			candidateConfigs= new ArrayList(configs.length);
-			for (int i= 0; i < configs.length; i++) {
-				ILaunchConfiguration config= configs[i];
-				if ((config.getAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, "").equals(container)) && //$NON-NLS-1$
-					(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "").equals(testClass)) && //$NON-NLS-1$
-					(config.getAttribute(JUnitBaseLaunchConfiguration.TESTNAME_ATTR,"").equals(testName)) &&   //$NON-NLS-1$
-					(config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "").equals(element.getJavaProject().getElementName()))) {  //$NON-NLS-1$
-						candidateConfigs.add(config);
-				}
-			}
-		} catch (CoreException e) {
-			JUnitPlugin.log(e);
-		}
-		
-		// If there are no existing configs associated with the IType, create one.
-		// If there is exactly one config associated with the IType, return it.
-		// Otherwise, if there is more than one config associated with the IType, prompt the
-		// user to choose one.
-		int candidateCount= candidateConfigs.size();
-		if (candidateCount < 1) {
-			return null;
-		} else if (candidateCount == 1) {
-			return (ILaunchConfiguration) candidateConfigs.get(0);
-		} else {
-			// Prompt the user to choose a config.  A null result means the user
-			// cancelled the dialog, in which case this method returns null,
-			// since cancelling the dialog should also cancel launching anything.
-			ILaunchConfiguration config= chooseConfiguration(candidateConfigs, mode);
-			if (config != null) {
-				return config;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Show a selection dialog that allows the user to choose one of the specified
-	 * launch configurations.  Return the chosen config, or <code>null</code> if the
-	 * user cancelled the dialog.
-	 */
-	protected ILaunchConfiguration chooseConfiguration(List configList, String mode) {
-		IDebugModelPresentation labelProvider = DebugUITools.newDebugModelPresentation();
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), labelProvider);
-		dialog.setElements(configList.toArray());
-		dialog.setTitle(JUnitMessages.getString("LaunchTestAction.message.selectConfiguration")); //$NON-NLS-1$
-		if (mode.equals(ILaunchManager.DEBUG_MODE)) {
-			dialog.setMessage(JUnitMessages.getString("LaunchTestAction.message.selectDebugConfiguration")); //$NON-NLS-1$
-		} else {
-			dialog.setMessage(JUnitMessages.getString("LaunchTestAction.message.selectRunConfiguration")); //$NON-NLS-1$
-		}
-		dialog.setMultipleSelection(false);
-		int result= dialog.open();
-		labelProvider.dispose();
-		if (result == ElementListSelectionDialog.OK) {
-			return (ILaunchConfiguration)dialog.getFirstResult();
-		}
-		return null;		
-	}
-	
-
-	protected ILaunchConfiguration createConfiguration(
-			IJavaProject project, String name, String mainType, 
-			String container, String testName) {
-				
-		ILaunchConfiguration config= null;
-		try {
-			ILaunchConfigurationType configType= getJUnitLaunchConfigType();
-			ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, getLaunchManager().generateUniqueLaunchConfigurationNameFrom(name)); 
-			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, mainType);
-			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, project.getElementName());
-			wc.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, JavaUISourceLocator.ID_PROMPTING_JAVA_SOURCE_LOCATOR);
-			wc.setAttribute(JUnitBaseLaunchConfiguration.ATTR_KEEPRUNNING, false);
-			wc.setAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, container);
-			if (testName.length() > 0)
-				wc.setAttribute(JUnitBaseLaunchConfiguration.TESTNAME_ATTR, testName);	
-			config= wc.doSave();		
-		} catch (CoreException ce) {
-			JUnitPlugin.log(ce);
-		}
-		return config;
-	}
-	
-	/**
-	 * Returns the local java launch config type
-	 */
-	protected ILaunchConfigurationType getJUnitLaunchConfigType() {
-		ILaunchManager lm= DebugPlugin.getDefault().getLaunchManager();
-		return lm.getLaunchConfigurationType(JUnitLaunchConfiguration.ID_JUNIT_APPLICATION);		
-	}	
-	
-	protected ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
-	}
-	
-	/**
-	 * Convenience method to get the window that owns this action's Shell.
-	 */
-	protected Shell getShell() {
-		return JUnitPlugin.getActiveWorkbenchShell();
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitMainTab.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitMainTab.java
deleted file mode 100644
index 304d306..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitMainTab.java
+++ /dev/null
@@ -1,676 +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
- *     Sebastian Davids: sdavids@gmx.de bug: 26293, 27889 
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.launcher;
-
- 
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.dialogs.SelectionDialog;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.ISourceReference;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.JavaElementSorter;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitMessages;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.junit.util.TestSearchEngine;
-import org.eclipse.jdt.internal.ui.util.BusyIndicatorRunnableContext;
-import org.eclipse.jdt.internal.ui.wizards.TypedElementSelectionValidator;
-import org.eclipse.jdt.internal.ui.wizards.TypedViewerFilter;
-
-/**
- * This tab appears in the LaunchConfigurationDialog for launch configurations that
- * require Java-specific launching information such as a main type and JRE.
- */
-public class JUnitMainTab extends JUnitLaunchConfigurationTab {
-	
-	// Project UI widgets
-	private Label fProjLabel;
-	private Text fProjText;
-	private Button fProjButton;
-	private Button fKeepRunning;
-	
-	// Test class UI widgets
-	private Text fTestText;
-	private Button fSearchButton;
-	private final Image fTestIcon= createImage("obj16/test.gif"); //$NON-NLS-1$
-	private Label fTestMethodLabel;
-	private Text fContainerText;
-	private IJavaElement fContainerElement;
-	private final ILabelProvider fJavaElementLabelProvider= new JavaElementLabelProvider();
-
-	private Button fContainerSearchButton;
-	private Button fTestContainerRadioButton;
-	private Button fTestRadioButton;
-	private Label fTestLabel; 
-	
-	/**
-	 * @see ILaunchConfigurationTab#createControl(TabItem)
-	 */
-	public void createControl(Composite parent) {		
-		Composite comp = new Composite(parent, SWT.NONE);
-		setControl(comp);
-
-		GridLayout topLayout = new GridLayout();
-		topLayout.numColumns= 3;
-		comp.setLayout(topLayout);		
-		
-		Label label = new Label(comp, SWT.NONE);
-		GridData gd = new GridData();
-		gd.horizontalSpan = 3;
-		label.setLayoutData(gd);
-		
-		createSingleTestSection(comp);
-		createTestContainerSelectionGroup(comp);
-		
-		label = new Label(comp, SWT.NONE);
-		gd = new GridData();
-		gd.horizontalSpan = 3;
-		label.setLayoutData(gd);
-		
-		createKeepAliveGroup(comp);
-		Dialog.applyDialogFont(comp);
-		validatePage();
-	}
-	
-	protected void createSingleTestSection(Composite comp) {
-		fTestRadioButton= new Button(comp, SWT.RADIO);
-		fTestRadioButton.setText(JUnitMessages.getString("JUnitMainTab.label.oneTest")); //$NON-NLS-1$
-		GridData gd = new GridData();
-		gd.horizontalSpan = 3;
-		fTestRadioButton.setLayoutData(gd); 
-		fTestRadioButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (fTestRadioButton.getSelection())
-					testModeChanged();
-			}
-		});
-		
-		fProjLabel = new Label(comp, SWT.NONE);
-		fProjLabel.setText(JUnitMessages.getString("JUnitMainTab.label.project")); //$NON-NLS-1$
-		gd= new GridData();
-		gd.horizontalIndent = 25;
-		fProjLabel.setLayoutData(gd);
-		
-		fProjText= new Text(comp, SWT.SINGLE | SWT.BORDER);
-		fProjText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		fProjText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent evt) {
-				validatePage();
-				updateLaunchConfigurationDialog();				
-				fSearchButton.setEnabled(fTestRadioButton.getSelection() && fProjText.getText().length() > 0);
-			}
-		});
-			
-		fProjButton = new Button(comp, SWT.PUSH);
-		fProjButton.setText(JUnitMessages.getString("JUnitMainTab.label.browse")); //$NON-NLS-1$
-		fProjButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleProjectButtonSelected();
-			}
-		});
-		setButtonGridData(fProjButton);
-		
-		fTestLabel = new Label(comp, SWT.NONE);
-		gd = new GridData();
-		gd.horizontalIndent = 25;
-		fTestLabel.setLayoutData(gd);
-		fTestLabel.setText(JUnitMessages.getString("JUnitMainTab.label.test")); //$NON-NLS-1$
-		
-	
-		fTestText = new Text(comp, SWT.SINGLE | SWT.BORDER);
-		fTestText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		fTestText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent evt) {
-				validatePage();
-				updateLaunchConfigurationDialog();
-			}
-		});
-		
-		fSearchButton = new Button(comp, SWT.PUSH);
-		fSearchButton.setEnabled(fProjText.getText().length() > 0);		
-		fSearchButton.setText(JUnitMessages.getString("JUnitMainTab.label.search")); //$NON-NLS-1$
-		fSearchButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleSearchButtonSelected();
-			}
-		});
-		setButtonGridData(fSearchButton);
-		
-		new Label(comp, SWT.NONE);
-		
-		fTestMethodLabel= new Label(comp, SWT.NONE);
-		fTestMethodLabel.setText("");  //$NON-NLS-1$
-		gd= new GridData();
-		gd.horizontalSpan = 2;
-		fTestMethodLabel.setLayoutData(gd);
-		
-	}
-
-	protected void createTestContainerSelectionGroup(Composite comp) {
-		fTestContainerRadioButton= new Button(comp, SWT.RADIO);
-		fTestContainerRadioButton.setText(JUnitMessages.getString("JUnitMainTab.label.containerTest")); //$NON-NLS-1$
-		GridData gd = new GridData();
-		gd.horizontalSpan = 3;
-		fTestContainerRadioButton.setLayoutData(gd);
-		fTestContainerRadioButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				if (fTestContainerRadioButton.getSelection())
-					testModeChanged();
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		
-		fContainerText = new Text(comp, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalIndent= 25;
-		gd.horizontalSpan = 2;
-		fContainerText.setLayoutData(gd);
-		fContainerText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent evt) {
-				updateLaunchConfigurationDialog();
-			}
-		});
-		
-		fContainerSearchButton = new Button(comp, SWT.PUSH);
-		fContainerSearchButton.setText(JUnitMessages.getString("JUnitMainTab.label.search")); //$NON-NLS-1$
-		fContainerSearchButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleContainerSearchButtonSelected();
-			}
-		});
-		setButtonGridData(fContainerSearchButton);	
-	}
-
-	private void handleContainerSearchButtonSelected() {
-		IJavaElement javaElement= chooseContainer(fContainerElement);
-		if (javaElement != null) {
-			fContainerElement= javaElement;
-			fContainerText.setText(getPresentationName(javaElement));
-			validatePage();
-			updateLaunchConfigurationDialog();
-		}
-	}
-
-	public void createKeepAliveGroup(Composite comp) {
-		GridData gd;
-		fKeepRunning = new Button(comp, SWT.CHECK);
-		fKeepRunning.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				updateLaunchConfigurationDialog();
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		fKeepRunning.setText(JUnitMessages.getString("JUnitMainTab.label.keeprunning")); //$NON-NLS-1$
-		gd= new GridData();
-		gd.horizontalAlignment= GridData.FILL;
-		gd.horizontalSpan= 2;
-		fKeepRunning.setLayoutData(gd);
-	}
-
-
-	
-	protected static Image createImage(String path) {
-		try {
-			ImageDescriptor id= ImageDescriptor.createFromURL(JUnitPlugin.makeIconFileURL(path));
-			return id.createImage();
-		} catch (MalformedURLException e) {
-			// fall through
-		}  
-		return null;
-	}
-
-
-	/**
-	 * @see ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration config) {
-		updateProjectFromConfig(config);
-		String containerHandle= ""; //$NON-NLS-1$
-		try {
-			containerHandle = config.getAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, ""); //$NON-NLS-1$
-		} catch (CoreException ce) {			
-		}
-		
-		if (containerHandle.length() > 0)
-			updateTestContainerFromConfig(config);
-		else
-			updateTestTypeFromConfig(config);
-		updateKeepRunning(config);
-	}
-
-	private void updateKeepRunning(ILaunchConfiguration config) {
-		boolean running= false;
-		try {
-			running= config.getAttribute(JUnitBaseLaunchConfiguration.ATTR_KEEPRUNNING, false);
-		} catch (CoreException ce) {
-		}
-		fKeepRunning.setSelection(running);	 	
-	}
-	
-	protected void updateProjectFromConfig(ILaunchConfiguration config) {
-		String projectName= ""; //$NON-NLS-1$
-		try {
-			projectName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
-		} catch (CoreException ce) {
-		}
-		fProjText.setText(projectName);
-	}
-	
-	protected void updateTestTypeFromConfig(ILaunchConfiguration config) {
-		String testTypeName= ""; //$NON-NLS-1$
-		String testMethodName= ""; //$NON-NLS-1$
-		try {
-			testTypeName = config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, ""); //$NON-NLS-1$
-			testMethodName = config.getAttribute(JUnitBaseLaunchConfiguration.TESTNAME_ATTR, ""); //$NON-NLS-1$
-		} catch (CoreException ce) {			
-		}
-		fTestRadioButton.setSelection(true);
-		setEnableSingleTestGroup(true);
-		setEnableContainerTestGroup(false);		
-		fTestContainerRadioButton.setSelection(false);
-		fTestText.setText(testTypeName);
-		fContainerText.setText(""); //$NON-NLS-1$
-		if (!"".equals(testMethodName)) { //$NON-NLS-1$
-			fTestMethodLabel.setText(JUnitMessages.getString("JUnitMainTab.label.method")+testMethodName); //$NON-NLS-1$
-		} else {
-			fTestMethodLabel.setText(""); //$NON-NLS-1$
-		}
-		
-	}
-
-	protected void updateTestContainerFromConfig(ILaunchConfiguration config) {
-		String containerHandle= ""; //$NON-NLS-1$
-		try {
-			containerHandle = config.getAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, ""); //$NON-NLS-1$
-			if (containerHandle.length() > 0) {
-				fContainerElement= JavaCore.create(containerHandle);
-			}
-		} catch (CoreException ce) {			
-		}
-		fTestContainerRadioButton.setSelection(true);
-		setEnableSingleTestGroup(false);
-		setEnableContainerTestGroup(true);				
-		fTestRadioButton.setSelection(false);
-		if (fContainerElement != null)
-			fContainerText.setText(getPresentationName(fContainerElement));
-		fTestText.setText(""); //$NON-NLS-1$
-	}
-	/**
-	 * @see ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy config) {
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, fProjText.getText());
-		if (fTestContainerRadioButton.getSelection() && fContainerElement != null) {
-			config.setAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, fContainerElement.getHandleIdentifier());
-			//bug 26293
-			config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, ""); //$NON-NLS-1$
-		} else {
-			config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, fTestText.getText());
-			//bug 26293
-			config.setAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, ""); //$NON-NLS-1$			
-		}
-		config.setAttribute(JUnitBaseLaunchConfiguration.ATTR_KEEPRUNNING, fKeepRunning.getSelection());
-	}
-
-	/**
-	 * @see ILaunchConfigurationTab#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		fTestIcon.dispose();
-		fJavaElementLabelProvider.dispose();
-	}
-
-	/**
-	 * @see AbstractLaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return fTestIcon;
-	}
-
-	/**
-	 * Show a dialog that lists all main types
-	 */
-	protected void handleSearchButtonSelected() {
-		Shell shell = getShell();
-		
-		IJavaProject javaProject = getJavaProject();
-		SelectionDialog dialog = new TestSelectionDialog(shell, new ProgressMonitorDialog(shell), javaProject);
-		dialog.setTitle(JUnitMessages.getString("JUnitMainTab.testdialog.title")); //$NON-NLS-1$
-		dialog.setMessage(JUnitMessages.getString("JUnitMainTab.testdialog.message")); //$NON-NLS-1$
-		if (dialog.open() == SelectionDialog.CANCEL) {
-			return;
-		}
-		
-		Object[] results = dialog.getResult();
-		if ((results == null) || (results.length < 1)) {
-			return;
-		}		
-		IType type = (IType)results[0];
-		
-		if (type != null) {
-			fTestText.setText(type.getFullyQualifiedName());
-			javaProject = type.getJavaProject();
-			fProjText.setText(javaProject.getElementName());
-		}
-	}
-		
-	/**
-	 * Show a dialog that lets the user select a project.  This in turn provides
-	 * context for the main type, allowing the user to key a main type name, or
-	 * constraining the search for main types to the specified project.
-	 */
-	protected void handleProjectButtonSelected() {
-		IJavaProject project = chooseJavaProject();
-		if (project == null) {
-			return;
-		}
-		
-		String projectName = project.getElementName();
-		fProjText.setText(projectName);		
-	}
-	
-	/**
-	 * Realize a Java Project selection dialog and return the first selected project,
-	 * or null if there was none.
-	 */
-	protected IJavaProject chooseJavaProject() {
-		IJavaProject[] projects;
-		try {
-			projects= JavaCore.create(getWorkspaceRoot()).getJavaProjects();
-		} catch (JavaModelException e) {
-			JUnitPlugin.log(e.getStatus());
-			projects= new IJavaProject[0];
-		}
-		
-		ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), labelProvider);
-		dialog.setTitle(JUnitMessages.getString("JUnitMainTab.projectdialog.title")); //$NON-NLS-1$
-		dialog.setMessage(JUnitMessages.getString("JUnitMainTab.projectdialog.message")); //$NON-NLS-1$
-		dialog.setElements(projects);
-		
-		IJavaProject javaProject = getJavaProject();
-		if (javaProject != null) {
-			dialog.setInitialSelections(new Object[] { javaProject });
-		}
-		if (dialog.open() == ElementListSelectionDialog.OK) {			
-			return (IJavaProject) dialog.getFirstResult();
-		}			
-		return null;		
-	}
-	
-	/**
-	 * Return the IJavaProject corresponding to the project name in the project name
-	 * text field, or null if the text does not match a project name.
-	 */
-	protected IJavaProject getJavaProject() {
-		String projectName = fProjText.getText().trim();
-		if (projectName.length() < 1) {
-			return null;
-		}
-		return getJavaModel().getJavaProject(projectName);		
-	}
-	
-	/**
-	 * Convenience method to get the workspace root.
-	 */
-	private IWorkspaceRoot getWorkspaceRoot() {
-		return ResourcesPlugin.getWorkspace().getRoot();
-	}
-	
-	/**
-	 * Convenience method to get access to the java model.
-	 */
-	private IJavaModel getJavaModel() {
-		return JavaCore.create(getWorkspaceRoot());
-	}
-
-	/**
-	 * @see ILaunchConfigurationTab#isValid(ILaunchConfiguration)
-	 */
-	public boolean isValid(ILaunchConfiguration config) {		
-		return getErrorMessage() == null;
-	}
-	
-	private void testModeChanged() {
-		boolean isSingleTestMode= fTestRadioButton.getSelection();
-		setEnableSingleTestGroup(isSingleTestMode);
-		setEnableContainerTestGroup(!isSingleTestMode);
-		validatePage();
-		updateLaunchConfigurationDialog();
-	}
-
-	private void validatePage() {
-		setErrorMessage(null);
-		setMessage(null);
-		
-		if (fTestContainerRadioButton.getSelection()) {
-			if (fContainerElement == null)
-				setErrorMessage(JUnitMessages.getString("JUnitMainTab.error.noContainer")); //$NON-NLS-1$
-			return;
-		} 
-		
-		String projectName = fProjText.getText().trim();
-		if (projectName.length() == 0) {
-			setErrorMessage(JUnitMessages.getString("JUnitMainTab.error.projectnotdefined")); //$NON-NLS-1$
-			return;
-		}
-			
-		IProject project = getWorkspaceRoot().getProject(projectName);
-		if (!project.exists()) {
-			setErrorMessage(JUnitMessages.getString("JUnitMainTab.error.projectnotexists")); //$NON-NLS-1$
-			return;
-		}
-		
-		try {
-			if (!project.hasNature(JavaCore.NATURE_ID)) {
-				setErrorMessage(JUnitMessages.getString("JUnitMainTab.error.notJavaProject")); //$NON-NLS-1$
-				return;
-			}
-			IJavaProject jProject = getJavaProject();
-			String className = fTestText.getText().trim();
-			if (className.length() == 0) {
-				setErrorMessage(JUnitMessages.getString("JUnitMainTab.error.testnotdefined")); //$NON-NLS-1$
-				return;
-			}
-			IType type = jProject.findType(className);
-			if (type == null)
-				setErrorMessage(JUnitMessages.getString("JUnitMainTab.error.testnotexists")); //$NON-NLS-1$
-			else if (!TestSearchEngine.isTestOrTestSuite(type))
-				setErrorMessage(JUnitMessages.getString("JUnitMainTab.error.invalidTest")); //$NON-NLS-1$
-		} catch (Exception e) {
-		}
-	}
-
-	private void setEnableContainerTestGroup(boolean enabled) {
-		fContainerSearchButton.setEnabled(enabled);
-		fContainerText.setEnabled(enabled);
-	}
-
-	private void setEnableSingleTestGroup(boolean enabled) {
-		fProjLabel.setEnabled(enabled);
-		fProjText.setEnabled(enabled);
-		fProjButton.setEnabled(enabled);
-		fTestLabel.setEnabled(enabled);
-		fTestText.setEnabled(enabled);
-		fSearchButton.setEnabled(enabled && fProjText.getText().length() > 0);
-		fTestMethodLabel.setEnabled(enabled);
-	}
-
-	/**
-	 * @see ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy config) {
-		IJavaElement javaElement = getContext();
-		if (javaElement != null) {
-			initializeJavaProject(javaElement, config);
-		} else {
-			// We set empty attributes for project & main type so that when one config is
-			// compared to another, the existence of empty attributes doesn't cause an
-			// incorrect result (the performApply() method can result in empty values
-			// for these attributes being set on a config if there is nothing in the
-			// corresponding text boxes)
-			config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
-			config.setAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, ""); //$NON-NLS-1$
-		}
-		initializeTestAttributes(javaElement, config);
-	}
-
-	private void initializeTestAttributes(IJavaElement javaElement, ILaunchConfigurationWorkingCopy config) {
-		if (javaElement != null && javaElement.getElementType() < IJavaElement.COMPILATION_UNIT) 
-			initializeTestContainer(javaElement, config);
-		else
-			initializeTestType(javaElement, config);
-	}
-
-	private void initializeTestContainer(IJavaElement javaElement, ILaunchConfigurationWorkingCopy config) {
-		config.setAttribute(JUnitBaseLaunchConfiguration.LAUNCH_CONTAINER_ATTR, javaElement.getHandleIdentifier());
-		initializeName(config, javaElement.getElementName());
-	}
-
-	private void initializeName(ILaunchConfigurationWorkingCopy config, String name) {
-		if (name == null) {
-			name= ""; //$NON-NLS-1$
-		}
-		if (name.length() > 0) {
-			int index = name.lastIndexOf('.');
-			if (index > 0) {
-				name = name.substring(index + 1);
-			}
-			name= getLaunchConfigurationDialog().generateName(name);
-			config.rename(name);
-		}
-	}
-
-	/**
-	 * Set the main type & name attributes on the working copy based on the IJavaElement
-	 */
-	protected void initializeTestType(IJavaElement javaElement, ILaunchConfigurationWorkingCopy config) {
-		String name= ""; //$NON-NLS-1$
-		try {
-			// we only do a search for compilation units or class files or 
-			// or source references
-			if ((javaElement instanceof ICompilationUnit) || 
-				(javaElement instanceof ISourceReference) ||
-				(javaElement instanceof IClassFile)) {
-		
-				IType[] types = TestSearchEngine.findTests(new BusyIndicatorRunnableContext(), new Object[] {javaElement});
-				if ((types == null) || (types.length < 1)) {
-					return;
-				}
-				// Simply grab the first main type found in the searched element
-				name = types[0].getFullyQualifiedName();
-			}	
-		} catch (InterruptedException ie) {
-		} catch (InvocationTargetException ite) {
-		}
-		if (name == null)
-			name= ""; //$NON-NLS-1$
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, name);
-		initializeName(config, name);
-	}
-	
-	/**
-	 * @see ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return JUnitMessages.getString("JUnitMainTab.tab.label"); //$NON-NLS-1$
-	}
-	
-	private IJavaElement chooseContainer(IJavaElement initElement) {
-		Class[] acceptedClasses= new Class[] { IPackageFragmentRoot.class, IJavaProject.class, IPackageFragment.class };
-		TypedElementSelectionValidator validator= new TypedElementSelectionValidator(acceptedClasses, false) {
-			public boolean isSelectedValid(Object element) {
-				return true;
-			}
-		};
-		
-		acceptedClasses= new Class[] { IJavaModel.class, IPackageFragmentRoot.class, IJavaProject.class, IPackageFragment.class };
-		ViewerFilter filter= new TypedViewerFilter(acceptedClasses) {
-			public boolean select(Viewer viewer, Object parent, Object element) {
-				return super.select(viewer, parent, element);
-			}
-		};		
-
-		StandardJavaElementContentProvider provider= new StandardJavaElementContentProvider();
-		ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT); 
-		ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(getShell(), labelProvider, provider);
-		dialog.setValidator(validator);
-		dialog.setSorter(new JavaElementSorter());
-		dialog.setTitle(JUnitMessages.getString("JUnitMainTab.folderdialog.title"));  //$NON-NLS-1$
-		dialog.setMessage(JUnitMessages.getString("JUnitMainTab.folderdialog.message"));  //$NON-NLS-1$
-		dialog.addFilter(filter);
-		dialog.setInput(JavaCore.create(getWorkspaceRoot()));
-		dialog.setInitialSelection(initElement);
-		dialog.setAllowMultiple(false);
-		
-		if (dialog.open() == ElementTreeSelectionDialog.OK) {
-			Object element= dialog.getFirstResult();
-			return (IJavaElement)element;
-		}
-		return null;
-	}
-	
-	private String getPresentationName(IJavaElement element) {
-		return fJavaElementLabelProvider.getText(element);
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitTabGroup.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitTabGroup.java
deleted file mode 100644
index db6c57c..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/JUnitTabGroup.java
+++ /dev/null
@@ -1,48 +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.jdt.internal.junit.launcher;
-
- 
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.EnvironmentTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaJRETab;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaSourceLookupTab;
- 
-public class JUnitTabGroup extends AbstractLaunchConfigurationTabGroup {
-	/**
-	 * @see ILaunchConfigurationTabGroup#createTabs(ILaunchConfigurationDialog, String)
-	 */
-	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {		
-		ILaunchConfigurationTab[] tabs= new ILaunchConfigurationTab[] {
-			new JUnitMainTab(),
-			new JavaArgumentsTab(),
-			new JavaClasspathTab(),
-			new JavaJRETab(),
-			new JavaSourceLookupTab(),
-			new EnvironmentTab(),
-			new CommonTab()
-		};
-		setTabs(tabs);
-	}
-
-	/**
-	 * @see ILaunchConfigurationTabGroup#setDefaults(ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy config) {
-		super.setDefaults(config); 
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/TestSelectionDialog.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/TestSelectionDialog.java
deleted file mode 100644
index ffe2700..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/launcher/TestSelectionDialog.java
+++ /dev/null
@@ -1,95 +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.jdt.internal.junit.launcher;
-
- 
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.TwoPaneElementSelector;
-
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.util.Assert;
-
-import org.eclipse.jdt.internal.junit.util.TestSearchEngine;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-
-/**
- * A dialog to select a test class or a test suite from a list of types.
- */
-public class TestSelectionDialog extends TwoPaneElementSelector {
-
-	private IRunnableContext fRunnableContext;
-	private IJavaProject fProject;
-	
-	private static class PackageRenderer extends JavaElementLabelProvider {
-		public PackageRenderer() {
-			super(JavaElementLabelProvider.SHOW_PARAMETERS | JavaElementLabelProvider.SHOW_POST_QUALIFIED | JavaElementLabelProvider.SHOW_ROOT);	
-		}
-
-		public Image getImage(Object element) {
-			return super.getImage(((IType)element).getPackageFragment());
-		}
-		
-		public String getText(Object element) {
-			return super.getText(((IType)element).getPackageFragment());
-		}
-	}
-	
-	/**
-	 * Constructor.
-	 */
-	public TestSelectionDialog(Shell shell, IRunnableContext context, IJavaProject project)
-	{
-		super(shell, new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_BASICS | JavaElementLabelProvider.SHOW_OVERLAY_ICONS), 
-			new PackageRenderer());
-
-		Assert.isNotNull(context);
-		Assert.isNotNull(project);
-
-		fRunnableContext= context;
-		fProject= project;
-	}
-	
-	/**
-	 * @see Windows#configureShell
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		//WorkbenchHelp.setHelp(newShell, new Object[] { IJavaHelpContextIds.MAINTYPE_SELECTION_DIALOG });
-	}
-
-	/*
-	 * @see Window#open()
-	 */
-	public int open() {
-		IType[] types= new IType[0];
-		try {
-			types= TestSearchEngine.findTests(fRunnableContext, new Object[] {fProject});
-		} catch (InterruptedException e) {
-			return CANCEL;
-		} catch (InvocationTargetException e) {
-			JUnitPlugin.log(e.getTargetException());
-			return CANCEL;
-		}
-		
-		setElements(types);
-		return super.open();
-	}
-	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CompareResultDialog.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CompareResultDialog.java
deleted file mode 100644
index f2f03b7..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CompareResultDialog.java
+++ /dev/null
@@ -1,329 +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.jdt.internal.junit.ui;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-
-import org.eclipse.compare.CompareConfiguration;
-import org.eclipse.compare.CompareViewerPane;
-import org.eclipse.compare.IStreamContentAccessor;
-import org.eclipse.compare.ITypedElement;
-import org.eclipse.compare.contentmergeviewer.ITokenComparator;
-import org.eclipse.compare.contentmergeviewer.TextMergeViewer;
-import org.eclipse.compare.rangedifferencer.IRangeComparator;
-import org.eclipse.compare.structuremergeviewer.DiffNode;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.text.TextAttribute;
-import org.eclipse.jface.text.TextPresentation;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.text.presentation.IPresentationDamager;
-import org.eclipse.jface.text.presentation.IPresentationReconciler;
-import org.eclipse.jface.text.presentation.IPresentationRepairer;
-import org.eclipse.jface.text.presentation.PresentationReconciler;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.text.source.SourceViewerConfiguration;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-public class CompareResultDialog extends Dialog {
-    private static class CompareResultMergeViewer extends TextMergeViewer {
-         private CompareResultMergeViewer(Composite parent, int style, CompareConfiguration configuration) {
-             super(parent, style, configuration);
-         }
-        protected ITokenComparator createTokenComparator(String s) {
-            return new CharacterComparator(s);
-        }
-        protected void configureTextViewer(TextViewer textViewer) {
-            if (textViewer instanceof SourceViewer) {
-                ((SourceViewer)textViewer).configure(new CompareResultViewerConfiguration());   
-            }
-        }
-    }
-    
-    public static class CompareResultViewerConfiguration extends SourceViewerConfiguration {
-        public class SimpleDamagerRepairer implements IPresentationDamager, IPresentationRepairer {
-            private IDocument fDocument;
-
-            public void setDocument(IDocument document) {
-                fDocument= document;
-            }
-
-            public IRegion getDamageRegion(ITypedRegion partition, DocumentEvent event, boolean changed) {
-                return new Region(0, fDocument.getLength());
-            }
-
-            public void createPresentation(TextPresentation presentation, ITypedRegion damage) {
-                int suffix= CompareResultDialog.fgThis.fSuffix;
-                int prefix= CompareResultDialog.fgThis.fPrefix;
-                TextAttribute attr= new TextAttribute(Display.getDefault().getSystemColor(SWT.COLOR_RED), null, SWT.BOLD);
-                presentation.addStyleRange(new StyleRange(prefix, fDocument.getLength()-suffix-prefix, attr.getForeground(), attr.getBackground(), attr.getStyle()));
-            }
-        }
-        
-        public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
-            PresentationReconciler reconciler= new PresentationReconciler();
-            SimpleDamagerRepairer dr= new SimpleDamagerRepairer();
-            reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
-            reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
-            return reconciler;
-        }
-    }
-    
-    private static class CharacterComparator implements ITokenComparator {
-        private String fSource;
-        CharacterComparator(String source) {
-            fSource= source;
-        }
-        public int getTokenStart(int index) {
-            return index;
-        }
-        public int getTokenLength(int index) {
-            return 1;
-        }
-        public int getRangeCount() {
-            return fSource.length();
-        }
-        public boolean rangesEqual(int thisIndex, IRangeComparator other, int otherIndex) {
-            CharacterComparator occ= (CharacterComparator) other;
-            return fSource.charAt(thisIndex) == occ.fSource.charAt(otherIndex);
-        }
-        public boolean skipRangeComparison(int length, int maxLength, IRangeComparator other) {
-            return false;
-        }
-    }
-    
-	private static class CompareElement implements ITypedElement, IStreamContentAccessor {
-	    private InputStream fContent;
-	    
-	    public CompareElement(String content) {
-	        fContent= createInputStream(content);
-	    }
-	    public String getName() {
-	        return "<no name>"; //$NON-NLS-1$
-	    }
-	    public Image getImage() {
-	        return null;
-	    }
-	    public String getType() {
-	        return "txt"; //$NON-NLS-1$
-	    }
-	    public InputStream getContents() {
-	        return fContent;
-	    }
-	    private static InputStream createInputStream(String s) {
-		    try {
-		        return new ByteArrayInputStream(s.getBytes(ResourcesPlugin.getEncoding()));
-		    } catch (UnsupportedEncodingException e) {
-		        return new ByteArrayInputStream(s.getBytes());
-		    }
-		}
-	}
-
-    private TextMergeViewer fViewer;
-    private String fExpected;
-    private String fActual;
-    private String fTestName;
-    
-    /* workaround - to make prefix and suffix accessible to the CompareResultViewerConfiguration */
-    private static CompareResultDialog fgThis;
-    
-    private int fPrefix;
-    private int fSuffix;
-    
-    // dialog store id constants
-    private final static String DIALOG_BOUNDS_KEY= "CompareResultDialogBounds"; //$NON-NLS-1$
-    private static final String X= "x"; //$NON-NLS-1$
-    private static final String Y= "y"; //$NON-NLS-1$
-    private static final String WIDTH= "width"; //$NON-NLS-1$
-    private static final String HEIGHT= "height"; //$NON-NLS-1$
-    private IDialogSettings fSettings;
-	protected Rectangle fNewBounds;
-	
-	public CompareResultDialog(Shell parentShell, TestRunInfo failure) {
-		super(parentShell);
-		fgThis= this;
-		setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX);
-        fTestName= failure.getTestName();
-        fExpected= failure.getExpected();
-        fActual= failure.getActual();
-        computePrefixSuffix();
-        fSettings= JUnitPlugin.getDefault().getDialogSettings();
-	}
-	
-	protected Point getInitialSize() {
-		int width= 0;
-		int height= 0;
-		
-		final Shell s= getShell();
-		if (s != null) {
-			s.addControlListener(
-					new ControlListener() {
-						public void controlMoved(ControlEvent arg) {
-							fNewBounds= s.getBounds();
-						}
-						public void controlResized(ControlEvent arg) {
-							fNewBounds= s.getBounds();
-						}
-					}
-			);
-		}
-		IDialogSettings bounds= fSettings.getSection(DIALOG_BOUNDS_KEY); 
-		if (bounds == null) {
-			return super.getInitialSize();
-		}
-		else {
-			try {
-				width= bounds.getInt(WIDTH);
-			} catch (NumberFormatException e) {
-				width= 400;
-			}
-			try {
-				height= bounds.getInt(HEIGHT);
-			} catch (NumberFormatException e) {
-				height= 300;
-			}
-		}	
-		return new Point(width, height);	
-	}
-	
-	protected Point getInitialLocation(Point initialSize) {
-		Point loc= super.getInitialLocation(initialSize);
-		
-		IDialogSettings bounds= fSettings.getSection(DIALOG_BOUNDS_KEY);
-		if (bounds != null) {
-			try {
-				loc.x= bounds.getInt(X);
-			} catch (NumberFormatException e) {
-			}
-			try {
-				loc.y= bounds.getInt(Y);
-			} catch (NumberFormatException e) {
-			}
-		}
-		return loc;
-	}
-	
-	public boolean close() {
-		boolean closed= super.close();
-		if (closed && fNewBounds != null)
-			saveBounds(fNewBounds);
-		return closed;
-	}
-
-	private void saveBounds(Rectangle bounds) {
-		IDialogSettings dialogBounds= fSettings.getSection(DIALOG_BOUNDS_KEY);
-		if (dialogBounds == null) {
-			dialogBounds= new DialogSettings(DIALOG_BOUNDS_KEY);
-			fSettings.addSection(dialogBounds);
-		}
-		dialogBounds.put(X, bounds.x);
-		dialogBounds.put(Y, bounds.y);
-		dialogBounds.put(WIDTH, bounds.width);
-		dialogBounds.put(HEIGHT, bounds.height);
-	}
-	
-	private void computePrefixSuffix() {
-		int end= Math.min(fExpected.length(), fActual.length());
-		int i= 0;
-		for(; i < end; i++) 
-			if (fExpected.charAt(i) != fActual.charAt(i))
-				break;
-		fPrefix= i;
-		
-		int j= fExpected.length()-1;
-		int k= fActual.length()-1;
-		int l= 0;
-		for (; k >= fPrefix && j >= fPrefix; k--,j--) {
-			if (fExpected.charAt(j) != fActual.charAt(k))
-				break;
-			l++;
-		}
-		fSuffix= l;
-	}
-
-    protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText(JUnitMessages.getString("CompareResultDialog.title")); //$NON-NLS-1$
-	}
-
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, JUnitMessages.getString("CompareResultDialog.labelOK"), true); //$NON-NLS-1$
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite)super.createDialogArea(parent);
-		GridLayout layout= new GridLayout();
-		layout.numColumns= 1;
-		composite.setLayout(layout);
-		
-		CompareViewerPane pane = new CompareViewerPane(composite, SWT.BORDER | SWT.FLAT);
-		pane.setText(fTestName);
-		GridData data= new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
-		data.widthHint= convertWidthInCharsToPixels(120);
-		data.heightHint= convertHeightInCharsToPixels(13);
-		pane.setLayoutData(data);
-		
-		Control previewer= createPreviewer(pane);
-		pane.setContent(previewer);
-		GridData gd= new GridData(GridData.FILL_BOTH);
-		previewer.setLayoutData(gd);
-		applyDialogFont(parent);
-		return composite;
-	}
-	
-	private Control createPreviewer(Composite parent) {
-	    final CompareConfiguration compareConfiguration= new CompareConfiguration();
-	    compareConfiguration.setLeftLabel(JUnitMessages.getString("CompareResultDialog.expectedLabel")); //$NON-NLS-1$
-	    compareConfiguration.setLeftEditable(false);
-	    compareConfiguration.setRightLabel(JUnitMessages.getString("CompareResultDialog.actualLabel"));	 //$NON-NLS-1$
-	    compareConfiguration.setRightEditable(false);
-	    compareConfiguration.setProperty(CompareConfiguration.IGNORE_WHITESPACE, new Boolean(false));
-
-	    fViewer= new CompareResultMergeViewer(parent, SWT.NONE, compareConfiguration);
-	    fViewer.setInput(new DiffNode( 
-        new CompareElement(fExpected), 
-        new CompareElement(fActual)));
-
-	    Control control= fViewer.getControl();
-	    control.addDisposeListener(new DisposeListener() {
-	        public void widgetDisposed(DisposeEvent e) {
-	            if (compareConfiguration != null)
-	                compareConfiguration.dispose();
-	        }
-	    });
-	    return  control;
-	}	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CompareResultsAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CompareResultsAction.java
deleted file mode 100644
index e00f326..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CompareResultsAction.java
+++ /dev/null
@@ -1,44 +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.jdt.internal.junit.ui;
-
-
-import org.eclipse.jface.action.Action;
-
-/**
- * Action to enable/disable stack trace filtering.
- */
-public class CompareResultsAction extends Action {
-
-	private FailureTraceView fView;	
-	
-	public CompareResultsAction(FailureTraceView view) {
-		super(JUnitMessages.getString("CompareResultsAction.label"));   //$NON-NLS-1$
-		setDescription(JUnitMessages.getString("CompareResultsAction.description"));   //$NON-NLS-1$
-		setToolTipText(JUnitMessages.getString("CompareResultsAction.tooltip"));  //$NON-NLS-1$
-		
-		setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/compare.gif"));  //$NON-NLS-1$
-		setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/compare.gif"));  //$NON-NLS-1$
-		setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/compare.gif"));  //$NON-NLS-1$
-		//WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.ENABLEFILTER_ACTION);
-		fView= view;
-		setEnabled(false);
-	}
-
-	/*
-	 * @see Action#actionPerformed
-	 */		
-	public void run() {
-		CompareResultDialog dialog= new CompareResultDialog(fView.getShell(), fView.getFailedTest());
-		dialog.create();
-		dialog.open();
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CopyFailureListAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CopyFailureListAction.java
deleted file mode 100644
index 64bd98d..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CopyFailureListAction.java
+++ /dev/null
@@ -1,60 +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.jdt.internal.junit.ui;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-
-/**
- * Copies the names of the methods that failed to the clipboard.
- */
-public class CopyFailureListAction extends Action {
-	private FailureRunView fView;
-	
-	private final Clipboard fClipboard;
-		
-	/**
-	 * Constructor for CopyFailureListAction.
-	 */
-	public CopyFailureListAction(TestRunnerViewPart runner, FailureRunView view, Clipboard clipboard) {
-		super(JUnitMessages.getString("CopyFailureList.action.label"));  //$NON-NLS-1$
-		WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.COPYFAILURELIST_ACTION);
-		fView= view;
-		fClipboard= clipboard;
-	}
-
-	/*
-	 * @see IAction#run()
-	 */
-	public void run() {
-		TextTransfer plainTextTransfer = TextTransfer.getInstance();
-					
-		try{
-			fClipboard.setContents(
-				new String[] { fView.getAllFailedTestNames() }, 
-				new Transfer[]{ plainTextTransfer });
-		}  catch (SWTError e){
-			if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) 
-				throw e;
-			if (MessageDialog.openQuestion(JavaPlugin.getActiveWorkbenchShell(), JUnitMessages.getString("CopyFailureListAction.problem"), JUnitMessages.getString("CopyFailureListAction.clipboard_busy")))  //$NON-NLS-1$ //$NON-NLS-2$
-				run();
-		}
-	}
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CopyTraceAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CopyTraceAction.java
deleted file mode 100644
index 3503706..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CopyTraceAction.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.jdt.internal.junit.ui;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.util.Assert;
-
-/**
- * Copies a test failure stack trace to the clipboard.
- */
-public class CopyTraceAction extends Action {
-	private FailureTraceView fView;
-	
-	private final Clipboard fClipboard;
-
-	/**
-	 * Constructor for CopyTraceAction.
-	 */
-	public CopyTraceAction(FailureTraceView view, Clipboard clipboard) {
-		super(JUnitMessages.getString("CopyTrace.action.label"));  //$NON-NLS-1$
-		Assert.isNotNull(clipboard);
-		WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.COPYTRACE_ACTION);
-		fView= view;
-		fClipboard= clipboard;
-	}
-
-	/*
-	 * @see IAction#run()
-	 */
-	public void run() {
-		String trace= fView.getTrace();
-		if (trace == null)
-			trace= ""; //$NON-NLS-1$
-		
-		TextTransfer plainTextTransfer = TextTransfer.getInstance();
-		try{
-			fClipboard.setContents(
-				new String[]{ convertLineTerminators(trace) }, 
-				new Transfer[]{ plainTextTransfer });
-		}  catch (SWTError e){
-			if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD) 
-				throw e;
-			if (MessageDialog.openQuestion(fView.getComposite().getShell(), JUnitMessages.getString("CopyTraceAction.problem"), JUnitMessages.getString("CopyTraceAction.clipboard_busy")))  //$NON-NLS-1$ //$NON-NLS-2$
-				run();
-		}
-	}
-	
-	private String convertLineTerminators(String in) {
-		StringWriter stringWriter= new StringWriter();
-		PrintWriter printWriter= new PrintWriter(stringWriter);
-		StringReader stringReader= new StringReader(in);
-		BufferedReader bufferedReader= new BufferedReader(stringReader);		
-		String line;
-		try {
-			while ((line= bufferedReader.readLine()) != null) {
-				printWriter.println(line);
-			}
-		} catch (IOException e) {
-			return in; // return the trace unfiltered
-		}
-		return stringWriter.toString();
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CounterPanel.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CounterPanel.java
deleted file mode 100644
index 0fbc5d6..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/CounterPanel.java
+++ /dev/null
@@ -1,114 +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.jdt.internal.junit.ui;
-
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A panel with counters for the number of Runs, Errors and Failures.
- */
-public class CounterPanel extends Composite {
-	private Text fNumberOfErrors;
-	private Text fNumberOfFailures;
-	private Text fNumberOfRuns;
-	private int fTotal;
-	
-	private final Image fErrorIcon= TestRunnerViewPart.createImage("ovr16/error_ovr.gif"); //$NON-NLS-1$
-	private final Image fFailureIcon= TestRunnerViewPart.createImage("ovr16/failed_ovr.gif"); //$NON-NLS-1$
-			
-	public CounterPanel(Composite parent) {
-		super(parent, SWT.WRAP);
-		GridLayout gridLayout= new GridLayout();
-		gridLayout.numColumns= 9;
-		gridLayout.makeColumnsEqualWidth= false;
-		gridLayout.marginWidth= 0;
-		setLayout(gridLayout);
-		
-		fNumberOfRuns= createLabel(JUnitMessages.getString("CounterPanel.label.runs"), null, " 0/0  ");  //$NON-NLS-1$ //$NON-NLS-2$
-		fNumberOfErrors= createLabel(JUnitMessages.getString("CounterPanel.label.errors"), fErrorIcon, " 0 "); //$NON-NLS-1$ //$NON-NLS-2$
-		fNumberOfFailures= createLabel(JUnitMessages.getString("CounterPanel.label.failures"), fFailureIcon, " 0 "); //$NON-NLS-1$ //$NON-NLS-2$
-
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				disposeIcons();
-			}
-		});
-	}
- 
-	private void disposeIcons() {
-		fErrorIcon.dispose();
-		fFailureIcon.dispose();
-	}
-
-	private Text createLabel(String name, Image image, String init) {
-		Label label= new Label(this, SWT.NONE);
-		if (image != null) {
-			image.setBackground(label.getBackground());
-			label.setImage(image);
-		}
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-		
-		label= new Label(this, SWT.NONE);
-		label.setText(name);
-		label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
-		label.setFont(JFaceResources.getBannerFont());
-		
-		Text value= new Text(this, SWT.READ_ONLY);
-		value.setText(init);
-		// bug: 39661 Junit test counters do not repaint correctly [JUnit] 
-		value.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		value.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING));
-		return value;
-	}
-
-	public void reset() {
-		setErrorValue(0);
-		setFailureValue(0);
-		setRunValue(0);
-		fTotal= 0;
-	}
-	
-	public void setTotal(int value) {
-		fTotal= value;
-	}
-	
-	public int getTotal(){
-		return fTotal;
-	}
-	
-	public void setRunValue(int value) {
-		String runString= JUnitMessages.getFormattedString("CounterPanel.runcount", new String[] { Integer.toString(value), Integer.toString(fTotal) }); //$NON-NLS-1$
-		fNumberOfRuns.setText(runString);
-
-		fNumberOfRuns.redraw();
-		redraw();
-	}
-	
-	public void setErrorValue(int value) {
-		fNumberOfErrors.setText(Integer.toString(value));
-		redraw();
-	}
-	
-	public void setFailureValue(int value) {
-		fNumberOfFailures.setText(Integer.toString(value));
-		redraw();
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/EnableStackFilterAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/EnableStackFilterAction.java
deleted file mode 100644
index 604bdbf..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/EnableStackFilterAction.java
+++ /dev/null
@@ -1,45 +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.jdt.internal.junit.ui;
-
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-/**
- * Action to enable/disable stack trace filtering.
- */
-public class EnableStackFilterAction extends Action {
-
-	private FailureTraceView fView;	
-	
-	public EnableStackFilterAction(FailureTraceView view) {
-		super(JUnitMessages.getString("EnableStackFilterAction.action.label"));  //$NON-NLS-1$
-		setDescription(JUnitMessages.getString("EnableStackFilterAction.action.description"));  //$NON-NLS-1$
-		setToolTipText(JUnitMessages.getString("EnableStackFilterAction.action.tooltip")); //$NON-NLS-1$
-		
-		setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/cfilter.gif")); //$NON-NLS-1$
-		setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/cfilter.gif")); //$NON-NLS-1$
-		setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/cfilter.gif")); //$NON-NLS-1$
-		WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.ENABLEFILTER_ACTION);
-
-		fView= view;
-		setChecked(JUnitPreferencePage.getFilterStack());
-	}
-
-	/*
-	 * @see Action#actionPerformed
-	 */		
-	public void run() {
-		JUnitPreferencePage.setFilterStack(isChecked());
-		fView.refresh();
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/FailureRunView.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/FailureRunView.java
deleted file mode 100644
index 614edbb..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/FailureRunView.java
+++ /dev/null
@@ -1,338 +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.jdt.internal.junit.ui;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-
-import org.eclipse.jdt.junit.ITestRunListener;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-
-
-/**
- * A view presenting the failed tests in a table.
- */
-class FailureRunView implements ITestRunView, IMenuListener {
-	private Table fTable;
-	private TestRunnerViewPart fRunnerViewPart;
-	private final Clipboard fClipboard;	
-	private boolean fMoveSelection= false;
-	
-	private final Image fErrorIcon= TestRunnerViewPart.createImage("obj16/testerr.gif"); //$NON-NLS-1$
-	private final Image fFailureIcon= TestRunnerViewPart.createImage("obj16/testfail.gif"); //$NON-NLS-1$
-	private final Image fFailureTabIcon= TestRunnerViewPart.createImage("obj16/failures.gif"); //$NON-NLS-1$
-
-	public FailureRunView(CTabFolder tabFolder, Clipboard clipboard, TestRunnerViewPart runner) {
-		fRunnerViewPart= runner;
-		fClipboard= clipboard;
-		
-		CTabItem failureTab= new CTabItem(tabFolder, SWT.NONE);
-		failureTab.setText(getName());
-		failureTab.setImage(fFailureTabIcon);
-
-		Composite composite= new Composite(tabFolder, SWT.NONE);
-		GridLayout gridLayout= new GridLayout();
-		gridLayout.marginHeight= 0;
-		gridLayout.marginWidth= 0;
-		composite.setLayout(gridLayout);
-		
-		GridData gridData= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		composite.setLayoutData(gridData);	
-			
-		fTable= new Table(composite, SWT.NONE);
-		gridLayout= new GridLayout();
-		gridLayout.marginHeight= 0;
-		gridLayout.marginWidth= 0;
-		fTable.setLayout(gridLayout);
-		
-		gridData= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		fTable.setLayoutData(gridData);
-		
-		failureTab.setControl(composite);
-		failureTab.setToolTipText(JUnitMessages.getString("FailureRunView.tab.tooltip")); //$NON-NLS-1$
-		
-		initMenu();
-		addListeners();	
-	}
-
-	private void disposeIcons() {
-		fErrorIcon.dispose();
-		fFailureIcon.dispose();
-		fFailureTabIcon.dispose();
-	}
-
-	private void initMenu() {
-		MenuManager menuMgr= new MenuManager();
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(this);
-		Menu menu= menuMgr.createContextMenu(fTable);
-		fTable.setMenu(menu);
-	}
-	
-	public String getName() {
-		return JUnitMessages.getString("FailureRunView.tab.title"); //$NON-NLS-1$
-	}
-	
-	public String getSelectedTestId() {
-		int index= fTable.getSelectionIndex();
-		if (index == -1)
-			return null;
-		return getTestInfo(fTable.getItem(index)).getTestId();
-	}
-	
-	public String getAllFailedTestNames() {
-		StringBuffer trace= new StringBuffer();
-		String lineDelim= System.getProperty("line.separator", "\n");  //$NON-NLS-1$//$NON-NLS-2$
-		for (int i= 0; i < fTable.getItemCount(); i++) {
-			TestRunInfo testInfo= getTestInfo(fTable.getItem(i));
-			trace.append(testInfo.getTestName()).append(lineDelim);
-			String failureTrace= testInfo.getTrace();
-			if (failureTrace != null) {
-				StringReader stringReader= new StringReader(failureTrace);
-				BufferedReader bufferedReader= new BufferedReader(stringReader);
-				String line;
-				try {
-					while ((line= bufferedReader.readLine()) != null) 
-						trace.append(line+lineDelim);
-				} catch (IOException e) {
-					trace.append(lineDelim);
-				}	
-			}
-		}
-		return trace.toString();
-	}
-	
-	private String getClassName() {
-		TableItem item= getSelectedItem();
-		TestRunInfo info= getTestInfo(item);
-		return info.getClassName();
-	}
-	
-	private String getMethodName() {
-		TableItem item= getSelectedItem();
-		TestRunInfo info= getTestInfo(item);
-		return info.getTestMethodName();
-	}
-	
-	public void menuAboutToShow(IMenuManager manager){
-		if (fTable.getSelectionCount() > 0) {
-			String className= getClassName();
-			String methodName= getMethodName();
-			if (className != null) {
-				manager.add(new OpenTestAction(fRunnerViewPart, className, methodName));
-				manager.add(new RerunAction(fRunnerViewPart, getSelectedTestId(), className, methodName));
-				manager.add(new CopyFailureListAction(fRunnerViewPart, FailureRunView.this, fClipboard));
-			}
-		}
-	}		
-	
-	private TableItem getSelectedItem() {
-		int index= fTable.getSelectionIndex();
-		if (index == -1)
-			return null;
-		return fTable.getItem(index);
-	}
-	
-	public void setSelectedTest(String testId){
-		TableItem[] items= fTable.getItems();
-		for (int i= 0; i < items.length; i++) {
-			TableItem tableItem= items[i];
-			TestRunInfo info= getTestInfo(tableItem);		
-			if (info.getTestId().equals(testId)){
-				fTable.setSelection(new TableItem[] { tableItem });
-				fTable.showItem(tableItem);
-				return;
-			}
-		}
-	}
-
-	private TestRunInfo getTestInfo(TableItem item) {
-		return (TestRunInfo)item.getData(); 	
-	}
-	
-	public void setFocus() {
-		fTable.setFocus();
-	}
-	
-	public void endTest(String testId){
-		TestRunInfo testInfo= fRunnerViewPart.getTestInfo(testId);
-		if(testInfo == null || testInfo.getStatus() == ITestRunListener.STATUS_OK) 
-			return;
-
-		TableItem tableItem= new TableItem(fTable, SWT.NONE);
-		updateTableItem(testInfo, tableItem);
-		fTable.showItem(tableItem);
-	}
-
-	private void updateTableItem(TestRunInfo testInfo, TableItem tableItem) {
-		String label= JUnitMessages.getFormattedString("FailureRunView.labelfmt", new String[] { testInfo.getTestMethodName(), testInfo.getClassName() }); //$NON-NLS-1$
-		tableItem.setText(label);
-		if (testInfo.getStatus() == ITestRunListener.STATUS_FAILURE)
-			tableItem.setImage(fFailureIcon);
-		else
-			tableItem.setImage(fErrorIcon);
-		tableItem.setData(testInfo);
-	}
-
-	private TableItem findItem(String testId) {
-		TableItem[] items= fTable.getItems();
-		for (int i= 0; i < items.length; i++) {
-			TestRunInfo info= getTestInfo(items[i]);
-			if (info.getTestId().equals(testId))
-				return items[i];
-		}
-		return null;
-	}
-
-	public void activate() {
-		fMoveSelection= false;
-		testSelected();
-	}
-
-	public void aboutToStart() {
-		fMoveSelection= false;
-		fTable.removeAll();
-	}
-
-	private void testSelected() {
-		fRunnerViewPart.handleTestSelected(getSelectedTestId());
-	}
-	
-	private void addListeners() {
-		fTable.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				activate();
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-				activate();
-			}
-		});
-		
-		fTable.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				disposeIcons();
-			}
-		});
-
-		fTable.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e){
-				handleDoubleClick(e);
-			}
-			public void mouseDown(MouseEvent e) {
-				activate();
-			}
-			public void mouseUp(MouseEvent e) {
-				activate();
-			}
-		});
-	}
-	
-	void handleDoubleClick(MouseEvent e) {
-		if (fTable.getSelectionCount() > 0) 
-			new OpenTestAction(fRunnerViewPart, getClassName(), getMethodName()).run();
-	}
-	
-	public void newTreeEntry(String treeEntry) {
-	}
-	
-	/*
-	 * @see ITestRunView#testStatusChanged(TestRunInfo)
-	 */
-	public void testStatusChanged(TestRunInfo info) {
-		TableItem item= findItem(info.getTestId());
-		if (item != null) {
-			if (info.getStatus() == ITestRunListener.STATUS_OK) {
-				item.dispose();
-				return;
-			}
-			updateTableItem(info, item);
-		} 
-		if (item == null && info.getStatus() != ITestRunListener.STATUS_OK) {
-			item= new TableItem(fTable, SWT.NONE);
-			updateTableItem(info, item);
-		}
-		if (item != null)
-			fTable.showItem(item);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.junit.ui.ITestRunView#startTest(java.lang.String)
-	 */
-	public void startTest(String testId) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.junit.ui.ITestRunView#selectNext()
-	 */
-	public void selectNext() {
-		if (fTable.getItemCount() == 0)
-			return;
-			
-		int index= fTable.getSelectionIndex();
-		if (index == -1)
-			index= 0;
-		
-		if (fMoveSelection)
-			index= Math.min(fTable.getItemCount()-1, index+1);
-		else
-			fMoveSelection= true;
-			
-		selectTest(index);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.junit.ui.ITestRunView#selectPrevious()
-	 */
-	public void selectPrevious() {
-		if (fTable.getItemCount() == 0)
-			return;
-			
-		int index= fTable.getSelectionIndex();
-		if (index == -1)
-			index= fTable.getItemCount()-1;
-			
-		if (fMoveSelection)
-			index= Math.max(0, index-1);
-		else
-			fMoveSelection= true;
-			
-		selectTest(index);
-	}
-
-	private void selectTest(int index) {
-		TableItem item= fTable.getItem(index);
-		TestRunInfo info= getTestInfo(item);
-		fRunnerViewPart.showTest(info);
-	}
-
-	public void aboutToEnd() {
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/FailureTraceView.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/FailureTraceView.java
deleted file mode 100644
index 81b3e77..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/FailureTraceView.java
+++ /dev/null
@@ -1,296 +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
- *     Sebastian Davids: sdavids@gmx.de bug 37333, 26653 
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.ui;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.ToolBar;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.ToolBarManager;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.util.IOpenEventListener;
-import org.eclipse.jface.util.OpenStrategy;
-
-/**
- * A view that shows a stack trace of a failed test.
- */
-class FailureTraceView implements IMenuListener {
-    private final Image fStackIcon= TestRunnerViewPart.createImage("obj16/stkfrm_obj.gif"); //$NON-NLS-1$
-    private final Image fExceptionIcon= TestRunnerViewPart.createImage("obj16/exc_catch.gif"); //$NON-NLS-1$
-    
-    private static final String FRAME_PREFIX= "at "; //$NON-NLS-1$
-	private Table fTable;
-	private TestRunnerViewPart fTestRunner;
-	private String fInputTrace;
-	private final Clipboard fClipboard;
-    private TestRunInfo fFailure;
-    private CompareResultsAction fCompareAction;
-
-	public FailureTraceView(Composite parent, Clipboard clipboard, TestRunnerViewPart testRunner, ToolBar toolBar) {
-		Assert.isNotNull(clipboard);
-		
-		// fill the failure trace viewer toolbar
-		ToolBarManager failureToolBarmanager= new ToolBarManager(toolBar);
-		failureToolBarmanager.add(new EnableStackFilterAction(this));			
-		fCompareAction = new CompareResultsAction(this);
-        failureToolBarmanager.add(fCompareAction);			
-		failureToolBarmanager.update(true);
-		
-		fTable= new Table(parent, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL);
-		fTestRunner= testRunner;
-		fClipboard= clipboard;
-		
-		OpenStrategy handler = new OpenStrategy(fTable);
-		handler.addOpenListener(new IOpenEventListener() {
-			public void handleOpen(SelectionEvent e) {
-				if (fTable.getSelectionIndex() == 0 && fFailure.isComparisonFailure()) {
-					(new CompareResultsAction(FailureTraceView.this)).run();
-				}
-				if (fTable.getSelection().length != 0) {
-					Action a = createOpenEditorAction(getSelectedText());
-					if (a != null)
-						a.run();
-				}
-			}
-		});
-		
-		initMenu();
-		
-		parent.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				disposeIcons();
-			}
-		});
-	}
-	
-	private void initMenu() {
-		MenuManager menuMgr= new MenuManager();
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(this);
-		Menu menu= menuMgr.createContextMenu(fTable);
-		fTable.setMenu(menu);		
-	}
-	
-	public void menuAboutToShow(IMenuManager manager) {
-		if (fTable.getSelectionCount() > 0) {
-			Action a= createOpenEditorAction(getSelectedText());
-			if (a != null)
-				manager.add(a);		
-			manager.add(new CopyTraceAction(FailureTraceView.this, fClipboard));
-		}
-	}
-
-	public String getTrace() {
-		return fInputTrace;
-	}
-	
-	private String getSelectedText() {
-		return fTable.getSelection()[0].getText();
-	}				
-
-	private Action createOpenEditorAction(String traceLine) {
-		try { 
-			//TODO: works for JDK stack trace only
-			String testName= traceLine;
-			testName= testName.substring(testName.indexOf(FRAME_PREFIX)); //$NON-NLS-1$
-			testName= testName.substring(FRAME_PREFIX.length(), testName.indexOf('(')).trim();
-			testName= testName.substring(0, testName.lastIndexOf('.'));
-			int innerSeparatorIndex= testName.indexOf('$');
-			if (innerSeparatorIndex != -1)
-				testName= testName.substring(0, innerSeparatorIndex);
-			
-			String lineNumber= traceLine;
-			lineNumber= lineNumber.substring(lineNumber.indexOf(':') + 1, lineNumber.indexOf(')'));
-			int line= Integer.valueOf(lineNumber).intValue();
-			//fix for bug 37333	
-			String cuName= traceLine.substring(traceLine.indexOf('(') + 1, traceLine.indexOf(':'));
-			return new OpenEditorAtLineAction(fTestRunner, cuName, testName, line);
-		} catch(NumberFormatException e) {
-		}
-		catch(IndexOutOfBoundsException e) {	
-		}	
-		return null;
-	}
-	
-	private void disposeIcons(){
-		if (fExceptionIcon != null && !fExceptionIcon.isDisposed()) 
-			fExceptionIcon.dispose();
-		if (fStackIcon != null && !fStackIcon.isDisposed()) 
-			fStackIcon.dispose();
-	}
-	
-	/**
-	 * Returns the composite used to present the trace
-	 */
-	Composite getComposite(){
-		return fTable;
-	}
-	
-	/**
-	 * Refresh the table from the the trace.
-	 */
-	public void refresh() {
-		updateTable(fInputTrace);
-	}
-	
-	/**
-	 * Shows a TestFailure
-	 * @param failure the failed test
-	 */
-	public void showFailure(TestRunInfo failure) {	
-	    fFailure= failure;
-	    String trace= ""; //$NON-NLS-1$
-	    fCompareAction.setEnabled(failure != null && failure.isComparisonFailure());
-	    if (failure != null) 
-	        trace= failure.getTrace();
-		if (fInputTrace == trace)
-			return;
-		fInputTrace= trace;
-		updateTable(trace);
-	}
-
-	private void updateTable(String trace) {
-		if(trace == null || trace.trim().equals("")) { //$NON-NLS-1$
-			clear();
-			return;
-		}
-		trace= trace.trim();
-		fTable.setRedraw(false);
-		fTable.removeAll();
-		fillTable(filterStack(trace));
-		fTable.setRedraw(true);
-	}
-
-	private void fillTable(String trace) {
-		StringReader stringReader= new StringReader(trace);
-		BufferedReader bufferedReader= new BufferedReader(stringReader);
-		String line;
-
-		try {	
-			// first line contains the thrown exception
-			line= bufferedReader.readLine();
-			if (line == null)
-				return;
-				
-			TableItem tableItem= new TableItem(fTable, SWT.NONE);
-			String itemLabel= line.replace('\t', ' ');
-			tableItem.setText(itemLabel);
-			tableItem.setImage(fExceptionIcon);
-			
-			// the stack frames of the trace
-			while ((line= bufferedReader.readLine()) != null) {
-				itemLabel= line.replace('\t', ' ');
-				tableItem= new TableItem(fTable, SWT.NONE);
-				// heuristic for detecting a stack frame - works for JDK
-				if ((itemLabel.indexOf(" at ") >= 0)) { //$NON-NLS-1$
-					tableItem.setImage(fStackIcon);
-				}
-				tableItem.setText(itemLabel);
-			}
-		} catch (IOException e) {
-			TableItem tableItem= new TableItem(fTable, SWT.NONE);
-			tableItem.setText(trace);
-		}			
-	}
-	
-	/**
-	 * Shows other information than a stack trace.
-	 * @param text the informational message to be shown
-	 */
-	public void setInformation(String text) {
-		clear();
-		TableItem tableItem= new TableItem(fTable, SWT.NONE);
-		tableItem.setText(text);
-	}
-	
-	/**
-	 * Clears the non-stack trace info
-	 */
-	public void clear() {
-		fTable.removeAll();
-		fInputTrace= null;
-	}
-	
-	private String filterStack(String stackTrace) {	
-		if (!JUnitPreferencePage.getFilterStack() || stackTrace == null) 
-			return stackTrace;
-			
-		StringWriter stringWriter= new StringWriter();
-		PrintWriter printWriter= new PrintWriter(stringWriter);
-		StringReader stringReader= new StringReader(stackTrace);
-		BufferedReader bufferedReader= new BufferedReader(stringReader);	
-			
-		String line;
-		String[] patterns= JUnitPreferencePage.getFilterPatterns();
-		try {	
-			while ((line= bufferedReader.readLine()) != null) {
-				if (!filterLine(patterns, line))
-					printWriter.println(line);
-			}
-		} catch (IOException e) {
-			return stackTrace; // return the stack unfiltered
-		}
-		return stringWriter.toString();
-	}
-	
-	private boolean filterLine(String[] patterns, String line) {
-		String pattern;
-		int len;
-		for (int i= (patterns.length - 1); i >= 0; --i) {
-			pattern= patterns[i];
-			len= pattern.length() - 1;
-			if (pattern.charAt(len) == '*') {
-				//strip trailing * from a package filter
-				pattern= pattern.substring(0, len);
-			} else if (Character.isUpperCase(pattern.charAt(0))) {
-				//class in the default package
-				pattern= FRAME_PREFIX + pattern + '.';
-			} else {
-				//class names start w/ an uppercase letter after the .
-				final int lastDotIndex= pattern.lastIndexOf('.');
-				if ((lastDotIndex != -1) && (lastDotIndex != len) && Character.isUpperCase(pattern.charAt(lastDotIndex + 1)))
-					pattern += '.'; //append . to a class filter
-			}
-
-			if (line.indexOf(pattern) > 0)
-				return true;
-		}		
-		return false;
-	}
-
-    public TestRunInfo getFailedTest() {
-        return fFailure;
-    }
-
-    public Shell getShell() {
-        return fTable.getShell();
-    }
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/GotoReferencedTestAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/GotoReferencedTestAction.java
deleted file mode 100644
index 07c1d13..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/GotoReferencedTestAction.java
+++ /dev/null
@@ -1,165 +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.jdt.internal.junit.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
-import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.dialogs.SelectionStatusDialog;
-
-/**
- * Shows a dialog with test methods that refer to the selection.
- */
-public class GotoReferencedTestAction implements IWorkbenchWindowActionDelegate {
-	ISelection fSelection;
-	IWorkbenchWindow fWorkbench;
-	
-	private void run(IStructuredSelection selection) {
-		IJavaElement[] elements= getSelectedElements(selection);
-		if (elements == null || elements.length == 0) {
-			MessageDialog.openInformation(getShell(), JUnitMessages.getString("GotoReferencedTestAction.dialog.title"), JUnitMessages.getString("GotoReferencedTestAction.dialog.message")); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		try {
-			run(elements);
-		} catch (CoreException e) {
-			ErrorDialog.openError(getShell(), JUnitMessages.getString("GotoReferencedTestAction.dialog.title"), JUnitMessages.getString("GotoReferencedTestAction.dialog.error"), e.getStatus()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-			
-	private void run(ITextSelection ITextSelection) {
-		try {
-			JavaEditor editor= getActiveEditor();
-			if (editor == null)
-				return;
-			IJavaElement element= SelectionConverter.getElementAtOffset(editor);
-			int type= element != null ? element.getElementType() : -1;
-			if (type != IJavaElement.METHOD && type != IJavaElement.TYPE) {
-		 		element= SelectionConverter.getTypeAtOffset(editor);
-		 		if (element == null) {
-					MessageDialog.openInformation(getShell(), JUnitMessages.getString("GotoReferencedTestAction.dialog.title"), JUnitMessages.getString("GotoReferencedTestAction.dialog.error.nomethod")); //$NON-NLS-1$ //$NON-NLS-2$
-					return;
-		 		}
-			}
-			run(new IMember[] { (IMember)element });
-		} catch (CoreException e) {
-			ErrorDialog.openError(getShell(), JUnitMessages.getString("GotoReferencedTestAction.dialog.title"), JUnitMessages.getString("GotoReferencedTestAction.dialog.error"), e.getStatus()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	private void run(IJavaElement[] elements) throws PartInitException, JavaModelException {
-		IJavaElement element= elements[0];
-		
-		SelectionStatusDialog dialog = new TestMethodSelectionDialog(getShell(), new ProgressMonitorDialog(getShell()), element); 
-		dialog.setTitle(JUnitMessages.getString("GotoReferencedTestAction.selectdialog.title"));  //$NON-NLS-1$
-		String msg= JUnitMessages.getFormattedString("GotoReferencedTestAction.dialog.select_message", element.getElementName()); //$NON-NLS-1$
-		dialog.setMessage(msg); 
-		
-		if (dialog.open() == SelectionDialog.CANCEL) 
-			return;
-	
-		Object result = dialog.getFirstResult();
-		if (result == null) 
-			return;
-				
-		openElement((IJavaElement)result);
-	}
-
-	private void openElement(IJavaElement result) throws JavaModelException, PartInitException {
-		IEditorPart part= JavaUI.openInEditor(result);
-		JavaUI.revealInEditor(part, result);
-	}
-		
-	private IJavaElement[] getSelectedElements(IStructuredSelection selection) {
-		List elements= selection.toList();
-		int size= elements.size();
-		if (size == 0)
-			return null;
-			
-		ArrayList result= new ArrayList(size);
-			
-		for (int i= 0; i < size; i++) {
-			Object e= elements.get(i);
-			if (e instanceof ICompilationUnit) {
-				ICompilationUnit unit= (ICompilationUnit) e;
-				IType[] types= new IType[0];
-				try {
-					types= unit.getTypes();
-				} catch (JavaModelException ex) {
-				}
-				for (int j= 0; j < types.length; j++) {
-					result.add(types[j]);
-				} 
-			}
-			else if (e instanceof IMethod || e instanceof IType || e instanceof IField) {
-				result.add(e);
-			} else {
-				return null;
-			}
-		}
-		return (IJavaElement[])result.toArray(new IJavaElement[result.size()]);
-	}
-		
-	public void run(IAction action) {
-		if (fSelection instanceof IStructuredSelection)
-			run((IStructuredSelection)fSelection);
-		else if (fSelection instanceof ITextSelection) 
-			run((ITextSelection)fSelection);
-	}
-	
-	public void selectionChanged(IAction action, ISelection selection) {
-		fSelection= selection;
-	}
-		
-	private Shell getShell() {
-		if (fWorkbench != null)
-			return fWorkbench.getShell();
-		return JUnitPlugin.getActiveWorkbenchShell();
-	}
-	
-	public void dispose() {
-	}
-	
-	public void init(IWorkbenchWindow window) {
-		fWorkbench= window;
-	}
-	
-	private JavaEditor getActiveEditor() {
-		IEditorPart editor= fWorkbench.getActivePage().getActiveEditor();
-		if (editor instanceof JavaEditor)
-			return (JavaEditor) editor;
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/HierarchyRunView.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/HierarchyRunView.java
deleted file mode 100644
index 2895c83..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/HierarchyRunView.java
+++ /dev/null
@@ -1,670 +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
- *     Sebastian Davids - sdavids@gmx.de bugs 26754, 41228
-*******************************************************************************/
-package org.eclipse.jdt.internal.junit.ui;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Vector;
-
-import org.eclipse.jdt.junit.ITestRunListener;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-
-/*
- * A view that shows the contents of a test suite
- * as a tree.
- */
-class HierarchyRunView implements ITestRunView, IMenuListener {
-	
-	private Tree fTree;
-	
-	private TreeItem fCachedParent;
-	private TreeItem[] fCachedItems;
-	
-	private TreeItem fLastParent;
-	private List fExecutionPath;
-	
-	private boolean fMoveSelection= false;
-	
-	/**
-	 * Helper used to resurrect test hierarchy
-	 */
-	private static class SuiteInfo {
-		public int fTestCount;
-		public TreeItem fTreeItem;
-		
-		public SuiteInfo(TreeItem treeItem, int testCount){
-			fTreeItem= treeItem;
-			fTestCount= testCount;
-		}
-	}
-		
-	/**
-	 * Vector of SuiteInfo items
-	 */
-	private Vector fSuiteInfos= new Vector();
-	/**
-	 * Maps test Ids to TreeItems. 
-	 */
-	private Map fTreeItemMap= new HashMap();
-	
-	private TestRunnerViewPart fTestRunnerPart;
-	
-	private final Image fOkIcon= TestRunnerViewPart.createImage("obj16/testok.gif"); //$NON-NLS-1$
-	private final Image fErrorIcon= TestRunnerViewPart.createImage("obj16/testerr.gif"); //$NON-NLS-1$
-	private final Image fFailureIcon= TestRunnerViewPart.createImage("obj16/testfail.gif"); //$NON-NLS-1$
-	private final Image fHierarchyIcon= TestRunnerViewPart.createImage("obj16/testhier.gif"); //$NON-NLS-1$
-	private final Image fSuiteIcon= TestRunnerViewPart.createImage("obj16/tsuite.gif"); //$NON-NLS-1$
-	private final Image fSuiteErrorIcon= TestRunnerViewPart.createImage("obj16/tsuiteerror.gif"); //$NON-NLS-1$
-	private final Image fSuiteFailIcon= TestRunnerViewPart.createImage("obj16/tsuitefail.gif"); //$NON-NLS-1$
-	private final Image fTestIcon= TestRunnerViewPart.createImage("obj16/test.gif"); //$NON-NLS-1$
-	private final Image fTestRunningIcon= TestRunnerViewPart.createImage("obj16/testrun.gif"); //$NON-NLS-1$
-	private final Image fSuiteRunningIcon= TestRunnerViewPart.createImage("obj16/tsuiterun.gif"); //$NON-NLS-1$
-	
-	private class ExpandAllAction extends Action {
-		public ExpandAllAction() {
-			setText(JUnitMessages.getString("ExpandAllAction.text"));  //$NON-NLS-1$
-			setToolTipText(JUnitMessages.getString("ExpandAllAction.tooltip"));  //$NON-NLS-1$
-		}
-		
-		public void run(){
-			expandAll();
-		}
-	}
-	public HierarchyRunView(CTabFolder tabFolder, TestRunnerViewPart runner) {
-		fTestRunnerPart= runner;
-		
-		CTabItem hierarchyTab= new CTabItem(tabFolder, SWT.NONE);
-		hierarchyTab.setText(getName());
-		hierarchyTab.setImage(fHierarchyIcon);
-		
-		Composite testTreePanel= new Composite(tabFolder, SWT.NONE);
-		GridLayout gridLayout= new GridLayout();
-		gridLayout.marginHeight= 0;
-		gridLayout.marginWidth= 0;
-		testTreePanel.setLayout(gridLayout);
-		
-		GridData gridData= new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		testTreePanel.setLayoutData(gridData);
-		
-		hierarchyTab.setControl(testTreePanel);
-		hierarchyTab.setToolTipText(JUnitMessages.getString("HierarchyRunView.tab.tooltip")); //$NON-NLS-1$
-		
-		fTree= new Tree(testTreePanel, SWT.V_SCROLL | SWT.SINGLE);
-		gridData= new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		fTree.setLayoutData(gridData);
-		
-		initMenu();
-		addListeners();
-	}
-
-	void disposeIcons() {
-		fErrorIcon.dispose();
-		fFailureIcon.dispose();
-		fOkIcon.dispose();
-		fHierarchyIcon.dispose();
-		fTestIcon.dispose();
-		fTestRunningIcon.dispose();
-		fSuiteRunningIcon.dispose();
-		fSuiteIcon.dispose();
-		fSuiteErrorIcon.dispose();
-		fSuiteFailIcon.dispose(); 
-	}
-	
-	private void initMenu() {
-		MenuManager menuMgr= new MenuManager();
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(this);
-		Menu menu= menuMgr.createContextMenu(fTree);
-		fTree.setMenu(menu);	
-	}
-
-	private String getTestMethod() {
-		return getTestInfo().getTestMethodName();
-	}
-
-	private TestRunInfo getTestInfo() {
-		TreeItem[] treeItems= fTree.getSelection();
-		if(treeItems.length == 0) 
-			return null;
-		return ((TestRunInfo)treeItems[0].getData());
-	}	
-	
-	private boolean isSuiteSelected() {
-		TreeItem[] treeItems= fTree.getSelection();
-		if(treeItems.length != 1) 
-			return false;
-		return treeItems[0].getItemCount() > 0;
-	}	
-	
-	private String getClassName() {
-		return getTestInfo().getClassName();
-	}
-	
-	public String getSelectedTestId() {
-		TestRunInfo testInfo= getTestInfo();
-		if (testInfo == null) 
-			return null;
-		return testInfo.getTestId();
-	}		
-
-	public String getName() {
-		return JUnitMessages.getString("HierarchyRunView.tab.title"); //$NON-NLS-1$
-	}
-	
-	public void setSelectedTest(String testId) {
-		TreeItem treeItem= findTreeItem(testId);
-		if (treeItem != null)
-			fTree.setSelection(new TreeItem[]{treeItem});
-	}
-	
-	public void startTest(String testId) {	
-		TreeItem treeItem= findTreeItem(testId);
-		if (treeItem == null)  
-			return;
-		TreeItem parent= treeItem.getParentItem();
-		if (fLastParent != parent) {
-			updatePath(parent);
-			fLastParent= parent;
-		}
-		setCurrentItem(treeItem);		
-	}
-
-	private void updatePath(TreeItem parent) {
-		List newPath= new ArrayList();
-		while (parent != null) {
-			newPath.add(parent);
-			parent= parent.getParentItem();
-		}
-		Collections.reverse(newPath);
-		
-		// common path
-		ListIterator old= fExecutionPath.listIterator();
-		ListIterator np= newPath.listIterator();
-		int c= 0;
-		while (old.hasNext() && np.hasNext()) {
-			if (old.next() != np.next())
-				break;
-			c++;
-		}
-		// clear old path
-		for (ListIterator iter= fExecutionPath.listIterator(c); iter.hasNext(); ) 
-			refreshItem((TreeItem) iter.next(), false);		
-		// update new path
-		for (ListIterator iter= newPath.listIterator(c); iter.hasNext(); ) 
-			refreshItem((TreeItem) iter.next(), true);		
-		fExecutionPath= newPath;
-	}
-	
-	private void refreshItem(TreeItem item, boolean onPath) {
-		if (onPath)
-			item.setImage(fSuiteRunningIcon);
-		else {
-			TestRunInfo info= getTestRunInfo(item);
-			switch (info.getStatus()) {
-			case  ITestRunListener.STATUS_ERROR:
-				item.setImage(fSuiteErrorIcon);
-				break;
-			case  ITestRunListener.STATUS_FAILURE:
-				item.setImage(fSuiteFailIcon);
-				break;
-			default:
-				item.setImage(fSuiteIcon);
-			}
-		}
-	}
-	
-	private void setCurrentItem(TreeItem treeItem) {
-		treeItem.setImage(fTestRunningIcon);
-	
-		TreeItem parent= treeItem.getParentItem();
-		if (fTestRunnerPart.isAutoScroll()) {
-			fTree.showItem(treeItem);
-			while (parent != null) {
-				if (parent.getExpanded()) 
-					break;
-				parent.setExpanded(true);
-				parent= parent.getParentItem();
-			}
-		}
-	}
-
-	public void endTest(String testId) {	
-		TreeItem treeItem= findTreeItem(testId);
-		if (treeItem == null)  
-			return;
-			
-		TestRunInfo testInfo= fTestRunnerPart.getTestInfo(testId);
-			
-		updateItem(treeItem, testInfo);
-		
-		if (fTestRunnerPart.isAutoScroll()) {
-			fTree.showItem(treeItem);
-			cacheItems(treeItem);
-			collapsePassedTests(treeItem);
-		} 
-	}
-
-	private void cacheItems(TreeItem treeItem) {
-		TreeItem parent= treeItem.getParentItem();
-		if (parent == fCachedParent)
-			return;
-		fCachedItems= parent.getItems();
-		fCachedParent= parent;	
-	}
-
-	private void collapsePassedTests(TreeItem treeItem) {
-		TreeItem parent= treeItem.getParentItem();
-		if (parent != null) {
-			TreeItem[] items= null;
-			if (parent == fCachedParent)
-				items= fCachedItems;
-			else 
-				items= parent.getItems();
-				
-			if (isLast(treeItem, items)) {
-				boolean ok= true;
-				for (int i= 0; i < items.length; i++) {
-					if (isFailure(items[i])) {
-						ok= false;
-						break;
-					}
-				}
-				if (ok) {
-					parent.setExpanded(false);
-					collapsePassedTests(parent);
-				}
-			}
-		}
-	}
-
-	private boolean isLast(TreeItem treeItem, TreeItem[] items) {
-		return items[items.length-1] == treeItem;
-	}
-
-	private void updateItem(TreeItem treeItem, TestRunInfo testInfo) {
-		treeItem.setData(testInfo);
-		if(testInfo.getStatus() == ITestRunListener.STATUS_OK) {
-			treeItem.setImage(fOkIcon);	
-			return;
-		}		
-		if (testInfo.getStatus() == ITestRunListener.STATUS_FAILURE) 
-			treeItem.setImage(fFailureIcon);
-		else if (testInfo.getStatus() == ITestRunListener.STATUS_ERROR)
-			treeItem.setImage(fErrorIcon);
-		propagateStatus(treeItem, testInfo.getStatus());	
-	}
-
-	private void propagateStatus(TreeItem item, int status) {
-		TreeItem parent= item.getParentItem();
-		TestRunInfo testRunInfo= getTestRunInfo(item);
-		
-		if (parent == null)
-			return;
-		TestRunInfo parentInfo= getTestRunInfo(parent);
-		int parentStatus= parentInfo.getStatus();
-		
-		if (status == ITestRunListener.STATUS_FAILURE) {
-			if (parentStatus == ITestRunListener.STATUS_ERROR || parentStatus == ITestRunListener.STATUS_FAILURE) 
-				return;
-			parentInfo.setStatus(ITestRunListener.STATUS_FAILURE);
-			testRunInfo.setStatus(ITestRunListener.STATUS_FAILURE);
-		} else {
-			if (parentStatus == ITestRunListener.STATUS_ERROR) 
-				return;
-			parentInfo.setStatus(ITestRunListener.STATUS_ERROR);
-			testRunInfo.setStatus(ITestRunListener.STATUS_ERROR);
-		}
-		propagateStatus(parent, status);
-	}
-	
-	private TestRunInfo getTestRunInfo(TreeItem item) {
-		return (TestRunInfo)item.getData();
-	}
-
-	public void activate() {
-		fMoveSelection= false;
-		testSelected();
-	}
-	
-	public void setFocus() {
-		fTree.setFocus();
-	}
-
-	public void aboutToStart() {
-		fTree.removeAll();
-		fSuiteInfos.removeAllElements();
-		fTreeItemMap= new HashMap();
-		fCachedParent= null;
-		fCachedItems= null;
-		fMoveSelection= false;
-		fExecutionPath= new ArrayList();
-	}
-	
-	private void testSelected() {
-		fTestRunnerPart.handleTestSelected(getSelectedTestId());
-	}
-	
-	private void addListeners() {
-		fTree.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				activate();
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-				activate();
-			}
-		});
-		
-		fTree.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				disposeIcons();
-			}
-		});
-
-		fTree.addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				handleDoubleClick(e);
-			}
-		});
-	}
-	
-	void handleDoubleClick(MouseEvent e) {
-		TestRunInfo testInfo= getTestInfo();
-		
-		if (testInfo == null)
-			return;
-			
-		String testLabel= testInfo.getTestName();
-		OpenTestAction action= null;
-		
-		if (isSuiteSelected()) 	
-			action= new OpenTestAction(fTestRunnerPart, testLabel);
-		else 
-			action= new OpenTestAction(fTestRunnerPart, getClassName(), getTestMethod());
-
-		if (action != null && action.isEnabled())
-			action.run();													
-	}
-
-	public void menuAboutToShow(IMenuManager manager) {
-		if (fTree.getSelectionCount() > 0) {
-			TreeItem treeItem= fTree.getSelection()[0];
-			TestRunInfo testInfo= (TestRunInfo) treeItem.getData();
-			String testLabel= testInfo.getTestName();
-			if (isSuiteSelected()) {	
-				manager.add(new OpenTestAction(fTestRunnerPart, testLabel));
-			} else {
-				manager.add(new OpenTestAction(fTestRunnerPart, getClassName(), getTestMethod()));
-				manager.add(new RerunAction(fTestRunnerPart, getSelectedTestId(), getClassName(), getTestMethod()));
-			}
-			manager.add(new Separator());
-			manager.add(new ExpandAllAction());
-		}
-	}	
-	
-	public void newTreeEntry(String treeEntry) {
-		// format: testId","testName","isSuite","testcount
-		int index0= treeEntry.indexOf(',');
-		StringBuffer testStringBuffer= new StringBuffer(100);
-		int index1= scanTestName(treeEntry, index0+1, testStringBuffer);
-		int index2= treeEntry.indexOf(',', index1+1);
-		String testString= testStringBuffer.toString().trim();
-		String id= treeEntry.substring(0, index0);
-		TestRunInfo testInfo= new TestRunInfo(id, testString);
-		
-		String isSuite= treeEntry.substring(index1+1, index2);
-		int testCount= Integer.parseInt(treeEntry.substring(index2+1));
-		TreeItem treeItem;
-	
-		while((fSuiteInfos.size() > 0) && (((SuiteInfo) fSuiteInfos.lastElement()).fTestCount == 0))	{
-			fSuiteInfos.removeElementAt(fSuiteInfos.size()-1);
-		}
-	
-		if(fSuiteInfos.size() == 0){
-			treeItem= new TreeItem(fTree, SWT.NONE);
-			treeItem.setImage(fSuiteIcon);
-			fSuiteInfos.addElement(new SuiteInfo(treeItem, testCount));
-		} else if(isSuite.equals("true")) { //$NON-NLS-1$
-			treeItem= new TreeItem(((SuiteInfo) fSuiteInfos.lastElement()).fTreeItem, SWT.NONE);
-			treeItem.setImage(fSuiteIcon);
-			((SuiteInfo)fSuiteInfos.lastElement()).fTestCount -= 1;
-			fSuiteInfos.addElement(new SuiteInfo(treeItem, testCount));
-		} else {
-			treeItem= new TreeItem(((SuiteInfo) fSuiteInfos.lastElement()).fTreeItem, SWT.NONE);
-			treeItem.setImage(fTestIcon);
-			((SuiteInfo)fSuiteInfos.lastElement()).fTestCount -= 1;
-			mapTest(testInfo, treeItem);
-		}
-		treeItem.setText(testInfo.getTestMethodName());
-		treeItem.setData(testInfo);
-	}
-	
-	private int scanTestName(String s, int start, StringBuffer testName) {
-		boolean inQuote= false;
-		int i= start;
-		for (; i < s.length(); i++) {
-			char c= s.charAt(i);
-			if (c == '\\' && !inQuote) {
-				inQuote= true;
-				continue;
-			} else if (inQuote) {
-				inQuote= false;
-				testName.append(c);
-			} else if (c == ',')
-				break;
-			else
-				testName.append(c);
-		}
-		return i;
-	}
-
-
-	private void mapTest(TestRunInfo info, TreeItem item) {
-		fTreeItemMap.put(info.getTestId(), item);
-	}
-	
-	private TreeItem findTreeItem(String testId) {
-		Object o= fTreeItemMap.get(testId);
-		if (o instanceof TreeItem) 
-			return (TreeItem)o;
-		return null;
-	}
-	
-	/*
-	 * @see ITestRunView#testStatusChanged(TestRunInfo, int)
-	 */
-	public void testStatusChanged(TestRunInfo newInfo) {
-		Object o= fTreeItemMap.get(newInfo.getTestId());
-		if (o instanceof TreeItem) {
-			updateItem((TreeItem)o, newInfo);
-			return;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.junit.ui.ITestRunView#selectNext()
-	 */
-	public void selectNext() {
-		TreeItem selection= getInitialSearchSelection();
-		if (!moveSelection(selection))
-			return;
-			
-		TreeItem failure= findFailure(selection, true, !isLeafFailure(selection));
-		if (failure != null)
-			selectTest(failure);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.junit.ui.ITestRunView#selectPrevious()
-	 */
-	public void selectPrevious() {
-		TreeItem selection= getInitialSearchSelection();		
-		if (!moveSelection(selection))
-			return;
-		
-		TreeItem failure= findFailure(selection, false, !isLeafFailure(selection));
-		if (failure != null)
-			selectTest(failure);
-	}
-
-	private boolean moveSelection(TreeItem selection) {
-		if (!fMoveSelection) {
-			fMoveSelection= true;
-			if (isLeafFailure(selection)) {
-				selectTest(selection);
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private TreeItem getInitialSearchSelection() {
-		TreeItem[] treeItems= fTree.getSelection();	
-		TreeItem selection= null;
-		
-		if (treeItems.length == 0)	
-			selection= fTree.getItems()[0];
-		else
-			selection= treeItems[0];
-		return selection;
-	}
-
-	private boolean isFailure(TreeItem selection) {
-		return !(getTestRunInfo(selection).getStatus() == ITestRunListener.STATUS_OK);
-	}
-
-	private boolean isLeafFailure(TreeItem selection) {
-		boolean isLeaf= selection.getItemCount() == 0;
-		return isLeaf && isFailure(selection);
-	}
-
-	private void selectTest(TreeItem selection) {
-		fTestRunnerPart.showTest(getTestRunInfo(selection));
-	}
-
-	private TreeItem findFailure(TreeItem start, boolean next, boolean includeNode) {
-		TreeItem[] sib= findSiblings(start, next, includeNode);
-		if (next) {
-			for (int i= 0; i < sib.length; i++) {
-				TreeItem failure= findFailureInTree(sib[i]);
-				if (failure != null)
-					return failure;
-			}
-		} else {
-			for (int i= sib.length-1; i >= 0; i--) {
-				TreeItem failure= findFailureInTree(sib[i]);
-				if (failure != null)
-					return failure;
-			}
-		}
-		TreeItem parent= start.getParentItem();
-		if (parent == null)
-			return null;
-		return findFailure(parent, next, false);
-	}
-
-	private TreeItem[] findSiblings(TreeItem item, boolean next, boolean includeNode) {
-		TreeItem parent= item.getParentItem();
-		TreeItem[] children= null;
-		if (parent == null) 
-			children= item.getParent().getItems();
-		else	
-			children= parent.getItems();
-		
-		for (int i= 0; i < children.length; i++) {
-			TreeItem item2= children[i];
-			if (item2 == item) {
-				TreeItem[] result= null;
-				if (next) {
-					if (!includeNode) {
-						result= new TreeItem[children.length-i-1];
-						System.arraycopy(children, i+1, result, 0, children.length-i-1);
-					} else {
-						result= new TreeItem[children.length-i];
-						System.arraycopy(children, i, result, 0, children.length-i);
-						
-					}
-				} else {
-					if (!includeNode) {
-						result= new TreeItem[i];
-						System.arraycopy(children, 0, result, 0, i);
-					} else {
-						result= new TreeItem[i+1];
-						System.arraycopy(children, 0, result, 0, i+1);
-					}
-				}
-				return result;
-			}	
-		}
-		return new TreeItem[0];
-	}
-
-	private TreeItem findFailureInTree(TreeItem item) {
-		if (item.getItemCount() == 0) {
-			if (isFailure(item))
-				return item;			
-		}
-		TreeItem[] children= item.getItems();
-		for (int i= 0; i < children.length; i++) {
-			TreeItem item2= findFailureInTree(children[i]);
-			if (item2 != null)
-				return item2;
-		}
-		return null;
-	}
-	
-	protected void expandAll() {
-		TreeItem[] treeItems= fTree.getSelection();
-		fTree.setRedraw(false);
-		for (int i= 0; i < treeItems.length; i++) {
-			expandAll(treeItems[i]);
-		}
-		fTree.setRedraw(true);
-	}
-	
-	private void expandAll(TreeItem item) {
-		item.setExpanded(true);
-		TreeItem[] items= item.getItems();
-		for (int i= 0; i < items.length; i++) {
-			expandAll(items[i]);
-		}
-	}
-
-	public void aboutToEnd() {
-		for (int i= 0; i < fExecutionPath.size(); i++) {
-			refreshItem((TreeItem) fExecutionPath.get(i), false);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/IJUnitHelpContextIds.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/IJUnitHelpContextIds.java
deleted file mode 100644
index 8b69397..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/IJUnitHelpContextIds.java
+++ /dev/null
@@ -1,43 +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.jdt.internal.junit.ui;
-
-/**
- * Help context ids for the JUnit UI.
- */
-public interface IJUnitHelpContextIds {
-	public static final String PREFIX= JUnitPlugin.PLUGIN_ID + '.';
-
-	// Actions
-	public static final String COPYTRACE_ACTION= PREFIX + "copy_trace_action_context"; //$NON-NLS-1$
-	public static final String COPYFAILURELIST_ACTION= PREFIX + "copy_failure_list_action_context"; //$NON-NLS-1$
-	public static final String ENABLEFILTER_ACTION= PREFIX + "enable_filter_action_context"; //$NON-NLS-1$
-	public static final String OPENEDITORATLINE_ACTION= PREFIX + "open_editor_atline_action_context"; //$NON-NLS-1$
-	public static final String OPENTEST_ACTION= PREFIX + "open_test_action_context"; //$NON-NLS-1$
-	public static final String RERUN_ACTION= PREFIX + "rerun_test_action_context"; //$NON-NLS-1$
-	public static final String GOTO_REFERENCED_TEST_ACTION_CONTEXT= PREFIX + "goto_referenced_test_action_context"; //$NON-NLS-1$
-	public static final String OUTPUT_SCROLL_LOCK_ACTION= PREFIX + "scroll_lock"; //$NON-NLS-1$
-	
-	// view parts
-	public static final String RESULTS_VIEW= PREFIX + "results_view_context"; //$NON-NLS-1$
-	public static final String RESULTS_VIEW_TOGGLE_ORIENTATION_ACTION= PREFIX + "results_view_toggle_call_mode_action_context"; //$NON-NLS-1$
-	
-	// Preference/Property pages
-	public static final String JUNIT_PREFERENCE_PAGE= PREFIX + "junit_preference_page_context"; //$NON-NLS-1$
-
-	// Wizard pages
-	public static final String NEW_TESTCASE_WIZARD_PAGE= PREFIX + "new_testcase_wizard_page_context"; //$NON-NLS-1$
-	public static final String NEW_TESTCASE_WIZARD_PAGE2= PREFIX + "new_testcase_wizard_page2_context"; //$NON-NLS-1$
-	public static final String NEW_TESTSUITE_WIZARD_PAGE= PREFIX + "new_testsuite_wizard_page2_context"; //$NON-NLS-1$
-	
-	// Dialogs
-	public static final String TEST_SELECTION_DIALOG= PREFIX + "test_selection_context"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/IJUnitPreferencesConstants.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/IJUnitPreferencesConstants.java
deleted file mode 100644
index 94a28a6..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/IJUnitPreferencesConstants.java
+++ /dev/null
@@ -1,41 +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.jdt.internal.junit.ui;
-
-/**
- * Defines constants which are used to refer to values in the plugin's preference store.
- */
-public interface IJUnitPreferencesConstants {
-	/**
-	 * Boolean preference controlling whether the failure stack should be
-	 * filtered.
-	 */	
-	public static String DO_FILTER_STACK= JUnitPlugin.PLUGIN_ID + ".do_filter_stack"; //$NON-NLS-1$
-
-	/**
-	 * Boolean preference controlling whether the JUnit view should be shown on
-	 * errors only.
-	 */	
-	public static String SHOW_ON_ERROR_ONLY= JUnitPlugin.PLUGIN_ID + ".show_on_error"; //$NON-NLS-1$
-	
-	/**
-	 * List of active stack filters. A String containing a comma separated list
-	 * of fully qualified type names/patterns.
-	 */			
-	public static final String PREF_ACTIVE_FILTERS_LIST = JUnitPlugin.PLUGIN_ID + ".active_filters"; //$NON-NLS-1$
-	
-	/**
-	 * List of inactive stack filters. A String containing a comma separated
-	 * list of fully qualified type names/patterns.
-	 */				
-	public static final String PREF_INACTIVE_FILTERS_LIST = JUnitPlugin.PLUGIN_ID + ".inactive_filters"; //$NON-NLS-1$	
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunListener2.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunListener2.java
deleted file mode 100644
index 5067556..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunListener2.java
+++ /dev/null
@@ -1,37 +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.jdt.internal.junit.ui;
-
-import org.eclipse.jdt.junit.ITestRunListener;
-
-/**
- * Extends ITestRunListener with a call back to trace the test contents
- */
-public interface ITestRunListener2 extends ITestRunListener {
-
-	/**
-	 * Information about a member of the test suite that is about to be run.
-	 * The format of the string is: 
-	 * <pre>
-	 * "testId","testName","isSuite","testcount"
-	 * 
-	 * testId: a unique id for the test
-	 * testName: the name of the test
-	 * isSuite: true or false depending on whether the test is a suite
-	 * testCount: an integer indicating the number of tests 
-	 * 
-	 * Example: "324968,testPass(junit.tests.MyTest),false,1"
-	 * </pre>
-	 * 
-	 * @param entry
-	 */ 
-	public void testTreeEntry(String description);
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunListener3.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunListener3.java
deleted file mode 100644
index d86ee2e..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunListener3.java
+++ /dev/null
@@ -1,20 +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.jdt.internal.junit.ui;
-
-
-/**
- * Extends ITestRunListener2 with a call back to trace the test contents
- */
-public interface ITestRunListener3 extends ITestRunListener2 {
-
-    public void testFailed(int status, String testId, String testName, String trace, String expected, String actual);
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunView.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunView.java
deleted file mode 100644
index f49398d..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ITestRunView.java
+++ /dev/null
@@ -1,83 +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.jdt.internal.junit.ui;
-
-
-/**
- * A TestRunView is shown as a page in a tabbed folder.
- * It contributes the page contents and can return
- * the currently selected test.
- */
-interface ITestRunView {
-	/**
-	 * Returns the name of the currently selected Test in the View
-	 */
-	public String getSelectedTestId();
-
-	/**
-	 * Activates the TestRunView
-	 */
-	public void activate();
-	
-	/**
-	 * Sets the focus in the TestRunView
-	 */
-	public void setFocus();
-	
-	/**
-	 * Informs that the suite is about to start 
-	 */
-	public void aboutToStart();
-
-	/**
-	 * Informs that the suite is about to start 
-	 */
-	public void aboutToEnd();
-	
-	/**
-	 * Returns the name of the RunView
-	 */
-	public String getName();
-	
-	/**
-	 * Sets the current Test in the View
-	 */
-	public void setSelectedTest(String testId);
-	
-	/**
-	 * A test has started
-	 */
-	public void startTest(String testId);
-
-	/**
-	 * A test has ended
-	 */
-	public void endTest(String testId);
-	
-	/**
-	 * The status of a test has changed
-	 */
-	public void testStatusChanged(TestRunInfo newInfo);
-	/**
-	 * A new tree entry got posted.
-	 */
-	public void newTreeEntry(String treeEntry);	
-	
-	/**
-	 * Select next test failure.
-	 */
-	public void selectNext();	
-	
-	/**
-	 * Select previous test failure.
-	 */
-	public void selectPrevious();	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitAddLibraryProposal.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitAddLibraryProposal.java
deleted file mode 100644
index 160a3b8..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitAddLibraryProposal.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Created on Jul 16, 2003
- *
- * To change this generated comment go to 
- * Window>Preferences>Java>Code Generation>Code Template
- */
-package org.eclipse.jdt.internal.junit.ui;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.wizards.NewTestCaseCreationWizardPage;
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * @author egamma
- */
-final class JUnitAddLibraryProposal implements IJavaCompletionProposal {
-	private final IInvocationContext fContext;
-
-	public JUnitAddLibraryProposal(IInvocationContext context) {
-		fContext= context;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.text.java.IJavaCompletionProposal#getRelevance()
-	 */
-	public int getRelevance() {
-		return 0;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#apply(org.eclipse.jface.text.IDocument)
-	 */
-	public void apply(IDocument document) {   
-		IJavaProject project= fContext.getCompilationUnit().getJavaProject();
-		try {
-			NewTestCaseCreationWizardPage.addJUnitToBuildPath(project);
-			// force a reconcile
-			int offset= fContext.getSelectionOffset();
-			int length= fContext.getSelectionLength();
-			String s= document.get(offset, length);
-			document.replace(offset, length, s);
-		} catch (JavaModelException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (BadLocationException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getSelection(org.eclipse.jface.text.IDocument)
-	 */
-	public Point getSelection(IDocument document) {
-		return new Point(fContext.getSelectionOffset(), fContext.getSelectionLength());
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getAdditionalProposalInfo()
-	 */
-	public String getAdditionalProposalInfo() {
-		return JUnitMessages.getString("JUnitAddLibraryProposal.info"); //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
-	 */
-	public String getDisplayString() {
-		return JUnitMessages.getString("JUnitAddLibraryProposal.label"); //$NON-NLS-1$
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getImage()
-	 */
-	public Image getImage() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getContextInformation()
-	 */
-	public IContextInformation getContextInformation() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitHomeInitializer.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitHomeInitializer.java
deleted file mode 100644
index 2581a0d..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitHomeInitializer.java
+++ /dev/null
@@ -1,47 +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.jdt.internal.junit.ui;
-
-
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.jdt.core.ClasspathVariableInitializer;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-
-public class JUnitHomeInitializer extends ClasspathVariableInitializer {	
-	/**
-	 * @see ClasspathVariableInitializer#initialize(String)
-	 */
-	public void initialize(String variable) {
-		Plugin plugin= Platform.getPlugin("org.junit"); //$NON-NLS-1$
-		
-		if (plugin == null) {
-			JavaCore.removeClasspathVariable(JUnitPlugin.JUNIT_HOME, null);
-		}
-		URL installLocation= plugin.getDescriptor().getInstallURL();
-		URL local= null;
-		try {
-			try {
-				local= Platform.resolve(installLocation);
-			} catch (IOException e) {
-				JavaCore.removeClasspathVariable(JUnitPlugin.JUNIT_HOME, null);
-			}
-			JavaCore.setClasspathVariable(JUnitPlugin.JUNIT_HOME, new Path(local.getFile()), null);
-		} catch (JavaModelException e1) {
-			JavaCore.removeClasspathVariable(JUnitPlugin.JUNIT_HOME, null);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.java
deleted file mode 100644
index f7bb5dd..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.java
+++ /dev/null
@@ -1,49 +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.jdt.internal.junit.ui;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class JUnitMessages {
-
-	private static final String BUNDLE_NAME= "org.eclipse.jdt.internal.junit.ui.JUnitMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE= ResourceBundle.getBundle(BUNDLE_NAME);
-
-	private JUnitMessages() {
-	}
-
-	/**
-	 * Gets a string from the resource bundle and formats it with the argument
-	 * 
-	 * @param key	the string used to get the bundle value, must not be null
-	 */
-	public static String getFormattedString(String key, Object arg) {
-		return MessageFormat.format(getString(key), new Object[] { arg });
-	}
-
-	/**
-	 * Gets a string from the resource bundle and formats it with arguments
-	 */	
-	public static String getFormattedString(String key, Object[] args) {
-		return MessageFormat.format(getString(key), args);
-	}
-
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.properties b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.properties
deleted file mode 100644
index 350b519..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitMessages.properties
+++ /dev/null
@@ -1,181 +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
-###############################################################################
-CopyTrace.action.label=Copy Trace
-CopyTraceAction.problem=Problem Copying to Clipboard
-CopyTraceAction.clipboard_busy=There was a problem when accessing the system clipboard. Retry?
-
-CopyFailureList.action.label=Copy Failure List
-CopyFailureList.problem=Problem Copying Failure List to Clipboard
-CopyFailureList.clipboard_busy=There was a problem when accessing the system clipboard. Retry?
-
-CounterPanel.label.runs=Runs: 
-CounterPanel.label.errors=Errors: 
-CounterPanel.label.failures=Failures: 
-CounterPanel.runcount= {0}/{1}
-
-EnableStackFilterAction.action.label=Filter
-EnableStackFilterAction.action.description=Filter the stack trace
-EnableStackFilterAction.action.tooltip=Filter Stack Trace
-
-ScrollLockAction.action.label=Scroll Lock
-ScrollLockAction.action.description=Scroll lock
-ScrollLockAction.action.tooltip=Scroll Lock
-
-FailureRunView.tab.tooltip=Failures and Errors
-FailureRunView.tab.title=Failures
-FailureRunView.labelfmt= {0} - {1}
-
-FilterPatternsDialog.message.notempty=Filter must not be empty
-
-HierarchyRunView.tab.tooltip=Test Hierarchy
-HierarchyRunView.tab.title=Hierarchy
-
-JUnitPlugin.error.cannotshow=Could not show JUnit Result View
-JUnitPlugin.searching=Searching
-
-JUnitPreferencePage.description=JUnit settings:
-JUnitPreferencePage.addfilterbutton.label=Add &Filter
-JUnitPreferencePage.addfilterbutton.tooltip=Key in the Name of a New Stack Filter
-JUnitPreferencePage.addtypebutton.label=Add &Class...
-JUnitPreferencePage.addtypebutton.tooltip=Choose a Java Type and Add It to Stack Filters
-JUnitPreferencePage.addpackagebutton.label=Add &Packages...
-JUnitPreferencePage.addpackagebutton.tooltip=Choose Package(s) to Add to Stack Filters
-JUnitPreferencePage.removefilterbutton.label=&Remove
-JUnitPreferencePage.removefilterbutton.tooltip=Remove All Selected Stack Filters
-JUnitPreferencePage.enableallbutton.label=&Enable All
-JUnitPreferencePage.enableallbutton.tooltip=Enables All Stack Filters
-JUnitPreferencePage.disableallbutton.label=Disa&ble All
-JUnitPreferencePage.disableallbutton.tooltip=Disables All Stack Filters
-JUnitPreferencePage.filter.label=&Stack trace filter patterns (changes only apply to new test runs):
-JUnitPreferencePage.adddialog.title=Add Stack Filter Pattern
-JUnitPreferencePage.addialog.prompt=Enter Filter Pattern:
-JUnitPreferencePage.showcheck.label=Show the JUnit results &view only when an error or failure occurs
-JUnitPreferencePage.invalidstepfilterreturnescape=Invalid stack filter. Press Return to continue editing or Escape to cancel.  
-JUnitPreferencePage.addtypedialog.title=Add Class to Stack Filters
-JUnitPreferencePage.addtypedialog.message=&Select a class to filter in the failure stack trace.
-JUnitPreferencePage.addtypedialog.error.message=Could not open type selection dialog for stack filters.
-JUnitPreferencePage.addpackagedialog.title=Add Packages to Stack Filters
-JUnitPreferencePage.addpackagedialog.message=&Select a package to filter in the failure stack trace.
-JUnitPreferencePage.addpackagedialog.error.message=Could not open package selection dialog for stack filters.
-
-OpenEditorAction.action.label=&Go to File
-OpenEditorAction.error.cannotopen.title=Cannot Open Editor
-OpenEditorAction.error.cannotopen.message=Test class not found in project
-OpenEditorAction.error.dialog.title=Error
-OpenEditorAction.error.dialog.message=Could not open editor
-OpenEditorAction.message.cannotopen=Could not open editor
-
-OpenTestAction.error.title=Go To Test
-OpenTestAction.error.methodNoFound=Method ''{0}'' not found. Opening the test class.
-
-RerunAction.action.label=&Rerun
-
-TestRunnerViewPart.stopaction.text=Stop JUnit Test
-TestRunnerViewPart.stopaction.tooltip=Stop JUnit Test Run
-TestRunnerViewPart.rerunaction.label=Rerun last Test
-TestRunnerViewPart.rerunaction.tooltip=Rerun last Test
-TestRunnerViewPart.error.cannotrerun=Could not rerun test
-TestRunnerViewPart.message.terminated=Terminated
-TestRunnerViewPart.message.launching=Launching TestRunner
-TestRunnerViewPart.cannotrerun.title=Rerun Test
-TestRunnerViewPart.cannotrerurn.message=Can only rerun tests when they are launched under the debugger\nand when the \'keep JUnit running\' is set in the launch configuration.
-TestRunnerViewPart.message.cannotshow=Could not show JUnit Result View
-TestRunnerViewPart.label.failure=Failure Trace
-TestRunnerViewPart.message.finish= JUnit test run finished: {0} seconds (Errors: {1}, Failures: {2})
-TestRunnerViewPart.message.stopped= JUnit test run stopped after: {0} seconds
-TestRunnerViewPart.message.started= JUnit test run started: {0} - {1}
-TestRunnerViewPart.message.failure= {0}({1}) had a failure
-TestRunnerViewPart.message.error= {0}({1}) had an error
-TestRunnerViewPart.message.success= {0}({1}) was successful
-TestRunnerViewPart.title= JUnit ({0})
-TestRunnerViewPart.title_no_type=JUnit
-TestRunnerViewPart.toggle.vertical.label=&Vertical View Orientation
-TestRunnerViewPart.toggle.horizontal.label=&Horizontal View Orientation
-
-JUnitBaseLaunchConfiguration.error.invalidproject=Invalid project specified
-JUnitBaseLaunchConfiguration.error.novmrunner=Internal error: JRE {0} does not specify a VM Runner
-JUnitBaseLaunchConfiguration.error.notests=No tests found
-
-JUnitMainTab.label.oneTest=&Run a single test
-JUnitMainTab.label.project=&Project:
-JUnitMainTab.label.browse=&Browse...
-JUnitMainTab.label.test=T&est class:
-JUnitMainTab.label.search=&Search...
-JUnitMainTab.label.containerTest=Run &all tests in the selected project, package or source folder:
-JUnitMainTab.label.keeprunning=&Keep JUnit running after a test run when debugging
-JUnitMainTab.testdialog.title=Test Selection
-JUnitMainTab.testdialog.message=Choose a test case or test suite:
-JUnitMainTab.projectdialog.title=Project Selection
-JUnitMainTab.projectdialog.message=Choose a project to constrain the search for main types:
-JUnitMainTab.tab.label=Test
-JUnitMainTab.label.defaultpackage=(default package)
-JUnitMainTab.label.method=Test method: 
-JUnitMainTab.folderdialog.title=Folder Selection
-JUnitMainTab.folderdialog.message=Choose a Project, Source Folder or Package:
-JUnitMainTab.error.projectnotdefined=Project not specified
-JUnitMainTab.error.projectnotexists=Project does not exist
-JUnitMainTab.error.notJavaProject=Specified project is not a Java project
-JUnitMainTab.error.testnotdefined=Test not specified
-JUnitMainTab.error.testnotexists=Test class does not exist
-JUnitMainTab.error.invalidTest=Specified class is not a valid test class
-JUnitMainTab.error.noContainer=No project, source folder or package is specified 
-
-TestSearchEngine.message.searching=Searching suites
-LaunchTestAction.dialog.title=JUnit Launch
-LaunchTestAction.message.notests=No JUnit tests found.
-LaunchTestAction.dialog.title2=Test Selection
-LaunchTestAction.message.selectTestToRun=Select Test to debug
-LaunchTestAction.message.selectTestToDebug=Select Test to run
-LaunchTestAction.message.launchFailed=JUnit Launch Failed
-LaunchTestAction.message.selectConfiguration=Select a Test Configuration
-LaunchTestAction.message.selectDebugConfiguration=Select JUnit configuration to debug
-LaunchTestAction.message.selectRunConfiguration=Select JUnit configuration to run
-
-ShowNextFailureAction.label=Next Failure
-ShowNextFailureAction.tooltip=Next Failed Test
-ShowPreviousFailureAction.label=Previous Failure
-ShowPreviousFailureAction.tooltip=Previous Failed Test
-
-GotoReferencedTestAction.dialog.message=Select a method, type, or compilation unit to open tests that refer to them.
-GotoReferencedTestAction.dialog.title=Go to Test
-GotoReferencedTestAction.dialog.error.nomethod=Selection is not inside of a type or method.
-GotoReferencedTestAction.dialog.error=Test cannot be found
-GotoReferencedTestAction.selectdialog.title=Select Test
-GotoReferencedTestAction.dialog.select_message=Select a test that refers to ''{0}''.
-
-TestMethodSelectionDialog.error.title=Select Test
-TestMethodSelectionDialog.no_tests.title=Go to Test
-TestMethodSelectionDialog.error.notfound.title=Find Test
-TestMethodSelectionDialog.error.notfound.message=Could not find test
-TestMethodSelectionDialog.select_dialog.title=Select Test
-TestMethodSelectionDialog.dialog.title=Go to Referring Tests
-TestMethodSelectionDialog.notfound_message=No tests found that reference ''{0}''.
-TestMethodSelectionDialog.test_not_found=Cannot find ''{0}'' - make sure that JUnit is on the project's classpath.
-TestMethodSelectionDialog.testproject=Multiple projects contain ''{0}''. Select one project to be used when searching for tests.
-
-Resources.outOfSyncResources= Some resources are out of sync
-Resources.outOfSync= Resource ''{0}'' is out of sync with file system.
-Resources.modifiedResources= There are modified resources
-Resources.fileModified= File ''{0}'' has been modified since the beginning of the operation
-
-ExpandAllAction.text=Expand All
-ExpandAllAction.tooltip=Expand All Nodes
-JUnitAddLibraryProposal.info=Add the JUnit library to the project\'s build class path
-JUnitAddLibraryProposal.label=Add JUnit libraries
-
-CompareResultsAction.label=Compare Result
-CompareResultsAction.description=Compare the actual and expected test result
-CompareResultsAction.tooltip=Compare the actual and expected test result
-
-CompareResultDialog.title=Result Comparison
-CompareResultDialog.labelOK=OK
-CompareResultDialog.expectedLabel=Expected
-CompareResultDialog.actualLabel=Actual
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitPlugin.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitPlugin.java
deleted file mode 100644
index 9d90c07..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitPlugin.java
+++ /dev/null
@@ -1,412 +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
- *   Julien Ruaux: jruaux@octo.com
- * 	 Vincent Massol: vmassol@octo.com
- ******************************************************************************/
-
-package org.eclipse.jdt.internal.junit.ui;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.launcher.JUnitBaseLaunchConfiguration;
-import org.eclipse.jdt.junit.ITestRunListener;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The plug-in runtime class for the JUnit plug-in.
- */
-public class JUnitPlugin extends AbstractUIPlugin implements ILaunchListener {
-	/**
-	 * The single instance of this plug-in runtime class.
-	 */
-	private static JUnitPlugin fgPlugin= null;
-
-	public static final String PLUGIN_ID= "org.eclipse.jdt.junit"; //$NON-NLS-1$
-	public static final String ID_EXTENSION_POINT_TESTRUN_LISTENERS= PLUGIN_ID + "." + "testRunListeners"; //$NON-NLS-1$ //$NON-NLS-2$
-
-	public final static String TEST_SUPERCLASS_NAME= "junit.framework.TestCase"; //$NON-NLS-1$
-	public final static String TEST_INTERFACE_NAME= "junit.framework.Test"; //$NON-NLS-1$
-	
-	/**
-	 * The class path variable referring to the junit home location
-	 */
-	public final static String JUNIT_HOME= "JUNIT_HOME"; //$NON-NLS-1$
-
-	private static URL fgIconBaseURL;
-
-	/**
-	 * Use to track new launches. We need to do this
-	 * so that we only attach a TestRunner once to a launch.
-	 * Once a test runner is connected it is removed from the set.
-	 */
-	private AbstractSet fTrackedLaunches= new HashSet(20);
-
-	/**
-	 * List storing the registered test run listeners
-	 */
-	private List fTestRunListeners;
-
-	public JUnitPlugin(IPluginDescriptor desc) {
-		super(desc);
-		fgPlugin= this;
-		String pathSuffix= "icons/full/"; //$NON-NLS-1$
-		try {
-			fgIconBaseURL= new URL(getDescriptor().getInstallURL(), pathSuffix);
-		} catch (MalformedURLException e) {
-			// do nothing
-		}
-	}
-
-	public static JUnitPlugin getDefault() {
-		return fgPlugin;
-	}
-
-	public static Shell getActiveWorkbenchShell() {
-		IWorkbenchWindow workBenchWindow= getActiveWorkbenchWindow();
-		if (workBenchWindow == null)
-			return null;
-		return workBenchWindow.getShell();
-	}
-
-	/**
-	 * Returns the active workbench window
-	 * 
-	 * @return the active workbench window
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (fgPlugin == null)
-			return null;
-		IWorkbench workBench= fgPlugin.getWorkbench();
-		if (workBench == null)
-			return null;
-		return workBench.getActiveWorkbenchWindow();
-	}
-
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow activeWorkbenchWindow= getActiveWorkbenchWindow();
-		if (activeWorkbenchWindow == null)
-			return null;
-		return activeWorkbenchWindow.getActivePage();
-	}
-
-	public static String getPluginId() {
-		return getDefault().getDescriptor().getUniqueIdentifier();
-	}
-
-	/*
-	 * @see AbstractUIPlugin#initializeDefaultPreferences
-	 */
-	protected void initializeDefaultPreferences(IPreferenceStore store) {
-		super.initializeDefaultPreferences(store);
-		JUnitPreferencePage.initializeDefaults(store);
-	}
-
-	public static void log(Throwable e) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, "Error", e)); //$NON-NLS-1$
-	}
-
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-
-	public static URL makeIconFileURL(String name) throws MalformedURLException {
-		if (JUnitPlugin.fgIconBaseURL == null)
-			throw new MalformedURLException();
-		return new URL(JUnitPlugin.fgIconBaseURL, name);
-	}
-
-	static ImageDescriptor getImageDescriptor(String relativePath) {
-		try {
-			return ImageDescriptor.createFromURL(makeIconFileURL(relativePath));
-		} catch (MalformedURLException e) {
-			// should not happen
-			return ImageDescriptor.getMissingImageDescriptor();
-		}
-	}
-
-	/*
-	 * @see ILaunchListener#launchRemoved(ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {
-		fTrackedLaunches.remove(launch);
-		TestRunnerViewPart testRunnerViewPart= findTestRunnerViewPartInActivePage();
-		if (testRunnerViewPart != null && testRunnerViewPart.isCreated() && launch.equals(testRunnerViewPart.getLastLaunch()))
-			testRunnerViewPart.reset();
-	}
-
-	/*
-	 * @see ILaunchListener#launchAdded(ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-		fTrackedLaunches.add(launch);
-	}
-
-	public void connectTestRunner(ILaunch launch, IType launchedType, int port) {
-		TestRunnerViewPart testRunnerViewPart= showTestRunnerViewPartInActivePage(findTestRunnerViewPartInActivePage());
-		if (testRunnerViewPart != null)
-			testRunnerViewPart.startTestRunListening(launchedType, port, launch);
-	}
-
-	private TestRunnerViewPart showTestRunnerViewPartInActivePage(TestRunnerViewPart testRunner) {
-		IWorkbenchPart activePart= null;
-		IWorkbenchPage page= null;
-		try {
-			// TODO: have to force the creation of view part contents 
-			// otherwise the UI will not be updated
-			if (testRunner != null && testRunner.isCreated())
-				return testRunner;
-			page= getActivePage();
-			if (page == null)
-				return null;
-			activePart= page.getActivePart();
-			//	show the result view if it isn't shown yet
-			return (TestRunnerViewPart) page.showView(TestRunnerViewPart.NAME);
-		} catch (PartInitException pie) {
-			log(pie);
-			return null;
-		} finally{
-			//restore focus stolen by the creation of the result view
-			if (page != null && activePart != null)
-				page.activate(activePart);
-		}
-	}
-
-	private TestRunnerViewPart findTestRunnerViewPartInActivePage() {
-		IWorkbenchPage page= getActivePage();
-		if (page == null)
-			return null;
-		return (TestRunnerViewPart) page.findView(TestRunnerViewPart.NAME);
-	}
-
-	/*
-	 * @see ILaunchListener#launchChanged(ILaunch)
-	 */
-	public void launchChanged(final ILaunch launch) {
-		if (!fTrackedLaunches.contains(launch))
-			return;
-
-		ILaunchConfiguration config= launch.getLaunchConfiguration();
-		IType launchedType= null;
-		int port= -1;
-		if (config != null) {
-			// test whether the launch defines the JUnit attributes
-			String portStr= launch.getAttribute(JUnitBaseLaunchConfiguration.PORT_ATTR);
-			String typeStr= launch.getAttribute(JUnitBaseLaunchConfiguration.TESTTYPE_ATTR);
-			if (portStr != null && typeStr != null) {
-				port= Integer.parseInt(portStr);
-				IJavaElement element= JavaCore.create(typeStr);
-				if (element instanceof IType)
-					launchedType= (IType) element;
-			}
-		}
-		if (launchedType != null) {
-			fTrackedLaunches.remove(launch);
-			final int finalPort= port;
-			final IType finalType= launchedType;
-			getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					connectTestRunner(launch, finalType, finalPort);
-				}
-			});
-		}
-	}
-
-	/*
-	 * @see Plugin#startup()
-	 */
-	public void startup() throws CoreException {
-		super.startup();
-		ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-		launchManager.addLaunchListener(this);
-	}
-
-	/*
-	 * @see Plugin#shutdown()
-	 */
-	public void shutdown() throws CoreException {
-		super.shutdown();
-		ILaunchManager launchManager= DebugPlugin.getDefault().getLaunchManager();
-		launchManager.removeLaunchListener(this);
-	}
-
-	public static Display getDisplay() {
-		Shell shell= getActiveWorkbenchShell();
-		if (shell != null) {
-			return shell.getDisplay();
-		}
-		Display display= Display.getCurrent();
-		if (display == null) {
-			display= Display.getDefault();
-		}
-		return display;
-	}
-	/**
-	 * Utility method to create and return a selection dialog that allows
-	 * selection of a specific Java package.  Empty packages are not returned.
-	 * If Java Projects are provided, only packages found within those projects
-	 * are included.  If no Java projects are provided, all Java projects in the
-	 * workspace are considered.
-	 */
-	public static ElementListSelectionDialog createAllPackagesDialog(Shell shell, IJavaProject[] originals, final boolean includeDefaultPackage) throws JavaModelException {
-		final List packageList= new ArrayList();
-		if (originals == null) {
-			IWorkspaceRoot wsroot= ResourcesPlugin.getWorkspace().getRoot();
-			IJavaModel model= JavaCore.create(wsroot);
-			originals= model.getJavaProjects();
-		}
-		final IJavaProject[] projects= originals;
-		final JavaModelException[] exception= new JavaModelException[1];
-		ProgressMonitorDialog monitor= new ProgressMonitorDialog(shell);
-		IRunnableWithProgress r= new IRunnableWithProgress() {
-			public void run(IProgressMonitor pm) {
-				try {
-					Set packageNameSet= new HashSet();
-					pm.beginTask(JUnitMessages.getString("JUnitPlugin.searching"), projects.length); //$NON-NLS-1$
-					for (int i= 0; i < projects.length; i++) {
-						IPackageFragment[] pkgs= projects[i].getPackageFragments();
-						for (int j= 0; j < pkgs.length; j++) {
-							IPackageFragment pkg= pkgs[j];
-							if (!pkg.hasChildren() && (pkg.getNonJavaResources().length > 0))
-								continue;
-
-							String pkgName= pkg.getElementName();
-							if (!includeDefaultPackage && pkgName.length() == 0)
-								continue;
-
-							if (packageNameSet.add(pkgName))
-								packageList.add(pkg);
-						}
-						pm.worked(1);
-					}
-					pm.done();
-				} catch (JavaModelException jme) {
-					exception[0]= jme;
-				}
-			}
-		};
-		try {
-			monitor.run(false, false, r);
-		} catch (InvocationTargetException e) {
-			JUnitPlugin.log(e);
-		} catch (InterruptedException e) {
-			JUnitPlugin.log(e);
-		}
-		if (exception[0] != null)
-			throw exception[0];
-
-		int flags= JavaElementLabelProvider.SHOW_DEFAULT;
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(shell, new JavaElementLabelProvider(flags));
-		dialog.setIgnoreCase(false);
-		dialog.setElements(packageList.toArray()); // XXX inefficient
-		return dialog;
-	}
-
-	/**
-	 * Initializes TestRun Listener extensions
-	 */
-	private void loadTestRunListeners() {
-		fTestRunListeners= new ArrayList();
-		IExtensionPoint extensionPoint= Platform.getPluginRegistry().getExtensionPoint(ID_EXTENSION_POINT_TESTRUN_LISTENERS);
-		if (extensionPoint == null) {
-			return;
-		}
-		IConfigurationElement[] configs= extensionPoint.getConfigurationElements();
-		MultiStatus status= new MultiStatus(PLUGIN_ID, IStatus.OK, "Could not load some testRunner extension points", null); //$NON-NLS-1$ 	
-
-		for (int i= 0; i < configs.length; i++) {
-			try {
-				ITestRunListener testRunListener= (ITestRunListener) configs[i].createExecutableExtension("class"); //$NON-NLS-1$
-				fTestRunListeners.add(testRunListener);
-			} catch (CoreException e) {
-				status.add(e.getStatus());
-			}
-		}
-		if (!status.isOK()) {
-			JUnitPlugin.log(status);
-		}
-	}
-
-	/**
-	 * Returns an array of all TestRun listeners
-	 */
-	public List getTestRunListeners() {
-		if (fTestRunListeners == null) {
-			loadTestRunListeners();
-		}
-		return fTestRunListeners;
-	}
-
-	/**
-	 * Adds a TestRun listener to the collection of listeners
-	 */
-	public void addTestRunListener(ITestRunListener newListener) {
-		if (fTestRunListeners == null) 
-			loadTestRunListeners();
-		for (Iterator iter= fTestRunListeners.iterator(); iter.hasNext();) {
-			Object o= iter.next();
-			if (o == newListener)
-				return;
-		}
-		fTestRunListeners.add(newListener);
-	}
-
-	/**
-	 * Removes a TestRun listener to the collection of listeners
-	 */
-	public void removeTestRunListener(ITestRunListener newListener) {
-		if (fTestRunListeners != null) 
-			fTestRunListeners.remove(newListener);
-	}
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitPreferencePage.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitPreferencePage.java
deleted file mode 100644
index 8741808..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitPreferencePage.java
+++ /dev/null
@@ -1,852 +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
- *     Sebastian Davids: sdavids@gmx.de
- ******************************************************************************/
-package org.eclipse.jdt.internal.junit.ui;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.internal.junit.util.ExceptionHandler;
-import org.eclipse.jdt.internal.junit.util.SWTUtil;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jdt.ui.ISharedImages;
-import org.eclipse.jdt.ui.JavaUI;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnLayoutData;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ContentViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.model.WorkbenchViewerSorter;
-
-/**
- * Preference page for JUnit settings. Supports to define the failure
- * stack filter patterns.
- */
-public class JUnitPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	private static final String DEFAULT_NEW_FILTER_TEXT= ""; //$NON-NLS-1$
-	private static final Image IMG_CUNIT= JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_CLASS);
-	private static final Image IMG_PKG= JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_PACKAGE);
-	
-	private static String[] fgDefaultFilterPatterns= new String[] { "org.eclipse.jdt.internal.junit.runner.*", //$NON-NLS-1$
-		"org.eclipse.jdt.internal.junit.ui.*", //$NON-NLS-1$
-		"junit.framework.TestCase", //$NON-NLS-1$
-		"junit.framework.TestResult", //$NON-NLS-1$
-		"junit.framework.TestSuite", //$NON-NLS-1$
-		"junit.framework.Assert", //$NON-NLS-1$
-		"java.lang.reflect.Method.invoke" //$NON-NLS-1$
-	};
-
-	// Step filter widgets
-	private CheckboxTableViewer fFilterViewer;
-	private Table fFilterTable;
-
-	private Button fShowOnErrorCheck;
-	private Button fAddPackageButton;
-	private Button fAddTypeButton;
-	private Button fRemoveFilterButton;
-	private Button fAddFilterButton;
-
-	private Button fEnableAllButton;
-	private Button fDisableAllButton;
-
-	private Text fEditorText;
-	private String fInvalidEditorText= null;
-	private TableEditor fTableEditor;
-	private TableItem fNewTableItem;
-	private Filter fNewStackFilter;
-	private Label fTableLabel;
-
-	private StackFilterContentProvider fStackFilterContentProvider;
-
-	/**
-	 * Model object that represents a single entry in the filter table.
-	 */
-	private class Filter {
-
-		private String fName;
-		private boolean fChecked;
-
-		public Filter(String name, boolean checked) {
-			setName(name);
-			setChecked(checked);
-		}
-
-		public String getName() {
-			return fName;
-		}
-		
-		public void setName(String name) {
-			fName= name;
-		}
-				
-		public boolean isChecked() {
-			return fChecked;
-		}
-
-		public void setChecked(boolean checked) {
-			fChecked= checked;
-		}
-
-		public boolean equals(Object o) {
-			if (!(o instanceof Filter))
-				return false;
-
-			Filter other= (Filter) o;
-			return (getName().equals(other.getName()));
-		}
-
-		public int hashCode() {
-			return fName.hashCode();
-		}
-	}
-
-	/**
-	 * Sorter for the filter table; sorts alphabetically ascending.
-	 */
-	private class FilterViewerSorter extends WorkbenchViewerSorter {
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			ILabelProvider lprov= (ILabelProvider) ((ContentViewer) viewer).getLabelProvider();
-			String name1= lprov.getText(e1);
-			String name2= lprov.getText(e2);
-			if (name1 == null)
-				name1= ""; //$NON-NLS-1$
-
-			if (name2 == null)
-				name2= ""; //$NON-NLS-1$
-
-			if (name1.length() > 0 && name2.length() > 0) {
-				char char1= name1.charAt(name1.length() - 1);
-				char char2= name2.charAt(name2.length() - 1);
-				if (char1 == '*' && char1 != char2)
-					return -1;
-
-				if (char2 == '*' && char2 != char1)
-					return 1;
-			}
-			return name1.compareTo(name2);
-		}
-	}
-
-	/**
-	 * Label provider for Filter model objects
-	 */
-	private class FilterLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-		public String getColumnText(Object object, int column) {
-			return (column == 0) ? ((Filter) object).getName() : ""; //$NON-NLS-1$
-		}
-
-		public String getText(Object element) {
-			return ((Filter) element).getName();
-		}
-
-		public Image getColumnImage(Object object, int column) {
-			String name= ((Filter) object).getName();
-			if (name.endsWith(".*") || name.equals(JUnitMessages.getString("JUnitMainTab.label.defaultpackage"))) { //$NON-NLS-1$ //$NON-NLS-2$
-				//package
-				return IMG_PKG;
-			} else if ("".equals(name)) { //$NON-NLS-1$
-				//needed for the in-place editor
-				return null;
-			} else if ((Character.isUpperCase(name.charAt(0))) && (name.indexOf('.') < 0)) {
-				//class in default package
-				return IMG_CUNIT;
-			} else {
-				//fully-qualified class or other filter
-				final int lastDotIndex= name.lastIndexOf('.');
-				if ((-1 != lastDotIndex) && ((name.length() - 1) != lastDotIndex) && Character.isUpperCase(name.charAt(lastDotIndex + 1)))
-					return IMG_CUNIT;
-			}
-			//other filter
-			return null;
-		}
-	}
-
-	/**
-	 * Content provider for the filter table.  Content consists of instances of
-	 * Filter.
-	 */
-	private class StackFilterContentProvider implements IStructuredContentProvider {
-
-		private List fFilters;
-
-		public StackFilterContentProvider() {
-			List active= createActiveStackFiltersList();
-			List inactive= createInactiveStackFiltersList();
-			populateFilters(active, inactive);
-		}
-
-		public void setDefaults() {
-			fFilterViewer.remove(fFilters.toArray());
-			List active= createDefaultStackFiltersList();
-			List inactive= new ArrayList();
-			populateFilters(active, inactive);
-		}
-
-		protected void populateFilters(List activeList, List inactiveList) {
-			fFilters= new ArrayList(activeList.size() + inactiveList.size());
-			populateList(activeList, true);
-			if (inactiveList.size() != 0)
-				populateList(inactiveList, false);
-		}
-
-		protected void populateList(List list, boolean checked) {
-			Iterator iterator= list.iterator();
-
-			while (iterator.hasNext()) {
-				String name= (String) iterator.next();
-				addFilter(name, checked);
-			}
-		}
-
-		public Filter addFilter(String name, boolean checked) {
-			Filter filter= new Filter(name, checked);
-			if (!fFilters.contains(filter)) {
-				fFilters.add(filter);
-				fFilterViewer.add(filter);
-				fFilterViewer.setChecked(filter, checked);
-			}
-			updateActions();
-			return filter;
-		}
-
-		public void saveFilters() {
-			List active= new ArrayList(fFilters.size());
-			List inactive= new ArrayList(fFilters.size());
-			Iterator iterator= fFilters.iterator();
-			while (iterator.hasNext()) {
-				Filter filter= (Filter) iterator.next();
-				String name= filter.getName();
-				if (filter.isChecked())
-					active.add(name);
-				else
-					inactive.add(name);
-			}
-			String pref= JUnitPreferencePage.serializeList((String[]) active.toArray(new String[active.size()]));
-			getPreferenceStore().setValue(IJUnitPreferencesConstants.PREF_ACTIVE_FILTERS_LIST, pref);
-			pref= JUnitPreferencePage.serializeList((String[]) inactive.toArray(new String[inactive.size()]));
-			getPreferenceStore().setValue(IJUnitPreferencesConstants.PREF_INACTIVE_FILTERS_LIST, pref);
-		}
-
-		public void removeFilters(Object[] filters) {
-			for (int i= (filters.length - 1); i >= 0; --i) {
-				Filter filter= (Filter) filters[i];
-				fFilters.remove(filter);
-			}
-			fFilterViewer.remove(filters);
-			updateActions();
-		}
-
-		public void toggleFilter(Filter filter) {
-			boolean newState= !filter.isChecked();
-			filter.setChecked(newState);
-			fFilterViewer.setChecked(filter, newState);
-		}
-
-		public Object[] getElements(Object inputElement) {
-			return fFilters.toArray();
-		}
-		
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
-		public void dispose() {}
-
-	}
-		
-	public JUnitPreferencePage() {
-		super();
-		setDescription(JUnitMessages.getString("JUnitPreferencePage.description")); //$NON-NLS-1$
-		setPreferenceStore(JUnitPlugin.getDefault().getPreferenceStore());
-	}
-
-	protected Control createContents(Composite parent) {
-		WorkbenchHelp.setHelp(parent, IJUnitHelpContextIds.JUNIT_PREFERENCE_PAGE);
-
-		Composite composite= new Composite(parent, SWT.NULL);
-		GridLayout layout= new GridLayout();
-		layout.numColumns= 1;
-		layout.marginHeight= 0;
-		layout.marginWidth= 0;
-		composite.setLayout(layout);
-		GridData data= new GridData();
-		data.verticalAlignment= GridData.FILL;
-		data.horizontalAlignment= GridData.FILL;
-		composite.setLayoutData(data);
-
-		createStackFilterPreferences(composite);
-		Dialog.applyDialogFont(composite);
-		return composite;
-	}
-
-	/**
-	 * Create a group to contain the step filter related widgetry
-	 */
-	private void createStackFilterPreferences(Composite composite) {
-		Composite container= new Composite(composite, SWT.NONE);
-		GridLayout layout= new GridLayout();
-		layout.numColumns= 2;
-		layout.marginHeight= 0;
-		layout.marginWidth= 0;
-		container.setLayout(layout);
-		GridData gd= new GridData(GridData.FILL_BOTH);
-		container.setLayoutData(gd);
-
-		createShowCheck(container);
-		createFilterTable(container);
-		createStepFilterButtons(container);
-	}
-
-	private void createShowCheck(Composite composite) {
-		GridData data;
-		fShowOnErrorCheck= new Button(composite, SWT.CHECK);
-		fShowOnErrorCheck.setText(JUnitMessages.getString("JUnitPreferencePage.showcheck.label")); //$NON-NLS-1$
-		data= new GridData();
-		data.horizontalAlignment= GridData.FILL;
-		data.horizontalSpan= 2;
-		fShowOnErrorCheck.setLayoutData(data);
-		fShowOnErrorCheck.setSelection(getShowOnErrorOnly());
-	}
-
-	private void createFilterTable(Composite container) {
-		fTableLabel= new Label(container, SWT.NONE);
-		fTableLabel.setText(JUnitMessages.getString("JUnitPreferencePage.filter.label")); //$NON-NLS-1$
-		GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		gd.horizontalSpan= 2;
-		fTableLabel.setLayoutData(gd);
-
-		fFilterTable= new Table(container, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
-
-		gd= new GridData(GridData.FILL_HORIZONTAL);
-		fFilterTable.setLayoutData(gd);
-
-		TableLayout tableLayout= new TableLayout();
-		ColumnLayoutData[] columnLayoutData= new ColumnLayoutData[1];
-		columnLayoutData[0]= new ColumnWeightData(100);
-		tableLayout.addColumnData(columnLayoutData[0]);
-		fFilterTable.setLayout(tableLayout);
-		new TableColumn(fFilterTable, SWT.NONE);
-		fFilterViewer= new CheckboxTableViewer(fFilterTable);
-		fTableEditor= new TableEditor(fFilterTable);
-		fFilterViewer.setLabelProvider(new FilterLabelProvider());
-		fFilterViewer.setSorter(new FilterViewerSorter());
-		fStackFilterContentProvider= new StackFilterContentProvider();
-		fFilterViewer.setContentProvider(fStackFilterContentProvider);
-		// input just needs to be non-null
-		fFilterViewer.setInput(this);
-		gd= new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		fFilterViewer.getTable().setLayoutData(gd);
-		fFilterViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				Filter filter= (Filter) event.getElement();
-				fStackFilterContentProvider.toggleFilter(filter);
-			}
-		});
-		fFilterViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection selection= event.getSelection();
-				fRemoveFilterButton.setEnabled(!selection.isEmpty());
-			}
-		});
-	}
-
-	private void createStepFilterButtons(Composite container) {
-		Composite buttonContainer= new Composite(container, SWT.NONE);
-		GridData gd= new GridData(GridData.FILL_VERTICAL);
-		buttonContainer.setLayoutData(gd);
-		GridLayout buttonLayout= new GridLayout();
-		buttonLayout.numColumns= 1;
-		buttonLayout.marginHeight= 0;
-		buttonLayout.marginWidth= 0;
-		buttonContainer.setLayout(buttonLayout);
-
-		fAddFilterButton= new Button(buttonContainer, SWT.PUSH);
-		fAddFilterButton.setText(JUnitMessages.getString("JUnitPreferencePage.addfilterbutton.label")); //$NON-NLS-1$
-		fAddFilterButton.setToolTipText(JUnitMessages.getString("JUnitPreferencePage.addfilterbutton.tooltip")); //$NON-NLS-1$
-		gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
-		fAddFilterButton.setLayoutData(gd);
-		SWTUtil.setButtonDimensionHint(fAddFilterButton);
-		fAddFilterButton.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				editFilter();
-			}
-		});
-
-		fAddTypeButton= new Button(buttonContainer, SWT.PUSH);
-		fAddTypeButton.setText(JUnitMessages.getString("JUnitPreferencePage.addtypebutton.label")); //$NON-NLS-1$
-		fAddTypeButton.setToolTipText(JUnitMessages.getString("JUnitPreferencePage.addtypebutton.tooltip")); //$NON-NLS-1$
-		gd= getButtonGridData(fAddTypeButton);
-		fAddTypeButton.setLayoutData(gd);
-		SWTUtil.setButtonDimensionHint(fAddTypeButton);
-		fAddTypeButton.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				addType();
-			}
-		});
-
-		fAddPackageButton= new Button(buttonContainer, SWT.PUSH);
-		fAddPackageButton.setText(JUnitMessages.getString("JUnitPreferencePage.addpackagebutton.label")); //$NON-NLS-1$
-		fAddPackageButton.setToolTipText(JUnitMessages.getString("JUnitPreferencePage.addpackagebutton.tooltip")); //$NON-NLS-1$
-		gd= getButtonGridData(fAddPackageButton);
-		fAddPackageButton.setLayoutData(gd);
-		SWTUtil.setButtonDimensionHint(fAddPackageButton);
-		fAddPackageButton.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				addPackage();
-			}
-		});
-
-		fRemoveFilterButton= new Button(buttonContainer, SWT.PUSH);
-		fRemoveFilterButton.setText(JUnitMessages.getString("JUnitPreferencePage.removefilterbutton.label")); //$NON-NLS-1$
-		fRemoveFilterButton.setToolTipText(JUnitMessages.getString("JUnitPreferencePage.removefilterbutton.tooltip")); //$NON-NLS-1$
-		gd= getButtonGridData(fRemoveFilterButton);
-		fRemoveFilterButton.setLayoutData(gd);
-		SWTUtil.setButtonDimensionHint(fRemoveFilterButton);
-		fRemoveFilterButton.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				removeFilters();
-			}
-		});
-		fRemoveFilterButton.setEnabled(false);
-
-		fEnableAllButton= new Button(buttonContainer, SWT.PUSH);
-		fEnableAllButton.setText(JUnitMessages.getString("JUnitPreferencePage.enableallbutton.label")); //$NON-NLS-1$
-		fEnableAllButton.setToolTipText(JUnitMessages.getString("JUnitPreferencePage.enableallbutton.tooltip")); //$NON-NLS-1$
-		gd= getButtonGridData(fEnableAllButton);
-		fEnableAllButton.setLayoutData(gd);
-		SWTUtil.setButtonDimensionHint(fEnableAllButton);
-		fEnableAllButton.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				checkAllFilters(true);
-			}
-		});
-
-		fDisableAllButton= new Button(buttonContainer, SWT.PUSH);
-		fDisableAllButton.setText(JUnitMessages.getString("JUnitPreferencePage.disableallbutton.label")); //$NON-NLS-1$
-		fDisableAllButton.setToolTipText(JUnitMessages.getString("JUnitPreferencePage.disableallbutton.tooltip")); //$NON-NLS-1$
-		gd= getButtonGridData(fDisableAllButton);
-		fDisableAllButton.setLayoutData(gd);
-		SWTUtil.setButtonDimensionHint(fDisableAllButton);
-		fDisableAllButton.addListener(SWT.Selection, new Listener() {
-			public void handleEvent(Event e) {
-				checkAllFilters(false);
-			}
-		});
-
-	}
-
-	private GridData getButtonGridData(Button button) {
-		GridData gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
-		int widthHint= convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-		gd.widthHint= Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-		gd.heightHint= convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT);
-		return gd;
-	}
-
-	public void init(IWorkbench workbench) {}
-	
-	/**
-	 * Create a new filter in the table (with the default 'new filter' value),
-	 * then open up an in-place editor on it.
-	 */
-	private void editFilter() {
-		// if a previous edit is still in progress, finish it
-		if (fEditorText != null)
-			validateChangeAndCleanup();
-
-		fNewStackFilter= fStackFilterContentProvider.addFilter(DEFAULT_NEW_FILTER_TEXT, true);
-		fNewTableItem= fFilterTable.getItem(0);
-
-		// create & configure Text widget for editor
-		// Fix for bug 1766.  Border behavior on for text fields varies per platform.
-		// On Motif, you always get a border, on other platforms,
-		// you don't.  Specifying a border on Motif results in the characters
-		// getting pushed down so that only there very tops are visible.  Thus,
-		// we have to specify different style constants for the different platforms.
-		int textStyles= SWT.SINGLE | SWT.LEFT;
-		if (!SWT.getPlatform().equals("motif")) //$NON-NLS-1$
-			textStyles |= SWT.BORDER;
-
-		fEditorText= new Text(fFilterTable, textStyles);
-		GridData gd= new GridData(GridData.FILL_BOTH);
-		fEditorText.setLayoutData(gd);
-
-		// set the editor
-		fTableEditor.horizontalAlignment= SWT.LEFT;
-		fTableEditor.grabHorizontal= true;
-		fTableEditor.setEditor(fEditorText, fNewTableItem, 0);
-
-		// get the editor ready to use
-		fEditorText.setText(fNewStackFilter.getName());
-		fEditorText.selectAll();
-		setEditorListeners(fEditorText);
-		fEditorText.setFocus();
-	}
-
-	private void setEditorListeners(Text text) {
-		// CR means commit the changes, ESC means abort and don't commit
-		text.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent event) {
-				if (event.character == SWT.CR) {
-					if (fInvalidEditorText != null) {
-						fEditorText.setText(fInvalidEditorText);
-						fInvalidEditorText= null;
-					} else
-						validateChangeAndCleanup();
-				} else if (event.character == SWT.ESC) {
-					removeNewFilter();
-					cleanupEditor();
-				}
-			}
-		});
-		// Consider loss of focus on the editor to mean the same as CR
-		text.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent event) {
-				if (fInvalidEditorText != null) {
-					fEditorText.setText(fInvalidEditorText);
-					fInvalidEditorText= null;
-				} else
-					validateChangeAndCleanup();
-			}
-		});
-		// Consume traversal events from the text widget so that CR doesn't 
-		// traverse away to dialog's default button.  Without this, hitting
-		// CR in the text field closes the entire dialog.
-		text.addListener(SWT.Traverse, new Listener() {
-			public void handleEvent(Event event) {
-				event.doit= false;
-			}
-		});
-	}
-
-	private void validateChangeAndCleanup() {
-		String trimmedValue= fEditorText.getText().trim();
-		// if the new value is blank, remove the filter
-		if (trimmedValue.length() < 1)
-			removeNewFilter();
-
-		// if it's invalid, beep and leave sitting in the editor
-		else if (!validateEditorInput(trimmedValue)) {
-			fInvalidEditorText= trimmedValue;
-			fEditorText.setText(JUnitMessages.getString("JUnitPreferencePage.invalidstepfilterreturnescape")); //$NON-NLS-1$
-			getShell().getDisplay().beep();
-			return;
-			// otherwise, commit the new value if not a duplicate
-		} else {
-			Object[] filters= fStackFilterContentProvider.getElements(null);
-			for (int i= 0; i < filters.length; i++) {
-				Filter filter= (Filter) filters[i];
-				if (filter.getName().equals(trimmedValue)) {
-					removeNewFilter();
-					cleanupEditor();
-					return;
-				}
-			}
-			fNewTableItem.setText(trimmedValue);
-			fNewStackFilter.setName(trimmedValue);
-			fFilterViewer.refresh();
-		}
-		cleanupEditor();
-	}
-
-	/**
-	 * Cleanup all widgetry & resources used by the in-place editing
-	 */
-	private void cleanupEditor() {
-		if (fEditorText == null)
-			return;
-
-		fNewStackFilter= null;
-		fNewTableItem= null;
-		fTableEditor.setEditor(null, null, 0);
-		fEditorText.dispose();
-		fEditorText= null;
-	}
-
-	private void removeNewFilter() {
-		fStackFilterContentProvider.removeFilters(new Object[] { fNewStackFilter });
-	}
-
-	/**
-	 * A valid step filter is simply one that is a valid Java identifier.
-	 * and, as defined in the JDI spec, the regular expressions used for
-	 * step filtering must be limited to exact matches or patterns that
-	 * begin with '*' or end with '*'. Beyond this, a string cannot be validated
-	 * as corresponding to an existing type or package (and this is probably not
-	 * even desirable).  
-	 */
-	private boolean validateEditorInput(String trimmedValue) {
-		char firstChar= trimmedValue.charAt(0);
-		if ((!(Character.isJavaIdentifierStart(firstChar)) || (firstChar == '*')))
-			return false;
-
-		int length= trimmedValue.length();
-		for (int i= 1; i < length; i++) {
-			char c= trimmedValue.charAt(i);
-			if (!Character.isJavaIdentifierPart(c)) {
-				if (c == '.' && i != (length - 1))
-					continue;
-				if (c == '*' && i == (length - 1))
-					continue;
-
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private void addType() {
-		Shell shell= getShell();
-		SelectionDialog dialog= null;
-		try {
-			dialog=
-				JavaUI.createTypeDialog(
-					shell,
-					new ProgressMonitorDialog(shell),
-					SearchEngine.createWorkspaceScope(),
-					IJavaElementSearchConstants.CONSIDER_CLASSES,
-					false);
-		} catch (JavaModelException jme) {
-			String title= JUnitMessages.getString("JUnitPreferencePage.addtypedialog.title"); //$NON-NLS-1$
-			String message= JUnitMessages.getString("JUnitPreferencePage.addtypedialog.error.message"); //$NON-NLS-1$
-			ExceptionHandler.handle(jme, shell, title, message);
-			return;
-		}
-
-		dialog.setTitle(JUnitMessages.getString("JUnitPreferencePage.addtypedialog.title")); //$NON-NLS-1$
-		dialog.setMessage(JUnitMessages.getString("JUnitPreferencePage.addtypedialog.message")); //$NON-NLS-1$
-		if (dialog.open() == IDialogConstants.CANCEL_ID)
-			return;
-
-		Object[] types= dialog.getResult();
-		if (types != null && types.length > 0) {
-			IType type= (IType) types[0];
-			fStackFilterContentProvider.addFilter(type.getFullyQualifiedName(), true);
-		}
-	}
-
-	private void addPackage() {
-		Shell shell= getShell();
-		ElementListSelectionDialog dialog= null;
-		try {
-			dialog= JUnitPlugin.createAllPackagesDialog(shell, null, true);
-		} catch (JavaModelException jme) {
-			String title= JUnitMessages.getString("JUnitPreferencePage.addpackagedialog.title"); //$NON-NLS-1$
-			String message= JUnitMessages.getString("JUnitPreferencePage.addpackagedialog.error.message"); //$NON-NLS-1$
-			ExceptionHandler.handle(jme, shell, title, message);
-			return;
-		}
-
-		dialog.setTitle(JUnitMessages.getString("JUnitPreferencePage.addpackagedialog.title")); //$NON-NLS-1$
-		dialog.setMessage(JUnitMessages.getString("JUnitPreferencePage.addpackagedialog.message")); //$NON-NLS-1$
-		dialog.setMultipleSelection(true);
-		if (dialog.open() == IDialogConstants.CANCEL_ID)
-			return;
-
-		Object[] packages= dialog.getResult();
-		if (packages == null)
-			return;
-
-		for (int i= 0; i < packages.length; i++) {
-			IJavaElement pkg= (IJavaElement) packages[i];
-
-			String filter= pkg.getElementName();
-			if (filter.length() < 1)
-				filter= JUnitMessages.getString("JUnitMainTab.label.defaultpackage"); //$NON-NLS-1$
-			else
-				filter += ".*"; //$NON-NLS-1$
-
-			fStackFilterContentProvider.addFilter(filter, true);
-		}
-	}
-	private void removeFilters() {
-		IStructuredSelection selection= (IStructuredSelection) fFilterViewer.getSelection();
-		fStackFilterContentProvider.removeFilters(selection.toArray());
-	}
-
-	private void checkAllFilters(boolean check) {
-		Object[] filters= fStackFilterContentProvider.getElements(null);
-		for (int i= (filters.length - 1); i >= 0; --i)
-			 ((Filter) filters[i]).setChecked(check);
-
-		fFilterViewer.setAllChecked(check);
-	}
-	
-	public boolean performOk() {
-		IPreferenceStore store= getPreferenceStore();
-		store.setValue(IJUnitPreferencesConstants.SHOW_ON_ERROR_ONLY, fShowOnErrorCheck.getSelection());
-		fStackFilterContentProvider.saveFilters();
-		return true;
-	}
-
-	protected void performDefaults() {
-		setDefaultValues();
-		super.performDefaults();
-	}
-
-	private void setDefaultValues() {
-		fStackFilterContentProvider.setDefaults();
-	}
-
-	/**
-	 * Returns the default list of active stack filters.
-	 * 
-	 * @return list
-	 */
-	protected List createDefaultStackFiltersList() {
-		return Arrays.asList(fgDefaultFilterPatterns);
-	}
-
-	/**
-	 * Returns a list of active stack filters.
-	 * 
-	 * @return list
-	 */
-	protected List createActiveStackFiltersList() {
-		return Arrays.asList(getFilterPatterns());
-	}
-
-	/**
-	 * Returns a list of active stack filters.
-	 * 
-	 * @return list
-	 */
-	protected List createInactiveStackFiltersList() {
-		String[] strings=
-			JUnitPreferencePage.parseList(getPreferenceStore().getString(IJUnitPreferencesConstants.PREF_INACTIVE_FILTERS_LIST));
-		return Arrays.asList(strings);
-	}
-
-	protected void updateActions() {
-		if (fEnableAllButton == null)
-			return;
-
-		boolean enabled= fFilterViewer.getTable().getItemCount() > 0;
-		fEnableAllButton.setEnabled(enabled);
-		fDisableAllButton.setEnabled(enabled);
-	}
-
-	public static String[] getFilterPatterns() {
-		IPreferenceStore store= JUnitPlugin.getDefault().getPreferenceStore();
-		return JUnitPreferencePage.parseList(store.getString(IJUnitPreferencesConstants.PREF_ACTIVE_FILTERS_LIST));
-	}
-
-	public static boolean getFilterStack() {
-		IPreferenceStore store= JUnitPlugin.getDefault().getPreferenceStore();
-		return store.getBoolean(IJUnitPreferencesConstants.DO_FILTER_STACK);
-	}
-
-	public static void setFilterStack(boolean filter) {
-		IPreferenceStore store= JUnitPlugin.getDefault().getPreferenceStore();
-		store.setValue(IJUnitPreferencesConstants.DO_FILTER_STACK, filter);
-	}
-
-	public static void initializeDefaults(IPreferenceStore store) {
-		store.setDefault(IJUnitPreferencesConstants.DO_FILTER_STACK, true);
-		store.setDefault(IJUnitPreferencesConstants.SHOW_ON_ERROR_ONLY, true);
-
-		String list= store.getString(IJUnitPreferencesConstants.PREF_ACTIVE_FILTERS_LIST);
-
-		if ("".equals(list)) { //$NON-NLS-1$
-			String pref= JUnitPreferencePage.serializeList(fgDefaultFilterPatterns);
-			store.setValue(IJUnitPreferencesConstants.PREF_ACTIVE_FILTERS_LIST, pref);
-		}
-
-		store.setValue(IJUnitPreferencesConstants.PREF_INACTIVE_FILTERS_LIST, ""); //$NON-NLS-1$
-	}
-
-	public static boolean getShowOnErrorOnly() {
-		IPreferenceStore store= JUnitPlugin.getDefault().getPreferenceStore();
-		return store.getBoolean(IJUnitPreferencesConstants.SHOW_ON_ERROR_ONLY);
-	}
-	
-	/**
-	 * Parses the comma separated string into an array of strings
-	 * 
-	 * @return list
-	 */
-	private static String[] parseList(String listString) {
-		List list= new ArrayList(10);
-		StringTokenizer tokenizer= new StringTokenizer(listString, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens())
-			list.add(tokenizer.nextToken());
-		return (String[]) list.toArray(new String[list.size()]);
-	}
-
-	/**
-	 * Serializes the array of strings into one comma
-	 * separated string.
-	 * 
-	 * @param list array of strings
-	 * @return a single string composed of the given list
-	 */
-	private static String serializeList(String[] list) {
-		if (list == null)
-			return ""; //$NON-NLS-1$
-
-		StringBuffer buffer= new StringBuffer();
-		for (int i= 0; i < list.length; i++) {
-			if (i > 0)
-				buffer.append(',');
-
-			buffer.append(list[i]);
-		}
-		return buffer.toString();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitProgressBar.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitProgressBar.java
deleted file mode 100644
index f66e4c0..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitProgressBar.java
+++ /dev/null
@@ -1,157 +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.jdt.internal.junit.ui;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A progress bar with a red/green indication for success or failure.
- */
-public class JUnitProgressBar extends Canvas {
-	private static final int DEFAULT_WIDTH = 160;
-	private static final int DEFAULT_HEIGHT = 18;
-
-	private int fCurrentTickCount= 0;
-	private int fMaxTickCount= 0;	
-	private int fColorBarWidth= 0;
-	private Color fOKColor;
-	private Color fFailureColor;
-	private boolean fError;
-	
-	public JUnitProgressBar(Composite parent) {
-		super(parent, SWT.NONE);
-		
-		addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				fColorBarWidth= scale(fCurrentTickCount);
-				redraw();
-			}
-		});	
-		addPaintListener(new PaintListener() {
-			public void paintControl(PaintEvent e) {
-				paint(e);
-			}
-		});
-		addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				fFailureColor.dispose();
-				fOKColor.dispose();
-			}
-		});
-		Display display= parent.getDisplay();
-		fFailureColor= new Color(display, 223, 63, 63);
-		fOKColor= new Color(display, 63, 127, 63);
-	}
-
-	public void setMaximum(int max) {
-		fMaxTickCount= max;
-	}
-		
-	public void reset() {
-		fError= false;
-		fCurrentTickCount= 0;
-		fColorBarWidth= 0;
-		fMaxTickCount= 0;
-		redraw();
-	}
-	
-	private void paintStep(int startX, int endX) {
-		GC gc = new GC(this);	
-		setStatusColor(gc);
-		Rectangle rect= getClientArea();
-		startX= Math.max(1, startX);
-		gc.fillRectangle(startX, 1, endX-startX, rect.height-2);
-		gc.dispose();		
-	}
-
-	private void setStatusColor(GC gc) {
-		if (fError)
-			gc.setBackground(fFailureColor);
-		else
-			gc.setBackground(fOKColor);
-	}
-
-	private int scale(int value) {
-		if (fMaxTickCount > 0) {
-			Rectangle r= getClientArea();
-			if (r.width != 0)
-				return Math.max(0, value*(r.width-2)/fMaxTickCount);
-		}
-		return value; 
-	}
-	
-	private void drawBevelRect(GC gc, int x, int y, int w, int h, Color topleft, Color bottomright) {
-		gc.setForeground(topleft);
-		gc.drawLine(x, y, x+w-1, y);
-		gc.drawLine(x, y, x, y+h-1);
-		
-		gc.setForeground(bottomright);
-		gc.drawLine(x+w, y, x+w, y+h);
-		gc.drawLine(x, y+h, x+w, y+h);
-	}
-	
-	private void paint(PaintEvent event) {
-		GC gc = event.gc;
-		Display disp= getDisplay();
-			
-		Rectangle rect= getClientArea();
-		gc.fillRectangle(rect);
-		drawBevelRect(gc, rect.x, rect.y, rect.width-1, rect.height-1,
-			disp.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW),
-			disp.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
-		
-		setStatusColor(gc);
-		fColorBarWidth= Math.min(rect.width-2, fColorBarWidth);
-		gc.fillRectangle(1, 1, fColorBarWidth, rect.height-2);
-	}	
-	
-	public Point computeSize(int wHint, int hHint, boolean changed) {
-		checkWidget();
-		Point size= new Point(DEFAULT_WIDTH, DEFAULT_HEIGHT);
-		if (wHint != SWT.DEFAULT) size.x= wHint;
-		if (hHint != SWT.DEFAULT) size.y= hHint;
-		return size;
-	}
-	
-	public void step(int failures) {
-		fCurrentTickCount++;
-		int x= fColorBarWidth;
-
-		fColorBarWidth= scale(fCurrentTickCount);
-
-		if (!fError && failures > 0) {
-			fError= true;
-			x= 1;
-		}
-		if (fCurrentTickCount == fMaxTickCount)
-			fColorBarWidth= getClientArea().width-1;
-		paintStep(x, fColorBarWidth);
-	}
-
-	public void refresh(boolean hasErrors) {
-		fError= hasErrors;
-		redraw();
-	}
-	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitQuickFixProcessor.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitQuickFixProcessor.java
deleted file mode 100644
index 476be66..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/JUnitQuickFixProcessor.java
+++ /dev/null
@@ -1,57 +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
- *     Sebastian Davids <sdavids@gmx.de> - bug 48696
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.ui;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jdt.ui.text.java.IProblemLocation;
-import org.eclipse.jdt.ui.text.java.IQuickFixProcessor;
-
-public class JUnitQuickFixProcessor implements IQuickFixProcessor {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.text.java.IQuickFixProcessor#hasCorrections(org.eclipse.jdt.core.ICompilationUnit, int)
-	 */
-	public boolean hasCorrections(ICompilationUnit unit, int problemId) {
-		return IProblem.SuperclassNotFound == problemId || IProblem.ImportNotFound == problemId;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.text.java.IQuickFixProcessor#getCorrections(org.eclipse.jdt.ui.text.java.IInvocationContext, org.eclipse.jdt.ui.text.java.IProblemLocation[])
-	 */
-	public IJavaCompletionProposal[] getCorrections(final IInvocationContext context, IProblemLocation[] locations)  {
-		if (isJUnitProblem(context, locations))
-			return new IJavaCompletionProposal[] { new JUnitAddLibraryProposal(context) };
-		return new IJavaCompletionProposal[] {};
-	}
-
-	private boolean isJUnitProblem(IInvocationContext context, IProblemLocation[] locations) {
-		ICompilationUnit unit= context.getCompilationUnit();
-		for (int i= 0; i < locations.length; i++) {
-			IProblemLocation location= locations[i];
-			try {
-				String s= unit.getBuffer().getText(location.getOffset(), location.getLength());
-				if (s.equals("TestCase") //$NON-NLS-1$
-						|| s.equals("junit") //$NON-NLS-1$
-						|| s.equals("TestSuite") //$NON-NLS-1$
-						|| s.equals("Test")) //$NON-NLS-1$
-					return true; //$NON-NLS-1$
-			} catch (JavaModelException e) {
-			    JUnitPlugin.log(e.getStatus());
-			}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenEditorAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenEditorAction.java
deleted file mode 100644
index cce2493..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenEditorAction.java
+++ /dev/null
@@ -1,80 +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.jdt.internal.junit.ui;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Abstract Action for opening a Java editor.
- */
-public abstract class OpenEditorAction extends Action {
-	protected String fClassName;
-	protected TestRunnerViewPart fTestRunner;
-	
-	/**
-	 * Constructor for OpenEditorAction.
-	 */
-	protected OpenEditorAction(TestRunnerViewPart testRunner, String testClassName) {
-		super(JUnitMessages.getString("OpenEditorAction.action.label")); //$NON-NLS-1$
-		fClassName= testClassName;
-		fTestRunner= testRunner;
-	}
-
-	/*
-	 * @see IAction#run()
-	 */
-	public void run() {
-		ITextEditor textEditor= null;
-		try {
-			IJavaElement element= findElement(getLaunchedProject(), fClassName);
-			if (element == null) {
-				MessageDialog.openError(getShell(), 
-					JUnitMessages.getString("OpenEditorAction.error.cannotopen.title"), JUnitMessages.getString("OpenEditorAction.error.cannotopen.message")); //$NON-NLS-1$ //$NON-NLS-2$
-				return;
-			} 
-			textEditor= (ITextEditor)EditorUtility.openInEditor(element, false);			
-		} catch (CoreException e) {
-			ErrorDialog.openError(getShell(), JUnitMessages.getString("OpenEditorAction.error.dialog.title"), JUnitMessages.getString("OpenEditorAction.error.dialog.message"), e.getStatus()); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		if (textEditor == null) {
-			fTestRunner.postInfo(JUnitMessages.getString("OpenEditorAction.message.cannotopen")); //$NON-NLS-1$
-			return;
-		}
-		reveal(textEditor);
-	}
-	
-	protected Shell getShell() {
-		return fTestRunner.getSite().getShell();
-	}
-
-	protected IJavaProject getLaunchedProject() {
-		return fTestRunner.getLaunchedProject();
-	}
-	
-	protected String getClassName() {
-		return fClassName;
-	}
-
-	protected abstract IJavaElement findElement(IJavaProject project, String className) throws JavaModelException;
-	
-	protected abstract void reveal(ITextEditor editor);
-	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenEditorAtLineAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenEditorAtLineAction.java
deleted file mode 100644
index 69520e0..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenEditorAtLineAction.java
+++ /dev/null
@@ -1,108 +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
- *     Sebastian Davids: sdavids@gmx.de bug 37333 Failure Trace cannot 
- * 			navigate to non-public class in CU throwing Exception
-
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.ui;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchResultCollector;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.ISearchPattern;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-
-/**
- * Open a test in the Java editor and reveal a given line
- */
-public class OpenEditorAtLineAction extends OpenEditorAction {
-
-	//fix for bug 37333
-	private class NonPublicClassInCUCollector implements IJavaSearchResultCollector {
-		private IJavaElement fFound;
-
-		public void accept(IResource resource, int start, int end, IJavaElement enclosingElement, int accuracy) {
-
-			if ((enclosingElement instanceof IType) && (resource.getName().equals(fCUName)))
-				fFound= enclosingElement;
-		}
-
-		public IProgressMonitor getProgressMonitor() {
-			return new NullProgressMonitor();
-		}
-
-		public void aboutToStart() {}
-		public void done() {}
-	}
-		
-	private int fLineNumber;
-	private String fCUName;
-	
-	/**
-	 * Constructor for OpenEditorAtLineAction.
-	 */
-	public OpenEditorAtLineAction(TestRunnerViewPart testRunner, String cuName, String className, int line) {
-		super(testRunner, className);
-		WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.OPENEDITORATLINE_ACTION);
-		fLineNumber= line;
-		fCUName= cuName;
-	}
-		
-	protected void reveal(ITextEditor textEditor) {
-		if (fLineNumber >= 0) {
-			try {
-				IDocument document= textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
-				textEditor.selectAndReveal(document.getLineOffset(fLineNumber-1), document.getLineLength(fLineNumber-1));
-			} catch (BadLocationException x) {
-				// marker refers to invalid text position -> do nothing
-			}
-		}
-	}
-	
-	protected IJavaElement findElement(IJavaProject project, String className) throws JavaModelException {
-		IJavaElement element= project.findType(className);
-		
-		//fix for bug 37333
-		if (element == null) {
-			ISearchPattern pattern=	SearchEngine.createSearchPattern(className, IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, true);
-			IJavaSearchScope scope= SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, false);
-			NonPublicClassInCUCollector collector= new NonPublicClassInCUCollector();
-
-			SearchEngine searchEngine= new SearchEngine();
-			searchEngine.search(JavaPlugin.getWorkspace(), pattern, scope, collector);
-			
-			element= collector.fFound;
-		}
-		
-		return element;
-	}
-
-	public boolean isEnabled() {
-		try {
-			return getLaunchedProject().findType(getClassName()) != null;
-		} catch (JavaModelException e) {
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenTestAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenTestAction.java
deleted file mode 100644
index 44d4d0f..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/OpenTestAction.java
+++ /dev/null
@@ -1,93 +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.jdt.internal.junit.ui;
-
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.MessageDialog;
-
-/**
- * Open a class on a Test method.
- */
-public class OpenTestAction extends OpenEditorAction {
-	
-	private String fMethodName;
-	private ISourceRange fRange;
-	
-	/**
-	 * Constructor for OpenTestAction.
-	 */
-	public OpenTestAction(TestRunnerViewPart testRunner, String className, String method) {
-		super(testRunner, className);
-		WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.OPENTEST_ACTION);
-		fMethodName= method;
-	}
-	
-	public OpenTestAction(TestRunnerViewPart testRunner, String className) {
-		this(testRunner, className, null);
-	}
-
-	protected IJavaElement findElement(IJavaProject project, String className) throws JavaModelException {
-		IType type= project.findType(className);
-		if (type == null) 
-			return null;
-		
-		if (fMethodName == null)
-			return type;
-			
-		IMethod method= findMethod(type);
-		if (method == null) {
-			ITypeHierarchy typeHierarchy= type.newSupertypeHierarchy(null);
-			IType[] types= typeHierarchy.getAllSuperclasses(type);
-			for (int i= 0; i < types.length; i++) {
-				method= findMethod(types[i]);
-				if (method != null)
-					break;
-			}
-		}
-		if (method == null) {
-			String title= JUnitMessages.getString("OpenTestAction.error.title");
-			String message= JUnitMessages.getFormattedString("OpenTestAction.error.methodNoFound", fMethodName);
-			MessageDialog.openInformation(getShell(), title, message);
-			return type;
-		}
-		fRange= method.getNameRange();
-		return method;
-	}
-	
-	IMethod findMethod(IType type) {
-		IMethod method= type.getMethod(fMethodName, new String[0]);
-		if (method != null && method.exists())
-			return method;
-		return null;
-	}
-	
-	protected void reveal(ITextEditor textEditor) {
-		if (fRange != null)
-			textEditor.selectAndReveal(fRange.getOffset(), fRange.getLength());
-	}
-
-	public boolean isEnabled() {
-		try {
-			return getLaunchedProject().findType(getClassName()) != null;
-		} catch (JavaModelException e) {
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ProgressImages.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ProgressImages.java
deleted file mode 100644
index 44b2496..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ProgressImages.java
+++ /dev/null
@@ -1,88 +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.jdt.internal.junit.ui;
-
-import java.net.MalformedURLException;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Manages a set of images that can show progress in the image itself.
- */
-public class ProgressImages {
-	static final int PROGRESS_STEPS= 9;
-	
-	static final String BASE= "prgss/"; //$NON-NLS-1$
-	static final String FAILURE= "ff"; //$NON-NLS-1$
-	static final String OK= "ss"; //$NON-NLS-1$
-	
-	Image[] fOKImages= new Image[PROGRESS_STEPS];
-	Image[] fFailureImages= new Image[PROGRESS_STEPS];
-	Image fMissingImage= null;
-	
-	void load() {
-		if (isLoaded())
-			return;
-			
-		for (int i= 0; i < PROGRESS_STEPS; i++) {
-			String okname= BASE+OK+Integer.toString(i+1)+".gif"; //$NON-NLS-1$ 
-			fOKImages[i]= createImage(okname);
-			String failurename= BASE+FAILURE+Integer.toString(i+1)+".gif"; //$NON-NLS-1$ 
-			fFailureImages[i]= createImage(failurename);
-		}
-	}
-
-	Image createImage(String name) {
-		try {
-			ImageDescriptor id= ImageDescriptor.createFromURL(JUnitPlugin.makeIconFileURL(name));
-			return id.createImage();
-		} catch (MalformedURLException e) {
-			// fall through
-		}  
-		if (fMissingImage == null) 
-			fMissingImage= ImageDescriptor.getMissingImageDescriptor().createImage();
-		return fMissingImage;
-	}
-	
-	public void dispose() {
-		if (!isLoaded())
-			return; 
-			
-		if (fMissingImage != null)
-			fMissingImage.dispose();	
-				
-		for (int i= 0; i < PROGRESS_STEPS; i++) {
-			fOKImages[i].dispose();
-			fOKImages[i]= null;
-			fFailureImages[i].dispose();
-			fFailureImages[i]= null;
-		}
-	}
-	
-	public Image getImage(int current, int total, int errors, int failures) {
-		if (!isLoaded())
-			load();
-			
-		if (total == 0)
-			return fOKImages[0];
-		int index= ((current*PROGRESS_STEPS)/total)-1;
-		index= Math.min(Math.max(0, index), PROGRESS_STEPS-1);
-
-		if (errors + failures == 0)
-			return fOKImages[index];
-		return fFailureImages[index];
-	}
-	
-	boolean isLoaded() {
-		return fOKImages[0] != null;
-	}	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/RemoteTestRunnerClient.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/RemoteTestRunnerClient.java
deleted file mode 100644
index 86044e3..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/RemoteTestRunnerClient.java
+++ /dev/null
@@ -1,509 +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
- *     Julien Ruaux: jruaux@octo.com
- * 	   Vincent Massol: vmassol@octo.com
- ******************************************************************************/
-package org.eclipse.jdt.internal.junit.ui;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.SocketException;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jdt.internal.junit.runner.MessageIds;
-import org.eclipse.jdt.junit.ITestRunListener;
-
-/**
- * The client side of the RemoteTestRunner. Handles the
- * marshalling of th different messages.
- */
-public class RemoteTestRunnerClient {
-	public abstract class ListenerSafeRunnable implements ISafeRunnable {
-		public void handleException(Throwable exception) {
-			JUnitPlugin.log(exception);
-		}
-	}
-	/**
-	 * A simple state machine to process requests from the RemoteTestRunner
-	 */
-	abstract class ProcessingState {
-	    abstract ProcessingState readMessage(String message);
-	}
-	
-	class DefaultProcessingState extends ProcessingState {
-	    ProcessingState readMessage(String message) {
-	        if (message.startsWith(MessageIds.TRACE_START)) {
-	            fFailedTrace= ""; //$NON-NLS-1$
-	            return fTraceState;
-	        }
-	        if (message.startsWith(MessageIds.EXPECTED_START)) {
-	            fExpectedResult= null;
-	            return fExpectedState;
-	        }
-	        if (message.startsWith(MessageIds.ACTUAL_START)) {
-	            fActualResult= null;
-	            return fActualState;
-	        }
-	        if (message.startsWith(MessageIds.RTRACE_START)) {
-	            fFailedRerunTrace= ""; //$NON-NLS-1$
-	            return fRerunState;
-	        }
-	        String arg= message.substring(MessageIds.MSG_HEADER_LENGTH);
-	        if (message.startsWith(MessageIds.TEST_RUN_START)) {
-	            // version < 2 format: count
-	            // version >= 2 format: count+" "+version
-	            int count= 0;
-	            int v= arg.indexOf(' ');
-	            if (v == -1) {
-	                fVersion= "v1"; //$NON-NLS-1$
-	                count= Integer.parseInt(arg);
-	            } else {
-	                fVersion= arg.substring(v+1);
-	                String sc= arg.substring(0, v);
-	                count= Integer.parseInt(sc);
-	            }
-	            notifyTestRunStarted(count);
-	            return this;
-	        }
-	        if (message.startsWith(MessageIds.TEST_START)) {
-	            notifyTestStarted(arg);
-	            return this;
-	        }
-	        if (message.startsWith(MessageIds.TEST_END)) {
-	            notifyTestEnded(arg);
-	            return this;
-	        }
-	        if (message.startsWith(MessageIds.TEST_ERROR)) {
-	            extractFailure(arg, ITestRunListener.STATUS_ERROR);
-	            return this;
-	        }
-	        if (message.startsWith(MessageIds.TEST_FAILED)) {
-	            extractFailure(arg, ITestRunListener.STATUS_FAILURE);
-	            return this;
-	        }
-	        if (message.startsWith(MessageIds.TEST_RUN_END)) {
-	            long elapsedTime = Long.parseLong(arg);
-	            testRunEnded(elapsedTime);
-	            return this;
-	        }
-	        if (message.startsWith(MessageIds.TEST_STOPPED)) {
-	            long elapsedTime = Long.parseLong(arg);
-	            notifyTestRunStopped(elapsedTime);
-	            shutDown();
-	            return this;
-	        }
-	        if (message.startsWith(MessageIds.TEST_TREE)) {
-	            notifyTestTreeEntry(arg);
-	            return this;
-	        }
-	        if (message.startsWith(MessageIds.TEST_RERAN)) {
-	            if (hasTestId())
-	                scanReranMessage(arg);
-	            else 
-	                scanOldReranMessage(arg);
-	            return this;
-	        }	
-	        return this;
-	    }
-	}
-	
-	class TraceProcessingState extends ProcessingState {
-	    ProcessingState readMessage(String message) {
-	        if (message.startsWith(MessageIds.TRACE_END)) {
-	            notifyTestFailed();
-	            fFailedTrace = ""; //$NON-NLS-1$
-	            fExpectedResult= null;
-	            fActualResult = null;
-	            return fDefaultState;
-	        }
-	        fFailedTrace+= message + '\n';
-	        return this;
-	    }
-	}
-	class ExpectedProcessingState extends ProcessingState {
-	    ProcessingState readMessage(String message) {
-	        if (message.startsWith(MessageIds.EXPECTED_END)) 
-	            return fDefaultState;
-	        if (fExpectedResult == null)
-	        	fExpectedResult= message + '\n';
-	        else
-	        	fExpectedResult+= message + '\n';
-	        return this;
-	    }
-	}
-	class ActualProcessingState extends ProcessingState {
-	    ProcessingState readMessage(String message) {
-	        if (message.startsWith(MessageIds.ACTUAL_END)) 
-	            return fDefaultState;
-	        if (fActualResult == null)
-	        	fActualResult= message + '\n';
-	        else 
-				fActualResult+= message + '\n';
-	        return this;
-	    }
-	}
-	class RerunTraceProcessingState extends ProcessingState {
-	    ProcessingState readMessage(String message) {
-	        if (message.startsWith(MessageIds.RTRACE_END)) 
-	            return fDefaultState;
-	        fFailedRerunTrace+= message + '\n';
-	        return this;
-	    }
-	}
-	ProcessingState fDefaultState= new DefaultProcessingState();
-	ProcessingState fTraceState= new TraceProcessingState();
-	ProcessingState fExpectedState= new ExpectedProcessingState();
-	ProcessingState fActualState= new ActualProcessingState();
-	ProcessingState fRerunState= new RerunTraceProcessingState();
-	ProcessingState fCurrentState= fDefaultState;
-	
-	/**
-	 * An array of listeners that are informed about test events.
-	 */
-	private ITestRunListener[] fListeners;
-
-	/**
-	 * The server socket
-	 */
-	private ServerSocket fServerSocket;
-	private Socket fSocket;
-	private int fPort= -1;
-	private PrintWriter fWriter;
-	private BufferedReader fBufferedReader;
-	/**
-	 * The protocol version
-	 */ 
-	private String fVersion;
-	/**
-	 * The failed test that is currently reported from the RemoteTestRunner
-	 */
-	private String fFailedTest;
-	/**
-	 * The Id of the failed test
-	 */
-	private String fFailedTestId;
-	/**
-	 * The failed trace that is currently reported from the RemoteTestRunner
-	 */
-	private String fFailedTrace;
-	/**
-	 * The expected test result
-	 */
-	private String fExpectedResult;
-	/**
-	 * The actual test result
-	 */
-	private String fActualResult;
-	/**
-	 * The failed trace of a reran test
-	 */
-	private String fFailedRerunTrace;
-	/**
-	 * The kind of failure of the test that is currently reported as failed
-	 */
-	private int fFailureKind;
-	
-	private boolean fDebug= false;
-	
-	/**
-	 * Reads the message stream from the RemoteTestRunner
-	 */
-	private class ServerConnection extends Thread {
-		int fPort;
-		
-		public ServerConnection(int port) {
-			super("ServerConnection"); //$NON-NLS-1$
-			fPort= port;
-		}
-		
-		public void run() {
-			try {
-				if (fDebug)
-					System.out.println("Creating server socket "+fPort); //$NON-NLS-1$
-				fServerSocket= new ServerSocket(fPort);
-				fSocket= fServerSocket.accept();				
-				fBufferedReader= new BufferedReader(new InputStreamReader(fSocket.getInputStream()));
-				fWriter= new PrintWriter(fSocket.getOutputStream(), true);
-				String message;
-				while(fBufferedReader != null && (message= readMessage(fBufferedReader)) != null)
-					receiveMessage(message);
-			} catch (SocketException e) {
-				notifyTestRunTerminated();
-			} catch (IOException e) {
-				System.out.println(e);
-				// fall through
-			}
-			shutDown();
-		}
-	}
-
-	/**
-	 * Start listening to a test run. Start a server connection that
-	 * the RemoteTestRunner can connect to.
-	 */
-	public synchronized void startListening(
-		ITestRunListener[] listeners,
-		int port) {
-		fListeners = listeners;
-		fPort = port;
-		ServerConnection connection = new ServerConnection(port);
-		connection.start();
-	}
-	
-	/**
-	 * Requests to stop the remote test run.
-	 */
-	public synchronized void stopTest() {
-		if (isRunning()) {
-			fWriter.println(MessageIds.TEST_STOP);
-			fWriter.flush();
-		}
-	}
-
-	private synchronized void shutDown() {
-		if (fDebug) 
-			System.out.println("shutdown "+fPort); //$NON-NLS-1$
-		
-		if (fWriter != null) {
-			fWriter.close();
-			fWriter= null;
-		}
-		try {
-			if (fBufferedReader != null) {
-				fBufferedReader.close();
-				fBufferedReader= null;
-			}
-		} catch(IOException e) {
-		}	
-		try {
-			if (fSocket != null) {
-				fSocket.close();
-				fSocket= null;
-			}
-		} catch(IOException e) {
-		}
-		try{
-			if (fServerSocket != null) {
-				fServerSocket.close();
-				fServerSocket= null;
-			}
-		} catch(IOException e) {
-		}
-	}
-	
-	public boolean isRunning() {
-		return fSocket != null;
-	}
-	
-	private String readMessage(BufferedReader in) throws IOException {
-		return in.readLine();
-	}
-		
-	private void receiveMessage(String message) {
-	    fCurrentState= fCurrentState.readMessage(message);
-	}
-
-	private void scanOldReranMessage(String arg) {
-		// OLD V1 format
-		// format: className" "testName" "status
-		// status: FAILURE, ERROR, OK
-		int c= arg.indexOf(" "); //$NON-NLS-1$
-		int t= arg.indexOf(" ", c+1); //$NON-NLS-1$
-		String className= arg.substring(0, c);
-		String testName= arg.substring(c+1, t);
-		String status= arg.substring(t+1);
-		int statusCode= ITestRunListener.STATUS_OK;
-		if (status.equals("FAILURE")) //$NON-NLS-1$
-			statusCode= ITestRunListener.STATUS_FAILURE;
-		else if (status.equals("ERROR")) //$NON-NLS-1$
-			statusCode= ITestRunListener.STATUS_ERROR;
-				
-		String trace= ""; //$NON-NLS-1$
-		if (statusCode != ITestRunListener.STATUS_OK)
-			trace = fFailedRerunTrace;
-		// assumption a rerun trace was sent before
-		notifyTestReran(className+testName, className, testName, statusCode, trace);
-	}
-
-	private void scanReranMessage(String arg) {
-		// format: testId" "className" "testName" "status
-		// status: FAILURE, ERROR, OK
-		int i= arg.indexOf(' ');
-		int c= arg.indexOf(' ', i+1); //$NON-NLS-1$
-		int t= arg.indexOf(' ', c+1); //$NON-NLS-1$
-		String testId= arg.substring(0, i);
-		String className= arg.substring(i+1, c);
-		String testName= arg.substring(c+1, t);
-		String status= arg.substring(t+1);
-		int statusCode= ITestRunListener.STATUS_OK;
-		if (status.equals("FAILURE")) //$NON-NLS-1$
-			statusCode= ITestRunListener.STATUS_FAILURE;
-		else if (status.equals("ERROR")) //$NON-NLS-1$
-			statusCode= ITestRunListener.STATUS_ERROR;
-			
-		String trace= ""; //$NON-NLS-1$
-		if (statusCode != ITestRunListener.STATUS_OK)
-			trace = fFailedRerunTrace;
-		// assumption a rerun trace was sent before
-		notifyTestReran(testId, className, testName, statusCode, trace);
-	}
-
-	private void extractFailure(String arg, int status) {
-		String s[]= extractTestId(arg);
-		fFailedTestId= s[0];
-		fFailedTest= s[1];
-		fFailureKind= status;
-	}
-
-	/**
-	 * Returns an array with two elements. The first one is the testId, the second one the testName.
-	 */
-	String[] extractTestId(String arg) {
-		String[] result= new String[2];
-		if (!hasTestId()) {
-			result[0]= arg; // use the test name as the test Id
-			result[1]= arg;
-			return result;
-		}
-		int i= arg.indexOf(',');
-		result[0]= arg.substring(0, i);
-		result[1]= arg.substring(i+1, arg.length());
-		return result;
-	}
-	
-	private boolean hasTestId() {
-		return fVersion.equals("v2"); //$NON-NLS-1$
-	}
-
-	private void notifyTestReran(final String testId, final String className, final String testName, final int statusCode, final String trace) {
-		for (int i= 0; i < fListeners.length; i++) {
-			final ITestRunListener listener= fListeners[i];
-			Platform.run(new ListenerSafeRunnable() { 
-				public void run() {
-					listener.testReran(testId, className, testName, statusCode, trace);
-				}
-			});
-		}
-	}
-
-	private void notifyTestTreeEntry(final String treeEntry) {
-		for (int i= 0; i < fListeners.length; i++) {
-			if (fListeners[i] instanceof ITestRunListener2) {
-				ITestRunListener2 listener= (ITestRunListener2)fListeners[i];
-				if (!hasTestId()) 
-					listener.testTreeEntry(fakeTestId(treeEntry));
-				else
-					listener.testTreeEntry(treeEntry);
-			}
-		}
-	}
-
-	private String fakeTestId(String treeEntry) {
-		// extract the test name and add it as the testId
-		int index0= treeEntry.indexOf(',');
-		String testName= treeEntry.substring(0, index0).trim();
-		return testName+","+treeEntry; //$NON-NLS-1$
-	}
-
-	private void notifyTestRunStopped(final long elapsedTime) {
-		for (int i= 0; i < fListeners.length; i++) {
-			final ITestRunListener listener= fListeners[i];
-			Platform.run(new ListenerSafeRunnable() { 
-				public void run() {
-					listener.testRunStopped(elapsedTime);
-				}
-			});
-		}
-	}
-
-	private void testRunEnded(final long elapsedTime) {
-		for (int i= 0; i < fListeners.length; i++) {
-			final ITestRunListener listener= fListeners[i];
-			Platform.run(new ListenerSafeRunnable() { 
-				public void run() {
-					listener.testRunEnded(elapsedTime);
-				}
-			});
-		}
-	}
-
-	private void notifyTestEnded(final String test) {
-		for (int i= 0; i < fListeners.length; i++) {
-			final ITestRunListener listener= fListeners[i];
-			Platform.run(new ListenerSafeRunnable() { 
-				public void run() {
-					String s[]= extractTestId(test);
-					listener.testEnded(s[0], s[1]);
-				}
-			});
-		}
-	}
-
-	private void notifyTestStarted(final String test) {
-		for (int i= 0; i < fListeners.length; i++) {
-			final ITestRunListener listener= fListeners[i];
-			Platform.run(new ListenerSafeRunnable() { 
-				public void run() {
-					String s[]= extractTestId(test);
-					listener.testStarted(s[0], s[1]);
-				}
-			});
-		}
-	}
-
-	private void notifyTestRunStarted(final int count) {
-		for (int i= 0; i < fListeners.length; i++) {
-			final ITestRunListener listener= fListeners[i];
-			Platform.run(new ListenerSafeRunnable() { 
-				public void run() {
-					listener.testRunStarted(count);
-				}
-			});
-		}
-	}
-
-	private void notifyTestFailed() {
-		for (int i= 0; i < fListeners.length; i++) {
-			final ITestRunListener listener= fListeners[i];
-			Platform.run(new ListenerSafeRunnable() { 
-				public void run() {
-				    if (listener instanceof ITestRunListener3 )
-				        ((ITestRunListener3)listener).testFailed(fFailureKind, fFailedTestId, 
-				                fFailedTest, fFailedTrace, fExpectedResult, fActualResult);
-				    else
-				        listener.testFailed(fFailureKind, fFailedTestId, fFailedTest, fFailedTrace);
-				}
-			});
-		}
-	}
-	
-	private void notifyTestRunTerminated() {
-		for (int i= 0; i < fListeners.length; i++) {
-			final ITestRunListener listener= fListeners[i];
-			Platform.run(new ListenerSafeRunnable() { 
-				public void run() {
-					listener.testRunTerminated();
-				}
-			});
-		}
-	}
-
-	public void rerunTest(String testId, String className, String testName) {
-		if (isRunning()) {
-			fWriter.println(MessageIds.TEST_RERUN+testId+" "+className+" "+testName); //$NON-NLS-1$ //$NON-NLS-2$
-			fWriter.flush();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/RerunAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/RerunAction.java
deleted file mode 100644
index 3420763..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/RerunAction.java
+++ /dev/null
@@ -1,44 +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.jdt.internal.junit.ui;
-
-import org.eclipse.ui.help.WorkbenchHelp;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * Requests to rerun a test.
- */
-public class RerunAction extends Action {
-	private String fTestId;
-	private String fClassName;
-	private String fTestName;
-	private TestRunnerViewPart fTestRunner;
-	
-	/**
-	 * Constructor for RerunAction.
-	 */
-	public RerunAction(TestRunnerViewPart runner, String testId, String className, String testName) {
-		super(JUnitMessages.getString("RerunAction.action.label"));  //$NON-NLS-1$
-		WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.RERUN_ACTION);
-		fTestRunner= runner;
-		fTestId= testId;
-		fClassName= className;
-		fTestName= testName;
-	}
-
-	/*
-	 * @see IAction#run()
-	 */
-	public void run() {
-		fTestRunner.rerunTest(fTestId, fClassName, fTestName);
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ScrollLockAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ScrollLockAction.java
deleted file mode 100644
index b7e307f..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ScrollLockAction.java
+++ /dev/null
@@ -1,44 +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.jdt.internal.junit.ui;
-
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-/**
- * Toggles console auto-scroll
- */
-public class ScrollLockAction extends Action {
-
-	private TestRunnerViewPart fRunnerViewPart;
-
-	public ScrollLockAction(TestRunnerViewPart viewer) {
-		super(JUnitMessages.getString("ScrollLockAction.action.label")); //$NON-NLS-1$
-		fRunnerViewPart= viewer;
-		setToolTipText(JUnitMessages.getString("ScrollLockAction.action.tooltip")); //$NON-NLS-1$
-		setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/lock.gif")); //$NON-NLS-1$
-		setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/lock.gif")); //$NON-NLS-1$
-		setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/lock.gif")); //$NON-NLS-1$
-		WorkbenchHelp.setHelp(
-			this,
-			IJUnitHelpContextIds.OUTPUT_SCROLL_LOCK_ACTION);
-		setChecked(false);
-	}
-
-	/**
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		fRunnerViewPart.setAutoScroll(!isChecked());
-	}
-}
-
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ShowNextFailureAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ShowNextFailureAction.java
deleted file mode 100644
index 7ad356a..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ShowNextFailureAction.java
+++ /dev/null
@@ -1,31 +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.jdt.internal.junit.ui;
-
-import org.eclipse.jface.action.Action;
-
-class ShowNextFailureAction extends Action {
-	
-	private TestRunnerViewPart fPart;
-
-	public ShowNextFailureAction(TestRunnerViewPart part) {
-		super(JUnitMessages.getString("ShowNextFailureAction.label"));  //$NON-NLS-1$
-		setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/select_next.gif")); //$NON-NLS-1$
-		setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/select_next.gif")); //$NON-NLS-1$
-		setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/select_next.gif")); //$NON-NLS-1$
-		setToolTipText(JUnitMessages.getString("ShowNextFailureAction.tooltip")); //$NON-NLS-1$
-		fPart= part;
-	}
-	
-	public void run() {
-		fPart.selectNextFailure();
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ShowPreviousFailureAction.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ShowPreviousFailureAction.java
deleted file mode 100644
index 4637bac..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/ShowPreviousFailureAction.java
+++ /dev/null
@@ -1,31 +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.jdt.internal.junit.ui;
-
-import org.eclipse.jface.action.Action;
-
-class ShowPreviousFailureAction extends Action {
-	
-	private TestRunnerViewPart fPart;
-
-	public ShowPreviousFailureAction(TestRunnerViewPart part) {
-		super(JUnitMessages.getString("ShowPreviousFailureAction.label"));  //$NON-NLS-1$
-		setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/select_prev.gif")); //$NON-NLS-1$
-		setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/select_prev.gif")); //$NON-NLS-1$
-		setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/select_prev.gif")); //$NON-NLS-1$
-		setToolTipText(JUnitMessages.getString("ShowPreviousFailureAction.tooltip"));  //$NON-NLS-1$
-		fPart= part;
-	}
-	
-	public void run() {
-		fPart.selectPreviousFailure();
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TabFolderLayout.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TabFolderLayout.java
deleted file mode 100644
index 2a5e042..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TabFolderLayout.java
+++ /dev/null
@@ -1,56 +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.jdt.internal.junit.ui;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Layout;
-
-/**
- * Layout that fixes an SWT limitation on Motif
- * TODO: check whether this is still required
- */
-public class TabFolderLayout extends Layout {
-	
-	protected Point computeSize (Composite composite, int wHint, int hHint, boolean flushCache) {
-		if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
-			return new Point(wHint, hHint);
-			
-		Control [] children = composite.getChildren ();
-		int count = children.length;
-		int maxWidth = 0, maxHeight = 0;
-		for (int i=0; i<count; i++) {
-			Control child = children [i];
-			Point pt = child.computeSize (SWT.DEFAULT, SWT.DEFAULT, flushCache);
-			maxWidth = Math.max (maxWidth, pt.x);
-			maxHeight = Math.max (maxHeight, pt.y);
-		}
-		if (wHint != SWT.DEFAULT)
-			maxWidth= wHint;
-		if (hHint != SWT.DEFAULT)
-			maxHeight= hHint;
-		
-		return new Point(maxWidth, maxHeight);	
-		
-	}
-	
-	protected void layout (Composite composite, boolean flushCache) {
-		Rectangle rect = composite.getClientArea();
-	
-		Control[] children = composite.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			children[i].setBounds(rect);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestMethodSelectionDialog.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestMethodSelectionDialog.java
deleted file mode 100644
index 8f37e3d..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestMethodSelectionDialog.java
+++ /dev/null
@@ -1,188 +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.jdt.internal.junit.ui;
-
- 
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchResultCollector;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-/**
- * A dialog to select a test method.
- */
-public class TestMethodSelectionDialog extends ElementListSelectionDialog {
-
-	private IRunnableContext fRunnableContext;
-	private IJavaElement fElement;
-
-	public static class TestReferenceCollector implements IJavaSearchResultCollector {
-		IProgressMonitor fMonitor;
-		Set fResult= new HashSet(200);
-		
-		public TestReferenceCollector(IProgressMonitor pm) {
-			fMonitor= pm;
-		}
-		
-		public void aboutToStart() {
-		}
-	
-		public void accept(IResource resource, int start, int end, IJavaElement enclosingElement, int accuracy) {
-			if (enclosingElement.getElementName().startsWith("test")) //$NON-NLS-1$
-				fResult.add(enclosingElement);
-		}
-	
-		public void done() {
-		}
-	
-		public IProgressMonitor getProgressMonitor() {
-			return fMonitor;
-		}
-		
-		public Object[] getResult() {
-			return fResult.toArray();
-		}
-	}
-
-	public TestMethodSelectionDialog(Shell shell, IRunnableContext context, IJavaElement element) {
-		super(shell, new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_PARAMETERS | JavaElementLabelProvider.SHOW_POST_QUALIFIED));
-		fRunnableContext= context;
-		fElement= element;
-	}
-	
-	/*
-	 * @see Windows#configureShell
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		WorkbenchHelp.setHelp(newShell, IJUnitHelpContextIds.TEST_SELECTION_DIALOG);
-	}
-
-	/*
-	 * @see Window#open()
-	 */
-	public int open() {
-		Object[] elements;
-		IType testType= findTestType();
-		
-		if (testType == null) 
-			return CANCEL;
-		
-		try {
-			elements= searchTestMethods(fElement, testType, fRunnableContext);
-		} catch (InterruptedException e) {
-			return CANCEL;
-		} catch (InvocationTargetException e) {
-			MessageDialog.openError(getParentShell(), JUnitMessages.getString("TestMethodSelectionDialog.error.title"), e.getTargetException().getMessage()); //$NON-NLS-1$
-			return CANCEL;
-		}
-		
-		if (elements.length == 0) {
-			String msg= JUnitMessages.getFormattedString("TestMethodSelectionDialog.notfound_message", fElement.getElementName()); //$NON-NLS-1$
-			MessageDialog.openInformation(getParentShell(), JUnitMessages.getString("TestMethodSelectionDialog.no_tests.title"), msg); //$NON-NLS-1$
-			return CANCEL;
-		}
-		setElements(elements);
-		return super.open();
-	}
-	
-	private IType findTestType() {
-		String qualifiedName= JUnitPlugin.TEST_INTERFACE_NAME;
-		IJavaProject[] projects;
-		Set result= new HashSet();
-		try {
-			projects= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects();
-			for (int i= 0; i < projects.length; i++) {
-				IJavaProject project= projects[i];
-				IType type= project.findType(qualifiedName);
-				if (type != null) 
-					result.add(type);
-			}
-		} catch (JavaModelException e) {
-			ErrorDialog.openError(getParentShell(), JUnitMessages.getString("TestMethodSelectionDialog.error.notfound.title"), JUnitMessages.getString("TestMethodSelectionDialog.error.notfound.message"), e.getStatus()); //$NON-NLS-1$ //$NON-NLS-2$
-			return null;
-		}
-		if (result.size() == 0) {
-			String msg= JUnitMessages.getFormattedString("TestMethodSelectionDialog.test_not_found", JUnitPlugin.TEST_INTERFACE_NAME); //$NON-NLS-1$
-			MessageDialog.openError(getParentShell(), JUnitMessages.getString("TestMethodSelectionDialog.select_dialog.title"), msg); //$NON-NLS-1$
-			return null;
-		}
-		if (result.size() == 1)
-			return (IType)result.toArray()[0];
-		
-		return selectTestType(result);
-	}
-	
-	private IType selectTestType(Set result) {
-		ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_PARAMETERS | JavaElementLabelProvider.SHOW_ROOT);
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getParentShell(), labelProvider);
-		dialog.setTitle(JUnitMessages.getString("TestMethodSelectionDialog.dialog.title"));  //$NON-NLS-1$
-		String msg= JUnitMessages.getFormattedString("TestMethodSelectionDialog.testproject", "junit.framework.Test"); //$NON-NLS-1$ //$NON-NLS-2$
-		dialog.setMessage(msg);
-		IJavaProject[] projects= new IJavaProject[result.size()];
-		IType[] testTypes= (IType[]) result.toArray(new IType[result.size()]);
-		for (int i= 0; i < projects.length; i++) 
-			projects[i]= testTypes[i].getJavaProject();
-		dialog.setElements(projects);
-		if (dialog.open() == ElementListSelectionDialog.CANCEL)	
-			return null;
-		IJavaProject project= (IJavaProject) dialog.getFirstResult();
-		for (int i= 0; i < testTypes.length; i++) {
-			if (testTypes[i].getJavaProject().equals(project))
-				return testTypes[i];
-		}
-		return null;	
-	}
-	
-	public Object[] searchTestMethods(final IJavaElement element, final IType testType, IRunnableContext context) throws InvocationTargetException, InterruptedException  {
-		final TestReferenceCollector[] col= new TestReferenceCollector[1];
-		
-		IRunnableWithProgress runnable= new IRunnableWithProgress() {
-			public void run(IProgressMonitor pm) throws InvocationTargetException {
-				try {
-					col[0]= doSearchTestMethods(element, testType, pm);
-				} catch (JavaModelException e) {
-					throw new InvocationTargetException(e);
-				}
-			}
-		};
-		context.run(true, true, runnable);
-		return col[0].getResult();
-	}
-
-	private TestReferenceCollector doSearchTestMethods(IJavaElement element, IType testType, IProgressMonitor pm) throws JavaModelException{
-		IJavaSearchScope scope= SearchEngine.createHierarchyScope(testType);
-		TestReferenceCollector collector= new TestReferenceCollector(pm);
-		new SearchEngine().search(ResourcesPlugin.getWorkspace(), element, IJavaSearchConstants.REFERENCES, scope, collector);
-		return collector;
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestRunInfo.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestRunInfo.java
deleted file mode 100644
index f05db32..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestRunInfo.java
+++ /dev/null
@@ -1,111 +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.jdt.internal.junit.ui;
-
-/**
- * Store information about an executed test.
- */
-public class TestRunInfo extends Object {
-	private String fTestId;
-	private String fTestName;
-	private String fTrace;
-	private String fExpected;
-	private String fActual;
-	
-	private int fStatus;
-
-	public TestRunInfo(String testId, String testName){
-		fTestName= testName;
-		fTestId= testId;
-	}	
-	
-	/*
-	 * @see Object#hashCode()
-	 */
-	public int hashCode() {
-		return getTestId().hashCode();
-	}
-
-	/*
-	 * @see Object#equals(Object)
-	 */
-	public boolean equals(Object obj) {
-		return getTestId().equals(obj);
-	}
-
-	public String getTestId() {
-		return fTestId;
-	}
-
-	public String getTestName() {
-		return fTestName;
-	}
-
-	public String getClassName() {
-		return extractClassName(getTestName());
-	}
-	
-	public String getTestMethodName() {
-		int index= fTestName.indexOf('(');
-		if (index > 0)
-			return fTestName.substring(0, index);
-		index= fTestName.indexOf('@');
-		if(index > 0)
-			return fTestName.substring(0, index);
-		return fTestName;
-	}
-	
-	private String extractClassName(String testNameString) {
-		if (testNameString == null) 
-			return null;
-		int index= testNameString.indexOf('(');
-		if (index < 0) 
-			return testNameString;
-		testNameString= testNameString.substring(index + 1);
-		return testNameString.substring(0, testNameString.indexOf(')'));
-	}		
-
-	public void setTrace(String trace) {
-		fTrace= trace;
-	}
-
-	public String getTrace() {
-		return fTrace;
-	}
-
-	public void setStatus(int status) {
-		fStatus= status;
-	}
-
-	public int getStatus() {
-		return fStatus;
-	}
-	
-    public String getActual() {
-        return fActual;
-    }
-    
-    public void setActual(String actual) {
-        fActual = actual;
-    }
-    
-    public String getExpected() {
-        return fExpected;
-    }
-    
-    public void setExpected(String expected) {
-        fExpected = expected;
-    }
-    
-    public boolean isComparisonFailure() {
-        return fExpected != null && fActual != null;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestRunnerViewPart.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestRunnerViewPart.java
deleted file mode 100644
index af77018..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/ui/TestRunnerViewPart.java
+++ /dev/null
@@ -1,1173 +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
- *     Julien Ruaux: jruaux@octo.com see bug 25324 Ability to know when tests are finished [junit]
- *     Vincent Massol: vmassol@octo.com 25324 Ability to know when tests are finished [junit]
- *     Sebastian Davids: sdavids@gmx.de 35762 JUnit View wasting a lot of screen space [JUnit]
- ******************************************************************************/
-package org.eclipse.jdt.internal.junit.ui;
-
-import java.net.MalformedURLException;
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.junit.launcher.JUnitBaseLaunchConfiguration;
-import org.eclipse.jdt.junit.ITestRunListener;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.ViewForm;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.ActionFactory;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * A ViewPart that shows the results of a test run.
- */
-public class TestRunnerViewPart extends ViewPart implements ITestRunListener3, IPropertyChangeListener {
-
-	public static final String NAME= "org.eclipse.jdt.junit.ResultView"; //$NON-NLS-1$
- 	/**
- 	 * Number of executed tests during a test run
- 	 */
-	protected int fExecutedTests;
-	/**
-	 * Number of errors during this test run
-	 */
-	protected int fErrorCount;
-	/**
-	 * Number of failures during this test run
-	 */
-	protected int fFailureCount;
-	/**
-	 * Number of tests run
-	 */
-	private int fTestCount;
-	/**
-	 * Whether the output scrolls and reveals tests as they are executed.
-	 */
-	private boolean fAutoScroll = true;
-	/**
-	 * The current orientation; either <code>VIEW_ORIENTATION_HORIZONTAL</code>
-	 * or <code>VIEW_ORIENTATION_VERTICAL</code>.
-	 */
-	private int fCurrentOrientation;
-	/**
-	 * Map storing TestInfos for each executed test keyed by
-	 * the test name.
-	 */
-	private Map fTestInfos= new HashMap();
-	/**
-	 * The first failure of a test run. Used to reveal the
-	 * first failed tests at the end of a run.
-	 */
-	private List fFailures= new ArrayList();
-
-	private JUnitProgressBar fProgressBar;
-	private ProgressImages fProgressImages;
-	private Image fViewImage;
-	private CounterPanel fCounterPanel;
-	private boolean fShowOnErrorOnly= false;
-	private Clipboard fClipboard;
-
-	/** 
-	 * The view that shows the stack trace of a failure
-	 */
-	private FailureTraceView fFailureView;
-	/** 
-	 * The collection of ITestRunViews
-	 */
-	private Vector fTestRunViews = new Vector();
-	/**
-	 * The currently active run view
-	 */
-	private ITestRunView fActiveRunView;
-	/**
-	 * Is the UI disposed
-	 */
-	private boolean fIsDisposed= false;
-	/**
-	 * The launched project
-	 */
-	private IJavaProject fTestProject;
-	/**
-	 * The launcher that has started the test
-	 */
-	private String fLaunchMode;
-	private ILaunch fLastLaunch;
-	
-	/**
-	 * Actions
-	 */
-	private Action fRerunLastTestAction;
-	private ScrollLockAction fScrollLockAction;
-	private ToggleOrientationAction[] fToggleOrientationActions;
-	
-	/**
-	 * The client side of the remote test runner
-	 */
-	private RemoteTestRunnerClient fTestRunnerClient;
-
-	final Image fStackViewIcon= TestRunnerViewPart.createImage("cview16/stackframe.gif");//$NON-NLS-1$
-	final Image fTestRunOKIcon= TestRunnerViewPart.createImage("cview16/junitsucc.gif"); //$NON-NLS-1$
-	final Image fTestRunFailIcon= TestRunnerViewPart.createImage("cview16/juniterr.gif"); //$NON-NLS-1$
-	final Image fTestRunOKDirtyIcon= TestRunnerViewPart.createImage("cview16/junitsuccq.gif"); //$NON-NLS-1$
-	final Image fTestRunFailDirtyIcon= TestRunnerViewPart.createImage("cview16/juniterrq.gif"); //$NON-NLS-1$
-	
-	// Persistance tags.
-	static final String TAG_PAGE= "page"; //$NON-NLS-1$
-	static final String TAG_RATIO= "ratio"; //$NON-NLS-1$
-	static final String TAG_TRACEFILTER= "tracefilter"; //$NON-NLS-1$
-	static final String TAG_ORIENTATION= "orientation"; //$NON-NLS-1$
-	static final String TAG_SCROLL= "scroll"; //$NON-NLS-1$
-	
-	//orientations
-	static final int VIEW_ORIENTATION_VERTICAL= 0;
-	static final int VIEW_ORIENTATION_HORIZONTAL= 1;
-	
-	private IMemento fMemento;	
-
-	Image fOriginalViewImage;
-	IElementChangedListener fDirtyListener;
-	
-	
-	private CTabFolder fTabFolder;
-	private SashForm fSashForm;
-	
-	private Action fNextAction;
-	private Action fPreviousAction;
-	private Composite fCounterComposite;
-	private Composite fParent;
-	
-	private class StopAction extends Action {
-		public StopAction() {
-			setText(JUnitMessages.getString("TestRunnerViewPart.stopaction.text"));//$NON-NLS-1$
-			setToolTipText(JUnitMessages.getString("TestRunnerViewPart.stopaction.tooltip"));//$NON-NLS-1$
-			setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/stop.gif")); //$NON-NLS-1$
-			setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/stop.gif")); //$NON-NLS-1$
-			setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/stop.gif")); //$NON-NLS-1$
-		}
-
-		public void run() {
-			stopTest();
-		}
-	}
-
-	private class RerunLastAction extends Action {
-		public RerunLastAction() {
-			setText(JUnitMessages.getString("TestRunnerViewPart.rerunaction.label")); //$NON-NLS-1$
-			setToolTipText(JUnitMessages.getString("TestRunnerViewPart.rerunaction.tooltip")); //$NON-NLS-1$
-			setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/relaunch.gif")); //$NON-NLS-1$
-			setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/relaunch.gif")); //$NON-NLS-1$
-			setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/relaunch.gif")); //$NON-NLS-1$
-		}
-		
-		public void run(){
-			rerunTestRun();
-		}
-	}
-	
-	private class ToggleOrientationAction extends Action {
-		private final int fOrientation;
-		
-		public ToggleOrientationAction(TestRunnerViewPart v, int orientation) {
-			super("", AS_RADIO_BUTTON); //$NON-NLS-1$
-			if (orientation == TestRunnerViewPart.VIEW_ORIENTATION_HORIZONTAL) {
-				setText(JUnitMessages.getString("TestRunnerViewPart.toggle.horizontal.label")); //$NON-NLS-1$
-				setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/th_horizontal.gif")); //$NON-NLS-1$
-				setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/th_horizontal.gif")); //$NON-NLS-1$
-				setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/th_horizontal.gif")); //$NON-NLS-1$				
-			} else if (orientation == TestRunnerViewPart.VIEW_ORIENTATION_VERTICAL) {
-				setText(JUnitMessages.getString("TestRunnerViewPart.toggle.vertical.label")); //$NON-NLS-1$
-				setDisabledImageDescriptor(JUnitPlugin.getImageDescriptor("dlcl16/th_vertical.gif")); //$NON-NLS-1$
-				setHoverImageDescriptor(JUnitPlugin.getImageDescriptor("clcl16/th_vertical.gif")); //$NON-NLS-1$
-				setImageDescriptor(JUnitPlugin.getImageDescriptor("elcl16/th_vertical.gif")); //$NON-NLS-1$				
-			}
-			fOrientation= orientation;
-			WorkbenchHelp.setHelp(this, IJUnitHelpContextIds.RESULTS_VIEW_TOGGLE_ORIENTATION_ACTION);
-		}
-		
-		public int getOrientation() {
-			return fOrientation;
-		}
-		
-		public void run() {
-			if (fCurrentOrientation == fOrientation)
-				return;
-			setOrientation(fOrientation);
-		}		
-	}
-	
-	/**
-	 * Listen for for modifications to Java elements
-	 */
-	private class DirtyListener implements IElementChangedListener {
-		public void elementChanged(ElementChangedEvent event) {
-			processDelta(event.getDelta());				
-		}
-		
-		private boolean processDelta(IJavaElementDelta delta) {
-			int kind= delta.getKind();
-			int details= delta.getFlags();
-			int type= delta.getElement().getElementType();
-			
-			switch (type) {
-				// Consider containers for class files.
-				case IJavaElement.JAVA_MODEL:
-				case IJavaElement.JAVA_PROJECT:
-				case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				case IJavaElement.PACKAGE_FRAGMENT:
-					// If we did some different than changing a child we flush the the undo / redo stack.
-					if (kind != IJavaElementDelta.CHANGED || details != IJavaElementDelta.F_CHILDREN) {
-						codeHasChanged();
-						return false;
-					}
-					break;
-				case IJavaElement.COMPILATION_UNIT:
-					// if we have changed a primary working copy (e.g created, removed, ...)
-					// then we do nothing.
-					if ((details & IJavaElementDelta.F_PRIMARY_WORKING_COPY) != 0) 
-						return true;
-					codeHasChanged();
-					return false;
-					
-				case IJavaElement.CLASS_FILE:
-					// Don't examine children of a class file but keep on examining siblings.
-					return true;
-				default:
-					codeHasChanged();
-					return false;	
-			}
-				
-			IJavaElementDelta[] affectedChildren= delta.getAffectedChildren();
-			if (affectedChildren == null)
-				return true;
-	
-			for (int i= 0; i < affectedChildren.length; i++) {
-				if (!processDelta(affectedChildren[i]))
-					return false;
-			}
-			return true;			
-		}
-	}
-	
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		super.init(site, memento);
-		fMemento= memento;
-	}
-
-	private void restoreLayoutState(IMemento memento) {
-		Integer page= memento.getInteger(TAG_PAGE);
-		if (page != null) {
-			int p= page.intValue();
-			fTabFolder.setSelection(p);
-			fActiveRunView= (ITestRunView)fTestRunViews.get(p);
-		}
-		Integer ratio= memento.getInteger(TAG_RATIO);
-		if (ratio != null) 
-			fSashForm.setWeights(new int[] { ratio.intValue(), 1000 - ratio.intValue()} );
-		Integer orientation= memento.getInteger(TAG_ORIENTATION);
-		if (orientation != null)
-			setOrientation(orientation.intValue());
-		String scrollLock= memento.getString(TAG_SCROLL);
-		if (scrollLock != null)
-			fScrollLockAction.setChecked(scrollLock.equals("true"));
-	}
-	
-	/**
-	 * Stops the currently running test and shuts down the RemoteTestRunner
-	 */
-	public void stopTest() {
-		if (fTestRunnerClient != null)
-			fTestRunnerClient.stopTest();
-	}
-
-	/**
-	 * Stops the currently running test and shuts down the RemoteTestRunner
-	 */
-	public void rerunTestRun() {
-		if (fLastLaunch != null && fLastLaunch.getLaunchConfiguration() != null) {
-			try {
-				DebugUITools.saveAndBuildBeforeLaunch();
-				fLastLaunch.getLaunchConfiguration().launch(fLastLaunch.getLaunchMode(), null);		
-			} catch (CoreException e) {
-				ErrorDialog.openError(getSite().getShell(), 
-					JUnitMessages.getString("TestRunnerViewPart.error.cannotrerun"), e.getMessage(), e.getStatus() //$NON-NLS-1$
-				);
-			}
-		}
-	}
-
-	public void setAutoScroll(boolean scroll) {
-		fAutoScroll = scroll;
-	}
-	
-	public boolean isAutoScroll() {
-		return fAutoScroll;
-	}	
-
-	/*
-	 * @see ITestRunListener#testRunStarted(testCount)
-	 */
-	public void testRunStarted(final int testCount){
-		reset(testCount);
-		fShowOnErrorOnly= JUnitPreferencePage.getShowOnErrorOnly();
-		fExecutedTests++;
-	}
-	
-	public void selectNextFailure() {
-		fActiveRunView.selectNext();
-	}
-	
-	public void selectPreviousFailure() {
-		fActiveRunView.selectPrevious();
-	}
-
-	public void showTest(TestRunInfo test) {
-		fActiveRunView.setSelectedTest(test.getTestId());
-		handleTestSelected(test.getTestId());
-		new OpenTestAction(this, test.getClassName(), test.getTestMethodName()).run();
-	}
-
-	
-	public void reset(){
-		reset(0);
-		setViewPartTitle(null);
-		clearStatus();
-		resetViewIcon();
-	}
-
-	/*
-	 * @see ITestRunListener#testRunEnded
-	 */
-	public void testRunEnded(long elapsedTime){
-		fExecutedTests--;
-		String[] keys= {elapsedTimeAsString(elapsedTime), String.valueOf(fErrorCount), String.valueOf(fFailureCount)};
-		String msg= JUnitMessages.getFormattedString("TestRunnerViewPart.message.finish", keys); //$NON-NLS-1$
-		if (hasErrorsOrFailures())
-			postError(msg);
-		else
-			postInfo(msg);
-			
-		postSyncRunnable(new Runnable() {				
-			public void run() {
-				if(isDisposed()) 
-					return;	
-				if (fFailures.size() > 0) {
-					selectFirstFailure();
-				}
-				updateViewIcon();
-				if (fDirtyListener == null) {
-					fDirtyListener= new DirtyListener();
-					JavaCore.addElementChangedListener(fDirtyListener);
-				}
-				for (Enumeration e= fTestRunViews.elements(); e.hasMoreElements();) {
-					ITestRunView v= (ITestRunView) e.nextElement();
-					v.aboutToEnd();
-				}
-			}
-		});	
-	}
-
-	protected void selectFirstFailure() {
-		TestRunInfo firstFailure= (TestRunInfo)fFailures.get(0);
-		if (firstFailure != null && fAutoScroll) {
-			fActiveRunView.setSelectedTest(firstFailure.getTestId());
-			handleTestSelected(firstFailure.getTestId());
-		}
-	}
-
-	private void updateViewIcon() {
-		if (hasErrorsOrFailures()) 
-			fViewImage= fTestRunFailIcon;
-		else 
-			fViewImage= fTestRunOKIcon;
-		firePropertyChange(IWorkbenchPart.PROP_TITLE);	
-	}
-
-	private boolean hasErrorsOrFailures() {
-		return fErrorCount+fFailureCount > 0;
-	}
-
-	private String elapsedTimeAsString(long runTime) {
-		return NumberFormat.getInstance().format((double)runTime/1000);
-	}
-
-	/*
-	 * @see ITestRunListener#testRunStopped
-	 */
-	public void testRunStopped(final long elapsedTime) {
-		String msg= JUnitMessages.getFormattedString("TestRunnerViewPart.message.stopped", elapsedTimeAsString(elapsedTime)); //$NON-NLS-1$
-		postInfo(msg);
-		postSyncRunnable(new Runnable() {				
-			public void run() {
-				if(isDisposed()) 
-					return;	
-				resetViewIcon();
-			}
-		});	
-
-	}
-
-	private void resetViewIcon() {
-		fViewImage= fOriginalViewImage;
-		firePropertyChange(IWorkbenchPart.PROP_TITLE);
-	}
-
-	/*
-	 * @see ITestRunListener#testRunTerminated
-	 */
-	public void testRunTerminated() {
-		String msg= JUnitMessages.getString("TestRunnerViewPart.message.terminated"); //$NON-NLS-1$
-		showMessage(msg);
-	}
-
-	private void showMessage(String msg) {
-		showInformation(msg);
-		postError(msg);
-	}
-
-	/*
-	 * @see ITestRunListener#testStarted
-	 */
-	public void testStarted(String testId, String testName) {
-		postStartTest(testId, testName);
-		// reveal the part when the first test starts
-		if (!fShowOnErrorOnly && fExecutedTests == 1) 
-			postShowTestResultsView();
-			
-		TestRunInfo testInfo= getTestInfo(testId);
-		if (testInfo == null) {
-			testInfo= new TestRunInfo(testId, testName);
-			fTestInfos.put(testId, testInfo);
-		}
-		String className= testInfo.getClassName();
-		String method= testInfo.getTestMethodName();		
-		String status= JUnitMessages.getFormattedString("TestRunnerViewPart.message.started", new String[] { className, method }); //$NON-NLS-1$
-		postInfo(status); 
-	}
-	
-	/*
-	 * @see ITestRunListener#testEnded
-	 */
-	public void testEnded(String testId, String testName){
-		postEndTest(testId, testName);
-		fExecutedTests++;
-	}
-
-	/*
-	 * @see ITestRunListener#testFailed
-	 */
-	public void testFailed(int status, String testId, String testName, String trace){
-		testFailed(status, testId, testName, trace, null, null);
-	}
-
-	/*
-	 * @see ITestRunListener#testFailed
-	 */
-	public void testFailed(int status, String testId, String testName, String trace, String expected, String actual) {
-	    TestRunInfo testInfo= getTestInfo(testId);
-	    if (testInfo == null) {
-	        testInfo= new TestRunInfo(testId, testName);
-	        fTestInfos.put(testName, testInfo);
-	    }
-	    testInfo.setTrace(trace);
-	    testInfo.setStatus(status);
-	    if (expected != null) {
-			testInfo.setExpected(expected.substring(0, expected.length()-1));
-		}
-	    if (actual != null)
-	        testInfo.setActual(actual.substring(0, actual.length()-1));
-	    
-	    if (status == ITestRunListener.STATUS_ERROR)
-	        fErrorCount++;
-	    else
-	        fFailureCount++;
-	    fFailures.add(testInfo);
-	    // show the view on the first error only
-	    if (fShowOnErrorOnly && (fErrorCount + fFailureCount == 1)) 
-	        postShowTestResultsView();
-	}
-	
-	/*
-	 * @see ITestRunListener#testReran
-	 */
-	public void testReran(String testId, String className, String testName, int status, String trace) {
-		if (status == ITestRunListener.STATUS_ERROR) {
-			String msg= JUnitMessages.getFormattedString("TestRunnerViewPart.message.error", new String[]{testName, className}); //$NON-NLS-1$
-			postError(msg); 
-		} else if (status == ITestRunListener.STATUS_FAILURE) {
-			String msg= JUnitMessages.getFormattedString("TestRunnerViewPart.message.failure", new String[]{testName, className}); //$NON-NLS-1$
-			postError(msg);
-		} else {
-			String msg= JUnitMessages.getFormattedString("TestRunnerViewPart.message.success", new String[]{testName, className}); //$NON-NLS-1$
-			postInfo(msg);
-		}
-		TestRunInfo info= getTestInfo(testId);
-		updateTest(info, status);
-		if (info.getTrace() == null || !info.getTrace().equals(trace)) {
-			info.setTrace(trace);
-			showFailure(info);
-		}
-	}
-
-	private void updateTest(TestRunInfo info, final int status) {
-		if (status == info.getStatus())
-			return;
-		if (info.getStatus() == ITestRunListener.STATUS_OK) {
-			if (status == ITestRunListener.STATUS_FAILURE) 
-				fFailureCount++;
-			else if (status == ITestRunListener.STATUS_ERROR)
-				fErrorCount++;
-		} else if (info.getStatus() == ITestRunListener.STATUS_ERROR) {
-			if (status == ITestRunListener.STATUS_OK) 
-				fErrorCount--;
-			else if (status == ITestRunListener.STATUS_FAILURE) {
-				fErrorCount--;
-				fFailureCount++;
-			}
-		} else if (info.getStatus() == ITestRunListener.STATUS_FAILURE) {
-			if (status == ITestRunListener.STATUS_OK) 
-				fFailureCount--;
-			else if (status == ITestRunListener.STATUS_ERROR) {
-				fFailureCount--;
-				fErrorCount++;
-			}
-		}			
-		info.setStatus(status);	
-		final TestRunInfo finalInfo= info;
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				refreshCounters();
-				for (Enumeration e= fTestRunViews.elements(); e.hasMoreElements();) {
-					ITestRunView v= (ITestRunView) e.nextElement();
-					v.testStatusChanged(finalInfo);
-				}
-			}
-		});
-		
-	}
-
-	/*
-	 * @see ITestRunListener#testTreeEntry
-	 */
-	public void testTreeEntry(final String treeEntry){
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if(isDisposed()) 
-					return;
-				for (Enumeration e= fTestRunViews.elements(); e.hasMoreElements();) {
-					ITestRunView v= (ITestRunView) e.nextElement();
-					v.newTreeEntry(treeEntry);
-				}
-			}
-		});	
-	}
-
-	public void startTestRunListening(IJavaElement type, int port, ILaunch launch) {
-		fTestProject= type.getJavaProject();
-		fLaunchMode= launch.getLaunchMode();
-		aboutToLaunch();
-		
-		if (fTestRunnerClient != null) {
-			stopTest();
-		}
-		fTestRunnerClient= new RemoteTestRunnerClient();
-		
-		// add the TestRunnerViewPart to the list of registered listeners
-		List listeners= JUnitPlugin.getDefault().getTestRunListeners();	
-		ITestRunListener[] listenerArray= new ITestRunListener[listeners.size()+1];
-		listeners.toArray(listenerArray);
-		System.arraycopy(listenerArray, 0, listenerArray, 1, listenerArray.length-1);
-		listenerArray[0]= this;
-		fTestRunnerClient.startListening(listenerArray, port);
-		
-		fLastLaunch= launch;
-		setViewPartTitle(type);
-		if (type instanceof IType)
-			setTitleToolTip(((IType)type).getFullyQualifiedName());
-		else
-			setTitleToolTip(type.getElementName());
-			
-	}
-
-	private void setViewPartTitle(IJavaElement type) {
-		String title;
-		if (type == null)
-			title= JUnitMessages.getString("TestRunnerViewPart.title_no_type"); //$NON-NLS-1$
-		else	
-			title= JUnitMessages.getFormattedString("TestRunnerViewPart.title", type.getElementName()); //$NON-NLS-1$
-		setTitle(title);
-	}
-
-	private void aboutToLaunch() {
-		String msg= JUnitMessages.getString("TestRunnerViewPart.message.launching"); //$NON-NLS-1$
-		showInformation(msg);
-		postInfo(msg);
-		fViewImage= fOriginalViewImage;
-		firePropertyChange(IWorkbenchPart.PROP_TITLE);
-	}
-
-	public synchronized void dispose(){
-		fIsDisposed= true;
-		stopTest();
-		if (fProgressImages != null)
-			fProgressImages.dispose();
-		JUnitPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);
-		fTestRunOKIcon.dispose();
-		fTestRunFailIcon.dispose();
-		fStackViewIcon.dispose();
-		fTestRunOKDirtyIcon.dispose();
-		fTestRunFailDirtyIcon.dispose();
-		if (fClipboard != null) 
-			fClipboard.dispose();
-	}
-
-	private void start(final int total) {
-		resetProgressBar(total);
-		fCounterPanel.setTotal(total);
-		fCounterPanel.setRunValue(0);	
-	}
-
-	private void resetProgressBar(final int total) {
-		fProgressBar.reset();
-		fProgressBar.setMaximum(total);
-	}
-
-	private void postSyncRunnable(Runnable r) {
-		if (!isDisposed())
-			getDisplay().syncExec(r);
-	}
-
-	private void aboutToStart() {
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if (!isDisposed()) {
-					for (Enumeration e= fTestRunViews.elements(); e.hasMoreElements();) {
-						ITestRunView v= (ITestRunView) e.nextElement();
-						v.aboutToStart();
-					}
-					fNextAction.setEnabled(false);
-					fPreviousAction.setEnabled(false);
-				}
-			}
-		});
-	}
-	
-	private void postEndTest(final String testId, final String testName) {
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if(isDisposed()) 
-					return;
-				handleEndTest();
-				for (Enumeration e= fTestRunViews.elements(); e.hasMoreElements();) {
-					ITestRunView v= (ITestRunView) e.nextElement();
-					v.endTest(testId);
-				}
-				
-				if (fFailureCount + fErrorCount > 0) {
-					fNextAction.setEnabled(true);
-					fPreviousAction.setEnabled(true);
-				}
-			}
-		});	
-	}
-
-	private void postStartTest(final String testId, final String testName) {
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if(isDisposed()) 
-					return;
-				for (Enumeration e= fTestRunViews.elements(); e.hasMoreElements();) {
-					ITestRunView v= (ITestRunView) e.nextElement();
-					v.startTest(testId);
-				}
-			}
-		});	
-	}
-
-	private void handleEndTest() {
-		refreshCounters();
-		fProgressBar.step(fFailureCount+fErrorCount);
-		if (fShowOnErrorOnly) {
-			Image progress= fProgressImages.getImage(fExecutedTests, fTestCount, fErrorCount, fFailureCount);
-			if (progress != fViewImage) {
-				fViewImage= progress;
-				firePropertyChange(IWorkbenchPart.PROP_TITLE);
-			}
-		}
-	}
-
-	private void refreshCounters() {
-		fCounterPanel.setErrorValue(fErrorCount);
-		fCounterPanel.setFailureValue(fFailureCount);
-		fCounterPanel.setRunValue(fExecutedTests);
-		fProgressBar.refresh(fErrorCount+fFailureCount> 0);
-	}
-
-	protected void postShowTestResultsView() {
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if (isDisposed()) 
-					return;
-				showTestResultsView();
-			}
-		});
-	}
-
-	public void showTestResultsView() {
-		IWorkbenchWindow window= getSite().getWorkbenchWindow();
-		IWorkbenchPage page= window.getActivePage();
-		TestRunnerViewPart testRunner= null;
-		
-		if (page != null) {
-			try { // show the result view
-				testRunner= (TestRunnerViewPart)page.findView(TestRunnerViewPart.NAME);
-				if(testRunner == null) {
-					IWorkbenchPart activePart= page.getActivePart();
-					testRunner= (TestRunnerViewPart)page.showView(TestRunnerViewPart.NAME);
-					//restore focus stolen by the creation of the console
-					page.activate(activePart);
-				} else {
-					page.bringToTop(testRunner);
-				}
-			} catch (PartInitException pie) {
-				JUnitPlugin.log(pie);
-			}
-		}
-	}
-
-	protected void postInfo(final String message) {
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if (isDisposed()) 
-					return;
-				getStatusLine().setErrorMessage(null);
-				getStatusLine().setMessage(message);
-			}
-		});
-	}
-
-	protected void postError(final String message) {
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if (isDisposed()) 
-					return;
-				getStatusLine().setMessage(null);
-				getStatusLine().setErrorMessage(message);
-			}
-		});
-	}
-
-	protected void showInformation(final String info){
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if (!isDisposed())
-					fFailureView.setInformation(info);
-			}
-		});
-	}
-
-	private CTabFolder createTestRunViews(Composite parent) {
-		CTabFolder tabFolder= new CTabFolder(parent, SWT.TOP);
-		tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL));
-
-		ITestRunView failureRunView= new FailureRunView(tabFolder, fClipboard, this);		
-		ITestRunView testHierarchyRunView= new HierarchyRunView(tabFolder, this);
-		
-		fTestRunViews.addElement(failureRunView);
-		fTestRunViews.addElement(testHierarchyRunView);
-		
-		tabFolder.setSelection(0);				
-		fActiveRunView= (ITestRunView)fTestRunViews.firstElement();		
-				
-		tabFolder.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				testViewChanged(event);
-			}
-		});
-		return tabFolder;
-	}
-
-	private void testViewChanged(SelectionEvent event) {
-		for (Enumeration e= fTestRunViews.elements(); e.hasMoreElements();) {
-			ITestRunView v= (ITestRunView) e.nextElement();
-			if (((CTabFolder) event.widget).getSelection().getText() == v.getName()){
-				v.setSelectedTest(fActiveRunView.getSelectedTestId());
-				fActiveRunView= v;
-				fActiveRunView.activate();
-			}
-		}
-	}
-
-	private SashForm createSashForm(Composite parent) {
-		fSashForm= new SashForm(parent, SWT.VERTICAL);
-		ViewForm top= new ViewForm(fSashForm, SWT.NONE);
-		fTabFolder= createTestRunViews(top);
-		fTabFolder.setLayoutData(new TabFolderLayout());
-		top.setContent(fTabFolder);
-		
-		ViewForm bottom= new ViewForm(fSashForm, SWT.NONE);
-		CLabel label= new CLabel(bottom, SWT.NONE);
-		label.setText(JUnitMessages.getString("TestRunnerViewPart.label.failure")); //$NON-NLS-1$
-		label.setImage(fStackViewIcon);
-		bottom.setTopLeft(label);
-
-		ToolBar failureToolBar= new ToolBar(bottom, SWT.FLAT | SWT.WRAP);
-		bottom.setTopCenter(failureToolBar);
-		fFailureView= new FailureTraceView(bottom, fClipboard, this, failureToolBar);
-		bottom.setContent(fFailureView.getComposite()); 
-		
-		fSashForm.setWeights(new int[]{50, 50});
-		return fSashForm;
-	}
-
-	private void reset(final int testCount) {
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if (isDisposed()) 
-					return;
-				fCounterPanel.reset();
-				fFailureView.clear();
-				fProgressBar.reset();
-				clearStatus();
-				start(testCount);
-			}
-		});
-		fExecutedTests= 0;
-		fFailureCount= 0;
-		fErrorCount= 0;
-		fTestCount= testCount;
-		aboutToStart();
-		fTestInfos.clear();
-		fFailures= new ArrayList();
-	}
-
-	private void clearStatus() {
-		getStatusLine().setMessage(null);
-		getStatusLine().setErrorMessage(null);
-	}
-
-    public void setFocus() {
-    	if (fActiveRunView != null)
-    		fActiveRunView.setFocus();
-    }
-
-    public void createPartControl(Composite parent) {	
-    	fParent= parent;
-		fClipboard= new Clipboard(parent.getDisplay());
-
-		GridLayout gridLayout= new GridLayout();
-		gridLayout.marginWidth= 0;
-		gridLayout.marginHeight= 0;
-		parent.setLayout(gridLayout);
-
-		configureToolBar();
-		
-		fCounterComposite= createProgressCountPanel(parent);
-		fCounterComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
-		SashForm sashForm= createSashForm(parent);
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-		IActionBars actionBars= getViewSite().getActionBars();
-		actionBars.setGlobalActionHandler(
-			ActionFactory.COPY.getId(),
-			new CopyTraceAction(fFailureView, fClipboard));
-		
-		JUnitPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);
-		fOriginalViewImage= getTitleImage();
-		fProgressImages= new ProgressImages();
-		WorkbenchHelp.setHelp(parent, IJUnitHelpContextIds.RESULTS_VIEW);
-		
-		if (fMemento != null) {
-			restoreLayoutState(fMemento);
-		}
-		fMemento= null;
-	}
-
-	public void saveState(IMemento memento) {
-		if (fSashForm == null) {
-			// part has not been created
-			if (fMemento != null) //Keep the old state;
-				memento.putMemento(fMemento);
-			return;
-		}
-		
-		int activePage= fTabFolder.getSelectionIndex();
-		memento.putInteger(TAG_PAGE, activePage);
-		memento.putString(TAG_SCROLL, fScrollLockAction.isChecked() ? "true" : "false");
-		int weigths[]= fSashForm.getWeights();
-		int ratio= (weigths[0] * 1000) / (weigths[0] + weigths[1]);
-		memento.putInteger(TAG_RATIO, ratio);
-		memento.putInteger(TAG_ORIENTATION, fCurrentOrientation);
-	}
-	
-	private void configureToolBar() {
-		IActionBars actionBars= getViewSite().getActionBars();
-		IToolBarManager toolBar= actionBars.getToolBarManager();
-		IMenuManager viewMenu = actionBars.getMenuManager();
-		fRerunLastTestAction= new RerunLastAction();
-		fScrollLockAction= new ScrollLockAction(this);
-		fToggleOrientationActions =
-			new ToggleOrientationAction[] {
-				new ToggleOrientationAction(this, VIEW_ORIENTATION_VERTICAL),
-				new ToggleOrientationAction(this, VIEW_ORIENTATION_HORIZONTAL)};
-		fNextAction= new ShowNextFailureAction(this);
-		fPreviousAction= new ShowPreviousFailureAction(this);
-		fNextAction.setEnabled(false);
-		fPreviousAction.setEnabled(false);
-		actionBars.setGlobalActionHandler(ActionFactory.NEXT.getId(), fNextAction);
-		actionBars.setGlobalActionHandler(ActionFactory.PREVIOUS.getId(), fPreviousAction);
-		
-		toolBar.add(fNextAction);
-		toolBar.add(fPreviousAction);
-		toolBar.add(new StopAction());
-		toolBar.add(new Separator());
-		toolBar.add(fRerunLastTestAction);
-		toolBar.add(fScrollLockAction);
-
-		for (int i = 0; i < fToggleOrientationActions.length; ++i)
-			viewMenu.add(fToggleOrientationActions[i]);
-		
-		fScrollLockAction.setChecked(!fAutoScroll);
-
-		actionBars.updateActionBars();
-	}
-
-	private IStatusLineManager getStatusLine() {
-		// we want to show messages globally hence we
-		// have to go throgh the active part
-		IViewSite site= getViewSite();
-		IWorkbenchPage page= site.getPage();
-		IWorkbenchPart activePart= page.getActivePart();
-	
-		if (activePart instanceof IViewPart) {
-			IViewPart activeViewPart= (IViewPart)activePart;
-			IViewSite activeViewSite= activeViewPart.getViewSite();
-			return activeViewSite.getActionBars().getStatusLineManager();
-		}
-		
-		if (activePart instanceof IEditorPart) {
-			IEditorPart activeEditorPart= (IEditorPart)activePart;
-			IEditorActionBarContributor contributor= activeEditorPart.getEditorSite().getActionBarContributor();
-			if (contributor instanceof EditorActionBarContributor) 
-				return ((EditorActionBarContributor) contributor).getActionBars().getStatusLineManager();
-		}
-		// no active part
-		return getViewSite().getActionBars().getStatusLineManager();
-	}
-
-	private Composite createProgressCountPanel(Composite parent) {
-		Composite composite= new Composite(parent, SWT.NONE);
-		GridLayout layout= new GridLayout();
-		composite.setLayout(layout);
-		setCounterColumns(layout); 
-		
-		fCounterPanel = new CounterPanel(composite);
-		fCounterPanel.setLayoutData(
-			new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
-		fProgressBar = new JUnitProgressBar(composite);
-		fProgressBar.setLayoutData(
-				new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
-		return composite;
-	}
-
-	public TestRunInfo getTestInfo(String testId) {
-		if (testId == null)
-			return null;
-		return (TestRunInfo) fTestInfos.get(testId);
-	}
-
-	public void handleTestSelected(String testId) {
-		TestRunInfo testInfo= getTestInfo(testId);
-
-		if (testInfo == null) {
-			showFailure(null); //$NON-NLS-1$
-		} else {
-			showFailure(testInfo);
-		}
-	}
-
-	private void showFailure(final TestRunInfo failure) {
-		postSyncRunnable(new Runnable() {
-			public void run() {
-				if (!isDisposed())
-					fFailureView.showFailure(failure);
-			}
-		});		
-	}
-
-	public IJavaProject getLaunchedProject() {
-		return fTestProject;
-	}
-	
-	public ILaunch getLastLaunch() {
-		return fLastLaunch;
-	}
-	
-	protected static Image createImage(String path) {
-		try {
-			ImageDescriptor id= ImageDescriptor.createFromURL(JUnitPlugin.makeIconFileURL(path));
-			return id.createImage();
-		} catch (MalformedURLException e) {
-			// fall through
-		}  
-		return null;
-	}
-
-	private boolean isDisposed() {
-		return fIsDisposed || fCounterPanel.isDisposed();
-	}
-
-	private Display getDisplay() {
-		return getViewSite().getShell().getDisplay();
-	}
-	/**
-	 * @see IWorkbenchPart#getTitleImage()
-	 */
-	public Image getTitleImage() {
-		if (fOriginalViewImage == null)
-			fOriginalViewImage= super.getTitleImage();
-			
-		if (fViewImage == null)
-			return super.getTitleImage();
-		return fViewImage;
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		if (isDisposed())
-			return;
-
-		if (IJUnitPreferencesConstants.SHOW_ON_ERROR_ONLY.equals(event.getProperty())) {
-			if (!JUnitPreferencePage.getShowOnErrorOnly()) {
-				fViewImage= fOriginalViewImage;
-				firePropertyChange(IWorkbenchPart.PROP_TITLE);
-			}
-		}
-	}
-
-	void codeHasChanged() {
-		if (fDirtyListener != null) {
-			JavaCore.removeElementChangedListener(fDirtyListener);
-			fDirtyListener= null;
-		}
-		if (fViewImage == fTestRunOKIcon) 
-			fViewImage= fTestRunOKDirtyIcon;
-		else if (fViewImage == fTestRunFailIcon)
-			fViewImage= fTestRunFailDirtyIcon;
-		
-		Runnable r= new Runnable() {
-			public void run() {
-				if (isDisposed())
-					return;
-				firePropertyChange(IWorkbenchPart.PROP_TITLE);
-			}
-		};
-		if (!isDisposed())
-			getDisplay().asyncExec(r);
-	}
-	
-	boolean isCreated() {
-		return fCounterPanel != null;
-	}
-
-	public void rerunTest(String testId, String className, String testName) {
-		DebugUITools.saveAndBuildBeforeLaunch();
-		if (fTestRunnerClient != null && fTestRunnerClient.isRunning() && ILaunchManager.DEBUG_MODE.equals(fLaunchMode))
-			fTestRunnerClient.rerunTest(testId, className, testName);
-		else if (fLastLaunch != null) {
-			// run the selected test using the previous launch configuration
-			ILaunchConfiguration launchConfiguration= fLastLaunch.getLaunchConfiguration();
-			if (launchConfiguration != null) {
-				try {
-					ILaunchConfigurationWorkingCopy tmp= launchConfiguration.copy("Rerun "+testName); //$NON-NLS-1$
-					tmp.setAttribute(JUnitBaseLaunchConfiguration.TESTNAME_ATTR, testName);
-					tmp.launch(fLastLaunch.getLaunchMode(), null);	
-					return;	
-				} catch (CoreException e) {
-					ErrorDialog.openError(getSite().getShell(), 
-						JUnitMessages.getString("TestRunnerViewPart.error.cannotrerun"), e.getMessage(), e.getStatus() //$NON-NLS-1$
-					);
-				}
-			}
-			MessageDialog.openInformation(getSite().getShell(), 
-				JUnitMessages.getString("TestRunnerViewPart.cannotrerun.title"),  //$NON-NLS-1$
-				JUnitMessages.getString("TestRunnerViewPart.cannotrerurn.message") //$NON-NLS-1$
-			); 
-		}
-	}
-	
-	private void setOrientation(int orientation) {
-		if ((fSashForm == null) || fSashForm.isDisposed())
-			return;
-		boolean horizontal = orientation == VIEW_ORIENTATION_HORIZONTAL;
-		fSashForm.setOrientation(horizontal ? SWT.HORIZONTAL : SWT.VERTICAL);
-		for (int i = 0; i < fToggleOrientationActions.length; ++i)
-			fToggleOrientationActions[i].setChecked(orientation == fToggleOrientationActions[i].getOrientation());
-		fCurrentOrientation = orientation;
-		GridLayout layout= (GridLayout) fCounterComposite.getLayout();
-		setCounterColumns(layout); 
-		fParent.layout();
-	}
-
-	private void setCounterColumns(GridLayout layout) {
-		if (fCurrentOrientation == VIEW_ORIENTATION_HORIZONTAL)
-			layout.numColumns= 2; 
-		else
-			layout.numColumns= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/CheckedTableSelectionDialog.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/CheckedTableSelectionDialog.java
deleted file mode 100644
index 680d95a..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/CheckedTableSelectionDialog.java
+++ /dev/null
@@ -1,297 +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.jdt.internal.junit.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.internal.junit.wizards.WizardMessages;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-import org.eclipse.ui.dialogs.SelectionStatusDialog;
-
-/**
- * A dialog with checked table viewer.
- * 
- * TO DO: this class is duplicated from org.eclipse.jdt.ui
- */
-public class CheckedTableSelectionDialog extends SelectionStatusDialog {
-	
-	private CheckboxTableViewer fViewer;
-	
-	private ILabelProvider fLabelProvider;
-	private IStructuredContentProvider fContentProvider;
-	
-	private ISelectionStatusValidator fValidator= null; 
-	private ViewerSorter fSorter;
-	private String fEmptyListMessage= WizardMessages.getString("CheckedTableSelectionDialog.emptyListMessage"); //$NON-NLS-1$
-	
-	private IStatus fCurrStatus= new JUnitStatus();
-	private List fFilters;
-	private Object fInput;		
-	private boolean fIsEmpty;
-	
-	private int fWidth= 40;
-	private int fHeight= 18;
-	
-	/**
-	 * Constructs an instance of <code>ElementTreeSelectionDialog</code>.
-	 * @param labelProvider   the label provider to render the entries
-	 * @param contentProvider the content provider to evaluate the tree structure
-	 */	
-	public CheckedTableSelectionDialog(Shell parent, ILabelProvider labelProvider,
-		IStructuredContentProvider contentProvider) {
-		super(parent);
-		
-		fLabelProvider= labelProvider;
-		fContentProvider= contentProvider;
-
-		setResult(new ArrayList(0));
-		setStatusLineAboveButtons(true);
-	}
-
-	/**
-	 * Sets the initial selection.
-	 * Convenience method.
-	 * @param selection the initial selection.
-	 */
-	public void setInitialSelection(Object selection) {
-		setInitialSelections(new Object[] {selection});
-	}
-
-	/**
-	 * Sets the message to be displayed if the list is empty.
-	 * @param message the message to be displayed.
-	 */	
-	public void setEmptyListMessage(String message) {
-		fEmptyListMessage= message;
-	}	
-	
-	/**
-	 * Sets the sorter used by the tree viewer.
-	 */
-	public void setSorter(ViewerSorter sorter) {
-		fSorter= sorter;
-	}		
-	
-	/**
-	 * Adds a filter to the tree viewer.
-	 * @param filter a filter.
-	 */
-	public void addFilter(ViewerFilter filter) {
-		if (fFilters == null)
-			fFilters= new ArrayList(4);
-			
-		fFilters.add(filter);
-	}
-	
-	/**
-	 * Sets an optional validator to check if the selection is valid.
-	 * The validator is invoked whenever the selection changes.
-	 * @param validator the validator to validate the selection.
-	 */
-	public void setValidator(ISelectionStatusValidator validator) {
-		fValidator= validator;
-	}			
-	
-	/**
-	 * Sets the tree input.
-	 * @param input the tree input.
-	 */
-	public void setInput(Object input) {
-		fInput= input;
-	}
-
-	/**
-	 * Sets the size of the tree in unit of characters.
-	 * @param width  the width of the tree.
-	 * @param height the height of the tree.
-	 */
-	public void setSize(int width, int height) {
-		fWidth= width;
-		fHeight= height;
-	}
-
-	protected void updateOKStatus() {
-		if (!fIsEmpty) {
-			if (fValidator != null) {
-				fCurrStatus= fValidator.validate(fViewer.getCheckedElements());
-				updateStatus(fCurrStatus);
-			} else if (!fCurrStatus.isOK()) {
-				fCurrStatus= new JUnitStatus();
-			}
-		} else {
-			fCurrStatus= new JUnitStatus(IStatus.ERROR, fEmptyListMessage);
-		}
-		updateStatus(fCurrStatus);
-	}
-	
-	/*
-	 * @see Window#open()
-	 */	 
-	public int open() {
-		fIsEmpty= evaluateIfTableEmpty(fInput);
-		BusyIndicator.showWhile(null, new Runnable() {
-			public void run() {
-				access$superOpen();
-			}
-		});
-		return getReturnCode();
-	}
-
-	private void access$superOpen() {
-		super.open();
-	}	
-	 		
-	/**
-	 * Handles cancel button pressed event.
-	 */	 
-	protected void cancelPressed() {
-		setResult(null);
-		super.cancelPressed();
-	} 
-
-	/*
-	 * @see SelectionStatusDialog#computeResult()
-	 */	 
-	protected void computeResult() {
-		setResult(Arrays.asList(fViewer.getCheckedElements()));
-	} 
-	 
-	/*
-	 * @see Window#create()
-	 */	 
-	public void create() {
-		super.create();
-
-		List initialSelections= getInitialElementSelections();
-		if (initialSelections.size() > 0) {
-			fViewer.setCheckedElements(initialSelections.toArray());			
-		}
-			
-		updateOKStatus();
-	}		
-	
-	/*
-	 * @see Dialog#createDialogArea(Composite)
-	 */	 
-	protected Control createDialogArea(Composite parent) {
-		Composite composite= (Composite) super.createDialogArea(parent);
-		
-		Label messageLabel= createMessageArea(composite);
-		Control treeWidget= createTableViewer(composite);
-		Control buttonComposite= createSelectionButtons(composite);
-
-		GridData data= new GridData(GridData.FILL_BOTH);
-		data.widthHint= convertWidthInCharsToPixels(fWidth);
-		data.heightHint= convertHeightInCharsToPixels(fHeight);
-		treeWidget.setLayoutData(data);
-		
-		if (fIsEmpty) {
-			messageLabel.setEnabled(false);
-			treeWidget.setEnabled(false);
-			buttonComposite.setEnabled(false);
-		}
-		applyDialogFont(composite);
-		return composite;
-	}
-	
-	private Table createTableViewer(Composite parent) {
-		fViewer= CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
-			
-		fViewer.setContentProvider(fContentProvider);
-		fViewer.setLabelProvider(fLabelProvider);
-		fViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				updateOKStatus();
-			}	
-		});
-		
-		fViewer.setSorter(fSorter);
-		if (fFilters != null) {
-			for (int i= 0; i != fFilters.size(); i++)
-				fViewer.addFilter((ViewerFilter) fFilters.get(i));
-		}
-				
-		fViewer.setInput(fInput);
-		return fViewer.getTable();	
-	}
-		
-	/**
-	 * Add the selection and deselection buttons to the dialog.
-	 * @param composite org.eclipse.swt.widgets.Composite
-	 */
-	private Composite createSelectionButtons(Composite composite) {
-		Composite buttonComposite= new Composite(composite, SWT.RIGHT);
-		GridLayout layout= new GridLayout();
-		layout.numColumns= 2;
-		buttonComposite.setLayout(layout);
-		GridData data= new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL);
-		data.grabExcessHorizontalSpace= true;
-		composite.setData(data);
-
-		Button selectButton= createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, WizardMessages.getString("CheckedTableSelectionDialog.selectAll"), false); //$NON-NLS-1$
-
-		SelectionListener listener= new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				fViewer.setCheckedElements(fContentProvider.getElements(fInput));
-				updateOKStatus();
-			}
-		};
-		selectButton.addSelectionListener(listener);
-
-		Button deselectButton= createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, WizardMessages.getString("CheckedTableSelectionDialog.deselectAll"), false); //$NON-NLS-1$
-
-		listener= new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				fViewer.setCheckedElements(new Object[0]);
-				updateOKStatus();
-			}
-		};
-		deselectButton.addSelectionListener(listener);
-		return buttonComposite;
-	}
-	
-	private boolean evaluateIfTableEmpty(Object input) {
-		Object[] elements= fContentProvider.getElements(input);
-		if (elements.length > 0) {
-			if (fFilters != null) {
-				for (int i= 0; i < fFilters.size(); i++) {
-					ViewerFilter curr= (ViewerFilter)fFilters.get(i);
-					elements= curr.filter(fViewer, input, elements);
-				}
-			}
-		}
-		return elements.length == 0;
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/ExceptionHandler.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/ExceptionHandler.java
deleted file mode 100644
index c6e4d03..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/ExceptionHandler.java
+++ /dev/null
@@ -1,99 +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.jdt.internal.junit.util;
-
-import java.io.StringWriter;
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.junit.wizards.WizardMessages;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * The default exception handler shows an error dialog when one of its handle methods
- * is called. If the passed exception is a <code>CoreException</code> an error dialog
- * pops up showing the exception's status information. For a <code>InvocationTargetException</code>
- * a normal message dialog pops up showing the exception's message. Additionally the exception
- * is written to the platform log.
- * 
- * TO DO: this class is duplicated from org.eclipse.jdt.ui
- */
-public class ExceptionHandler {
-
-	private static ExceptionHandler fgInstance= new ExceptionHandler();
-	
-	/**
-	 * Handles the given <code>CoreException</code>. 
-	 * 
-	 * @param e the <code>CoreException</code> to be handled
-	 * @param parent the dialog window's parent shell
-	 * @param title the dialog window's window title
-	 * @param message message to be displayed by the dialog window
-	 */
-	public static void handle(CoreException e, Shell parent, String title, String message) {
-		fgInstance.perform(e, parent, title, message);
-	}
-	
-	/**
-	 * Handles the given <code>InvocationTargetException</code>. 
-	 * 
-	 * @param e the <code>InvocationTargetException</code> to be handled
-	 * @param parent the dialog window's parent shell
-	 * @param title the dialog window's window title
-	 * @param message message to be displayed by the dialog window
-	 */
-	public static void handle(InvocationTargetException e, Shell parent, String title, String message) {
-		fgInstance.perform(e, parent, title, message);
-	}
-
-	//---- Hooks for subclasses to control exception handling ------------------------------------
-	
-	protected void perform(CoreException e, Shell shell, String title, String message) {
-		JUnitPlugin.log(e);
-		IStatus status= e.getStatus();
-		if (status != null) {
-			ErrorDialog.openError(shell, title, message, status);
-		} else {
-			displayMessageDialog(e, e.getMessage(), shell, title, message);
-		}
-	}
-
-	protected void perform(InvocationTargetException e, Shell shell, String title, String message) {
-		Throwable target= e.getTargetException();
-		if (target instanceof CoreException) {
-			perform((CoreException)target, shell, title, message);
-		} else {
-			JUnitPlugin.log(e);
-			if (e.getMessage() != null && e.getMessage().length() > 0) {
-				displayMessageDialog(e, e.getMessage(), shell, title, message);
-			} else {
-				displayMessageDialog(e, target.getMessage(), shell, title, message);
-			}
-		}
-	}
-	
-	private void displayMessageDialog(Throwable t, String exceptionMessage, Shell shell, String title, String message) {
-		StringWriter msg= new StringWriter();
-		if (message != null) {
-			msg.write(message);
-			msg.write("\n\n"); //$NON-NLS-1$
-		}
-		if (exceptionMessage == null || exceptionMessage.length() == 0)
-			msg.write(WizardMessages.getString("ExceptionDialog.seeErrorLogMessage")); //$NON-NLS-1$
-		else
-			msg.write(exceptionMessage);
-		MessageDialog.openError(shell, title, msg.toString());			
-	}	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/IJUnitStatusConstants.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/IJUnitStatusConstants.java
deleted file mode 100644
index 7f3b293..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/IJUnitStatusConstants.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.util;
-
-public interface IJUnitStatusConstants {
-
-	// JUnit UI status constants start at 10000 to make sure that we don't
-	// collide with resource and java model constants.
-	
-	public static final int INTERNAL_ERROR= 10001;
-	
-	/**
-	 * Status constant indicating that an validateEdit call has changed the
-	 * content of a file on disk.
-	 */
-	public static final int VALIDATE_EDIT_CHANGED_CONTENT= 10003;
-	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/JUnitStatus.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/JUnitStatus.java
deleted file mode 100644
index 4cf496b..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/JUnitStatus.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.jdt.internal.junit.util;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jface.util.Assert;
-
-/**
- * An implemention of IStatus. 
- * TO DO: Why is it duplicated, it should leverage the Status base class???
- */
-public class JUnitStatus implements IStatus {
-	private String fStatusMessage;
-	private int fSeverity;
-	
-	/**
-	 * Creates a status set to OK (no message)
-	 */
-	public JUnitStatus() {
-		this(OK, null);
-	}
-
-	/**
-	 * Creates a status .
-	 * @param severity The status severity: ERROR, WARNING, INFO and OK.
-	 * @param message The message of the status. Applies only for ERROR,
-	 * WARNING and INFO.
-	 */	
-	public JUnitStatus(int severity, String message) {
-		fStatusMessage= message;
-		fSeverity= severity;
-	}		
-
-	public static IStatus createError(String message) {
-		return new JUnitStatus(IStatus.ERROR, message);
-	}
-	
-	public static IStatus createWarning(String message) {
-		return new JUnitStatus(IStatus.WARNING, message);
-	}
-
-	public static IStatus createInfo(String message) {
-		return new JUnitStatus(IStatus.INFO, message);
-	}
-	
-	/**
-	 *  Returns if the status' severity is OK.
-	 */
-	public boolean isOK() {
-		return fSeverity == IStatus.OK;
-	}
-
-	/**
-	 *  Returns if the status' severity is WARNING.
-	 */	
-	public boolean isWarning() {
-		return fSeverity == IStatus.WARNING;
-	}
-
-	/**
-	 *  Returns if the status' severity is INFO.
-	 */	
-	public boolean isInfo() {
-		return fSeverity == IStatus.INFO;
-	}	
-
-	/**
-	 *  Returns if the status' severity is ERROR.
-	 */	
-	public boolean isError() {
-		return fSeverity == IStatus.ERROR;
-	}
-	
-	/**
-	 * @see IStatus#getMessage
-	 */
-	public String getMessage() {
-		return fStatusMessage;
-	}
-	
-	/**
-	 * Sets the status to ERROR.
-	 * @param The error message (can be empty, but not null)
-	 */	
-	public void setError(String errorMessage) {
-		Assert.isNotNull(errorMessage);
-		fStatusMessage= errorMessage;
-		fSeverity= IStatus.ERROR;
-	}
-
-	/**
-	 * Sets the status to WARNING.
-	 * @param The warning message (can be empty, but not null)
-	 */		
-	public void setWarning(String warningMessage) {
-		Assert.isNotNull(warningMessage);
-		fStatusMessage= warningMessage;
-		fSeverity= IStatus.WARNING;
-	}
-
-	/**
-	 * Sets the status to INFO.
-	 * @param The info message (can be empty, but not null)
-	 */		
-	public void setInfo(String infoMessage) {
-		Assert.isNotNull(infoMessage);
-		fStatusMessage= infoMessage;
-		fSeverity= IStatus.INFO;
-	}	
-
-	/**
-	 * Sets the status to OK.
-	 */		
-	public void setOK() {
-		fStatusMessage= null;
-		fSeverity= IStatus.OK;
-	}
-	
-	/*
-	 * @see IStatus#matches(int)
-	 */
-	public boolean matches(int severityMask) {
-		return (fSeverity & severityMask) != 0;
-	}
-
-	/**
-	 * Returns always <code>false</code>.
-	 * @see IStatus#isMultiStatus()
-	 */
-	public boolean isMultiStatus() {
-		return false;
-	}
-
-	/*
-	 * @see IStatus#getSeverity()
-	 */
-	public int getSeverity() {
-		return fSeverity;
-	}
-
-	/*
-	 * @see IStatus#getPlugin()
-	 */
-	public String getPlugin() {
-		return JUnitPlugin.PLUGIN_ID;
-	}
-
-	/**
-	 * Returns always <code>null</code>.
-	 * @see IStatus#getException()
-	 */
-	public Throwable getException() {
-		return null;
-	}
-
-	/**
-	 * Returns always the error severity.
-	 * @see IStatus#getCode()
-	 */
-	public int getCode() {
-		return fSeverity;
-	}
-
-	/**
-	 * Returns always <code>null</code>.
-	 * @see IStatus#getChildren()
-	 */
-	public IStatus[] getChildren() {
-		return new IStatus[0];
-	}	
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/JUnitStubUtility.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/JUnitStubUtility.java
deleted file mode 100644
index d7f8f4b..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/JUnitStubUtility.java
+++ /dev/null
@@ -1,296 +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.jdt.internal.junit.util;
-
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.ICodeFormatter;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.core.ToolFactory;
-import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.ui.wizards.NewTypeWizardPage.ImportsManager;
-import org.eclipse.swt.SWT;
-
-/**
- * Utility methods for code generation.
- * TODO: some methods are duplicated from org.eclipse.jdt.ui
- */
-public class JUnitStubUtility {
-
-	public static class GenStubSettings extends CodeGenerationSettings {
-	
-		public boolean fCallSuper;
-		public boolean fMethodOverwrites;
-		public boolean fNoBody;
-		
-		public GenStubSettings(CodeGenerationSettings settings) {
-			this.createComments= settings.createComments;
-		}
-	}
-
-	/**
-	 * Examines a string and returns the first line delimiter found.
-	 */
-	public static String getLineDelimiterUsed(IJavaElement elem) {
-		try {
-			ICompilationUnit cu= (ICompilationUnit) elem.getAncestor(IJavaElement.COMPILATION_UNIT);
-			if (cu != null && cu.exists()) {
-				IBuffer buf= cu.getBuffer();
-				int length= buf.getLength();
-				for (int i= 0; i < length; i++) {
-					char ch= buf.getChar(i);
-					if (ch == SWT.CR) {
-						if (i + 1 < length) {
-							if (buf.getChar(i + 1) == SWT.LF) {
-								return "\r\n"; //$NON-NLS-1$
-							}
-						}
-						return "\r"; //$NON-NLS-1$
-					} else if (ch == SWT.LF) {
-						return "\n"; //$NON-NLS-1$
-					}
-				}
-			}
-			return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		} catch (JavaModelException e) {
-			return System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-	
-	public static String codeFormat(String sourceString, int initialIndentationLevel, String lineDelim) {
-		ICodeFormatter formatter= ToolFactory.createDefaultCodeFormatter(null);
-		return formatter.format(sourceString, initialIndentationLevel, null, lineDelim);
-	}
-
-	/**
-	 * Generates a stub. Given a template method, a stub with the same signature
-	 * will be constructed so it can be added to a type.
-	 * @param destTypeName The name of the type to which the method will be added to (Used for the constructor)
-	 * @param method A method template (method belongs to different type than the parent)
-	 * @param options Options as defined abouve (GENSTUB_*)
-	 * @param imports Imports required by the sub are added to the imports structure
-	 * @throws JavaModelException
-	 */
-	public static String genStub(String destTypeName, IMethod method, GenStubSettings settings, ImportsManager imports) throws JavaModelException {
-		IType declaringtype= method.getDeclaringType();	
-		StringBuffer buf= new StringBuffer();
-		String[] paramTypes= method.getParameterTypes();
-		String[] paramNames= method.getParameterNames();
-		String[] excTypes= method.getExceptionTypes();
-		String retTypeSig= method.getReturnType();
-		
-		int lastParam= paramTypes.length -1;		
-		
-		if (settings.createComments) {
-			if (method.isConstructor()) {
-				String desc= "Constructor for " + destTypeName; //$NON-NLS-1$
-				genJavaDocStub(desc, paramNames, Signature.SIG_VOID, excTypes, buf);
-			} else {			
-				// java doc
-				if (settings.fMethodOverwrites) {
-					boolean isDeprecated= Flags.isDeprecated(method.getFlags());
-					genJavaDocSeeTag(declaringtype.getElementName(), method.getElementName(), paramTypes, settings.createNonJavadocComments, isDeprecated, buf);
-				} else {
-					// generate a default java doc comment
-					String desc= "Method " + method.getElementName(); //$NON-NLS-1$
-					genJavaDocStub(desc, paramNames, retTypeSig, excTypes, buf);
-				}
-			}
-		}
-		int flags= method.getFlags();
-		if (Flags.isPublic(flags) || (declaringtype.isInterface() && !settings.fNoBody)) {
-			buf.append("public "); //$NON-NLS-1$
-		} else if (Flags.isProtected(flags)) {
-			buf.append("protected "); //$NON-NLS-1$
-		} else if (Flags.isPrivate(flags)) {
-			buf.append("private "); //$NON-NLS-1$
-		}
-		if (Flags.isSynchronized(flags)) {
-			buf.append("synchronized "); //$NON-NLS-1$
-		}		
-		if (Flags.isVolatile(flags)) {
-			buf.append("volatile "); //$NON-NLS-1$
-		}
-		if (Flags.isStrictfp(flags)) {
-			buf.append("strictfp "); //$NON-NLS-1$
-		}
-		if (Flags.isStatic(flags)) {
-			buf.append("static "); //$NON-NLS-1$
-		}		
-			
-		if (method.isConstructor()) {
-			buf.append(destTypeName);
-		} else {
-			String retTypeFrm= Signature.toString(retTypeSig);
-			if (!isBuiltInType(retTypeSig)) {
-				resolveAndAdd(retTypeSig, declaringtype, imports);
-			}
-			buf.append(Signature.getSimpleName(retTypeFrm));
-			buf.append(' ');
-			buf.append(method.getElementName());
-		}
-		buf.append('(');
-		for (int i= 0; i <= lastParam; i++) {
-			String paramTypeSig= paramTypes[i];
-			String paramTypeFrm= Signature.toString(paramTypeSig);
-			if (!isBuiltInType(paramTypeSig)) {
-				resolveAndAdd(paramTypeSig, declaringtype, imports);
-			}
-			buf.append(Signature.getSimpleName(paramTypeFrm));
-			buf.append(' ');
-			buf.append(paramNames[i]);
-			if (i < lastParam) {
-				buf.append(", "); //$NON-NLS-1$
-			}
-		}
-		buf.append(')');
-		
-		int lastExc= excTypes.length - 1;
-		if (lastExc >= 0) {
-			buf.append(" throws "); //$NON-NLS-1$
-			for (int i= 0; i <= lastExc; i++) {
-				String excTypeSig= excTypes[i];
-				String excTypeFrm= Signature.toString(excTypeSig);
-				resolveAndAdd(excTypeSig, declaringtype, imports);
-				buf.append(Signature.getSimpleName(excTypeFrm));
-				if (i < lastExc) {
-					buf.append(", "); //$NON-NLS-1$
-				}
-			}
-		}
-		if (settings.fNoBody) {
-			buf.append(";\n\n"); //$NON-NLS-1$
-		} else {
-			buf.append(" {\n\t"); //$NON-NLS-1$
-			if (!settings.fCallSuper) {
-				if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) {
-					buf.append('\t');
-					if (!isBuiltInType(retTypeSig) || Signature.getArrayCount(retTypeSig) > 0) {
-						buf.append("return null;\n\t"); //$NON-NLS-1$
-					} else if (retTypeSig.equals(Signature.SIG_BOOLEAN)) {
-						buf.append("return false;\n\t"); //$NON-NLS-1$
-					} else {
-						buf.append("return 0;\n\t"); //$NON-NLS-1$
-					}
-				}
-			} else {
-				buf.append('\t');
-				if (!method.isConstructor()) {
-					if (!Signature.SIG_VOID.equals(retTypeSig)) {
-						buf.append("return "); //$NON-NLS-1$
-					}
-					buf.append("super."); //$NON-NLS-1$
-					buf.append(method.getElementName());
-				} else {
-					buf.append("super"); //$NON-NLS-1$
-				}
-				buf.append('(');			
-				for (int i= 0; i <= lastParam; i++) {
-					buf.append(paramNames[i]);
-					if (i < lastParam) {
-						buf.append(", "); //$NON-NLS-1$
-					}
-				}
-				buf.append(");\n\t"); //$NON-NLS-1$
-			}
-			buf.append("}\n\n");			 //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-
-	/**
-	 * Generates a default JavaDoc comment stub for a method.
-	 */
-	private static void genJavaDocStub(String descr, String[] paramNames, String retTypeSig, String[] excTypeSigs, StringBuffer buf) {
-		buf.append("/**\n"); //$NON-NLS-1$
-		buf.append(" * "); buf.append(descr); buf.append(".\n"); //$NON-NLS-2$ //$NON-NLS-1$
-		for (int i= 0; i < paramNames.length; i++) {
-			buf.append(" * @param "); buf.append(paramNames[i]); buf.append('\n'); //$NON-NLS-1$
-		}
-		if (retTypeSig != null && !retTypeSig.equals(Signature.SIG_VOID)) {
-			String simpleName= Signature.getSimpleName(Signature.toString(retTypeSig));
-			buf.append(" * @return "); buf.append(simpleName); buf.append('\n'); //$NON-NLS-1$
-		}
-		for (int i= 0; i < excTypeSigs.length; i++) {
-			String simpleName= Signature.getSimpleName(Signature.toString(excTypeSigs[i]));
-			buf.append(" * @throws "); buf.append(simpleName); buf.append('\n'); //$NON-NLS-1$
-		}		
-		buf.append(" */\n"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Generates a '@see' tag to the defined method.
-	 */
-	public static void genJavaDocSeeTag(String declaringTypeName, String methodName, String[] paramTypes, boolean nonJavaDocComment, boolean isDeprecated, StringBuffer buf) {
-		// create a @see link
-		buf.append("/*"); //$NON-NLS-1$
-		if (!nonJavaDocComment) {
-			buf.append('*');
-		}
-		buf.append("\n * @see "); //$NON-NLS-1$
-		buf.append(declaringTypeName);
-		buf.append('#'); 
-		buf.append(methodName);
-		buf.append('(');
-		for (int i= 0; i < paramTypes.length; i++) {
-			if (i > 0) {
-				buf.append(", "); //$NON-NLS-1$
-			}
-			buf.append(Signature.getSimpleName(Signature.toString(paramTypes[i])));
-		}
-		buf.append(")\n"); //$NON-NLS-1$
-		if (isDeprecated) {
-			buf.append(" * @deprecated\n"); //$NON-NLS-1$
-		}
-		buf.append(" */\n"); //$NON-NLS-1$
-	}	
-
-	private static boolean isBuiltInType(String typeName) {
-		char first= Signature.getElementType(typeName).charAt(0);
-		return (first != Signature.C_RESOLVED && first != Signature.C_UNRESOLVED);
-	}
-
-	private static void resolveAndAdd(String refTypeSig, IType declaringType, ImportsManager imports) throws JavaModelException {
-		String resolvedTypeName= JavaModelUtil.getResolvedTypeName(refTypeSig, declaringType);
-		if (resolvedTypeName != null) {
-			imports.addImport(resolvedTypeName);		
-		}
-	}
-	
-	public static String getTodoTaskTag(IJavaProject project) {
-		String markers= null;
-		if (project == null) {
-			markers= JavaCore.getOption(JavaCore.COMPILER_TASK_TAGS);
-		} else {
-			markers= project.getOption(JavaCore.COMPILER_TASK_TAGS, true);
-		}
-		
-		if (markers != null && markers.length() > 0) {
-			int idx= markers.indexOf(',');
-			if (idx == -1) {
-				return markers;
-			} else {
-				return markers.substring(0, idx);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/LayoutUtil.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/LayoutUtil.java
deleted file mode 100644
index ea31e05..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/LayoutUtil.java
+++ /dev/null
@@ -1,143 +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.jdt.internal.junit.util;
-
-import org.eclipse.jdt.internal.junit.wizards.MethodStubsSelectionButtonGroup;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-
-public class LayoutUtil {
-	
-	/**
-	 * Calculates the number of columns needed by field editors
-	 */
-	public static int getNumberOfColumns(MethodStubsSelectionButtonGroup[] editors) {
-		int columnCount= 0;
-		for (int i= 0; i < editors.length; i++) {
-			columnCount= Math.max(editors[i].getNumberOfControls(), columnCount);
-		}
-		return columnCount;
-	}
-	
-	/**
-	 * Creates a composite and fills in the given editors.
-	 * @param labelOnTop Defines if the label of all fields should be on top of the fields
-	 */	
-	public static void doDefaultLayout(Composite parent, MethodStubsSelectionButtonGroup[] editors, boolean labelOnTop) {
-		doDefaultLayout(parent, editors, labelOnTop, 0, 0, 0, 0);
-	}
-
-	/**
-	 * Creates a composite and fills in the given editors.
-	 * @param labelOnTop Defines if the label of all fields should be on top of the fields
-	 * @param minWidth The minimal width of the composite
-	 * @param minHeight The minimal height of the composite 
-	 */
-	public static void doDefaultLayout(Composite parent, MethodStubsSelectionButtonGroup[] editors, boolean labelOnTop, int minWidth, int minHeight) {
-		doDefaultLayout(parent, editors, labelOnTop, minWidth, minHeight, 0, 0);
-	}
-
-	/**
-	 * Creates a composite and fills in the given editors.
-	 * @param labelOnTop Defines if the label of all fields should be on top of the fields
-	 * @param minWidth The minimal width of the composite
-	 * @param minHeight The minimal height of the composite
-	 * @param marginWidth The margin width to be used by the composite
-	 * @param marginHeight The margin height to be used by the composite
-	 */	
-	public static void doDefaultLayout(Composite parent, MethodStubsSelectionButtonGroup[] editors, boolean labelOnTop, int minWidth, int minHeight, int marginWidth, int marginHeight) {
-		int nCulumns= getNumberOfColumns(editors);
-		Control[][] controls= new Control[editors.length][];
-		for (int i= 0; i < editors.length; i++) {
-			controls[i]= editors[i].doFillIntoGrid(parent, nCulumns);
-		}
-		if (labelOnTop) {
-			nCulumns--;
-			modifyLabelSpans(controls, nCulumns);
-		}
-		GridLayout layout= new GridLayout();
-		if (marginWidth != SWT.DEFAULT) {
-			layout.marginWidth= marginWidth;
-		}
-		if (marginHeight != SWT.DEFAULT) {
-			layout.marginHeight= marginHeight;
-		}
-//		layout.minimumWidth= minWidth;
-//		layout.minimumHeight= minHeight;
-		layout.numColumns= nCulumns;		
-		parent.setLayout(layout);
-	}
-	
-	private static void modifyLabelSpans(Control[][] controls, int nCulumns) {
-		for (int i= 0; i < controls.length; i++) {
-			setHorizontalSpan(controls[i][0], nCulumns);
-		}
-	}
-	
-	/**
-	 * Sets the span of a control. Assumes that MGridData is used.
-	 */
-	public static void setHorizontalSpan(Control control, int span) {
-		Object ld= control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData)ld).horizontalSpan= span;
-		} else if (span != 1) {
-			GridData gd= new GridData();
-			gd.horizontalSpan= span;
-			control.setLayoutData(gd);
-		}
-	}	
-
-	/**
-	 * Sets the width hint of a control. Assumes that MGridData is used.
-	 */
-	public static void setWidthHint(Control control, int widthHint) {
-		Object ld= control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData)ld).widthHint= widthHint;
-		}
-	}
-	
-	/**
-	 * Sets the horizontal indent of a control. Assumes that MGridData is used.
-	 */
-	public static void setHorizontalIndent(Control control, int horizontalIndent) {
-		Object ld= control.getLayoutData();
-		if (ld instanceof GridData) {
-			((GridData)ld).horizontalIndent= horizontalIndent;
-		}
-	}
-
-	/**
-	 * Creates a spacer control with the given span.
-	 * The composite is assumed to have <code>MGridLayout</code> as
-	 * layout.
-	 * @param parent The parent composite
-	 */			
-	public static Control createEmptySpace(Composite parent, int span) {
-		Label label= new Label(parent, SWT.LEFT);
-		GridData gd= new GridData();
-		gd.horizontalAlignment= GridData.BEGINNING;
-		gd.grabExcessHorizontalSpace= false;
-		gd.horizontalSpan= span;
-		gd.horizontalIndent= 0;
-		gd.widthHint= 0;
-		gd.heightHint= 0;
-		label.setLayoutData(gd);
-		return label;
-	}
-	
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/PixelConverter.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/PixelConverter.java
deleted file mode 100644
index 5a9d3b2..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/PixelConverter.java
+++ /dev/null
@@ -1,61 +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.jdt.internal.junit.util;
-
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.dialogs.Dialog;
-
-/*
- * class copied from jdt ui
- */
-public class PixelConverter {
-	
-	private FontMetrics fFontMetrics;
-	
-	public PixelConverter(Control control) {
-		GC gc = new GC(control);
-		gc.setFont(control.getFont());
-		fFontMetrics= gc.getFontMetrics();
-		gc.dispose();
-	}
-	
-	/**
-	 * @see DialogPage#convertHeightInCharsToPixels
-	 */
-	public int convertHeightInCharsToPixels(int chars) {
-		return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
-	}
-
-	/**
-	 * @see DialogPage#convertHorizontalDLUsToPixels
-	 */
-	public int convertHorizontalDLUsToPixels(int dlus) {
-		return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus);
-	}
-
-	/**
-	 * @see DialogPage#convertVerticalDLUsToPixels
-	 */
-	public int convertVerticalDLUsToPixels(int dlus) {
-		return Dialog.convertVerticalDLUsToPixels(fFontMetrics, dlus);
-	}
-	
-	/**
-	 * @see DialogPage#convertWidthInCharsToPixels
-	 */
-	public int convertWidthInCharsToPixels(int chars) {
-		return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
-	}	
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/Resources.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/Resources.java
deleted file mode 100644
index 6826f49..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/Resources.java
+++ /dev/null
@@ -1,187 +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.jdt.internal.junit.util;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceStatus;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitMessages;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-
-
-public class Resources {
-
-	private Resources() {
-	}
-
-	/**
-	 * Checks if the given resource is in sync with the underlying file system.
-	 * 
-	 * @param resource the resource to be checked
-	 * @return IStatus status describing the check's result. If <code>status.
-	 * isOK()</code> returns <code>true</code> then the resource is in sync
-	 */
-	public static IStatus checkInSync(IResource resource) {
-		return checkInSync(new IResource[] {resource});
-	}
-	
-	/**
-	 * Checks if the given resources are in sync with the underlying file
-	 * system.
-	 * 
-	 * @param resources the resources to be checked
-	 * @return IStatus status describing the check's result. If <code>status.
-	 *  isOK() </code> returns <code>true</code> then the resources are in sync
-	 */
-	public static IStatus checkInSync(IResource[] resources) {
-		IStatus result= null;
-		for (int i= 0; i < resources.length; i++) {
-			IResource resource= resources[i];
-			if (!resource.isSynchronized(IResource.DEPTH_INFINITE)) {
-				result= addOutOfSync(result, resource);
-			}			
-		}
-		if (result != null)
-			return result;
-		return new Status(IStatus.OK, JUnitPlugin.getPluginId(), IStatus.OK, "", null); //$NON-NLS-1$		
-	}
-
-	/**
-	 * Makes the given resource committable. Committable means that it is
-	 * writeable and that its content hasn't changed by calling
-	 * <code>validateEdit</code> for the given resource on <tt>IWorkspace</tt>.
-	 * 
-	 * @param resource the resource to be checked
-	 * @param context the context passed to <code>validateEdit</code> 
-	 * @return IStatus status describing the method's result. If <code>status.
-	 * isOK()</code> returns <code>true</code> then the resource are committable
-	 * 
-	 * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.
-	 * resources.IFile[], java.lang.Object)
-	 */
-	public static IStatus makeCommittable(IResource resource, Object context) {
-		return makeCommittable(new IResource[] { resource }, context);
-	}
-	
-	/**
-	 * Makes the given resources committable. Committable means that all
-	 * resources are writeable and that the content of the resources hasn't
-	 * changed by calling <code>validateEdit</code> for a given file on
-	 * <tt>IWorkspace</tt>.
-	 * 
-	 * @param resources the resources to be checked
-	 * @param context the context passed to <code>validateEdit</code> 
-	 * @return IStatus status describing the method's result. If <code>status.
-	 * isOK()</code> returns <code>true</code> then the add resources are
-	 * committable
-	 * 
-	 * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object)
-	 */
-	public static IStatus makeCommittable(IResource[] resources, Object context) {
-		List readOnlyFiles= new ArrayList();
-		for (int i= 0; i < resources.length; i++) {
-			IResource resource= resources[i];
-			if (resource.getType() == IResource.FILE && resource.isReadOnly())	
-				readOnlyFiles.add(resource);
-		}
-		if (readOnlyFiles.size() == 0)
-			return new Status(IStatus.OK, JUnitPlugin.getPluginId(), IStatus.OK, "", null); //$NON-NLS-1$
-			
-		Map oldTimeStamps= createModificationStampMap(readOnlyFiles);
-		IStatus status= ResourcesPlugin.getWorkspace().validateEdit(
-			(IFile[]) readOnlyFiles.toArray(new IFile[readOnlyFiles.size()]), context);
-		if (!status.isOK())
-			return status;
-			
-		IStatus modified= null;
-		Map newTimeStamps= createModificationStampMap(readOnlyFiles);
-		for (Iterator iter= oldTimeStamps.keySet().iterator(); iter.hasNext();) {
-			IFile file= (IFile) iter.next();
-			if (!oldTimeStamps.get(file).equals(newTimeStamps.get(file)))
-				modified= addModified(modified, file);
-		}
-		if (modified != null)	
-			return modified;
-		return new Status(IStatus.OK, JUnitPlugin.getPluginId(), IStatus.OK, "", null); //$NON-NLS-1$
-	}
-
-	private static Map createModificationStampMap(List files){
-		Map map= new HashMap();
-		for (Iterator iter= files.iterator(); iter.hasNext(); ) {
-			IFile file= (IFile)iter.next();
-			map.put(file, new Long(file.getModificationStamp()));
-		}
-		return map;
-	}
-	
-	private static IStatus addModified(IStatus status, IFile file) {
-		IStatus entry= JUnitStatus.createError(JUnitMessages.getFormattedString("Resources.fileModified", file.getFullPath().toString())); //$NON-NLS-1$ 
-		if (status == null) {
-			return entry;
-		} else if (status.isMultiStatus()) {
-			((MultiStatus)status).add(entry);
-			return status;
-		} else {
-			MultiStatus result= new MultiStatus(JUnitPlugin.getPluginId(),
-				IJUnitStatusConstants.VALIDATE_EDIT_CHANGED_CONTENT,
-			JUnitMessages.getString("Resources.modifiedResources"), null); //$NON-NLS-1$ 
-			result.add(status);
-			result.add(entry);
-			return result;
-		}
-	}	
-
-	private static IStatus addOutOfSync(IStatus status, IResource resource) {
-		IStatus entry= new Status(
-			IStatus.ERROR,
-			ResourcesPlugin.getPlugin().getDescriptor().getUniqueIdentifier(),
-			IResourceStatus.OUT_OF_SYNC_LOCAL,
-		JUnitMessages.getFormattedString("Resources.outOfSync", resource.getFullPath().toString()), //$NON-NLS-1$ 
-			null);
-		if (status == null) {
-			return entry;
-		} else if (status.isMultiStatus()) {
-			((MultiStatus)status).add(entry);
-			return status;
-		} else {
-			MultiStatus result= new MultiStatus(
-				ResourcesPlugin.getPlugin().getDescriptor().getUniqueIdentifier(),
-				IResourceStatus.OUT_OF_SYNC_LOCAL,
-			JUnitMessages.getString("Resources.outOfSyncResources"), null); //$NON-NLS-1$ 
-			result.add(status);
-			result.add(entry);
-			return result;
-		}
-	}
-
-	public static String[] getLocationOSStrings(IResource[] resources) {
-		List result= new ArrayList(resources.length);
-		for (int i= 0; i < resources.length; i++) {
-			IPath location= resources[i].getLocation();
-			if (location != null)
-				result.add(location.toOSString());
-		}
-		return (String[]) result.toArray(new String[result.size()]);
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/SWTUtil.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/SWTUtil.java
deleted file mode 100644
index 424af65..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/SWTUtil.java
+++ /dev/null
@@ -1,113 +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.jdt.internal.junit.util;
-
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DragSource;
-import org.eclipse.swt.dnd.DropTarget;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.ScrollBar;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.util.Assert;
-
-/**
- * Utility class to simplify access to some SWT resources. 
- * (copied from jdt ui)
- */
-public class SWTUtil {
-	private SWTUtil(){}
-	/**
-	 * Returns the standard display to be used. The method first checks, if
-	 * the thread calling this method has an associated disaply. If so, this
-	 * display is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display= Display.getCurrent();
-		if (display == null)
-			display= Display.getDefault();
-		return display;		
-	}
-	
-	/**
-	 * Returns the shell for the given widget. If the widget doesn't represent
-	 * a SWT object that manage a shell, <code>null</code> is returned.
-	 * 
-	 * @return the shell for the given widget
-	 */
-	public static Shell getShell(Widget widget) {
-		if (widget instanceof Control)
-			return ((Control)widget).getShell();
-		if (widget instanceof Caret)
-			return ((Caret)widget).getParent().getShell();
-		if (widget instanceof DragSource)
-			return ((DragSource)widget).getControl().getShell();
-		if (widget instanceof DropTarget)
-			return ((DropTarget)widget).getControl().getShell();
-		if (widget instanceof Menu)
-			return ((Menu)widget).getParent().getShell();
-		if (widget instanceof ScrollBar)
-			return ((ScrollBar)widget).getParent().getShell();
-							
-		return null;	
-	}
-
-
-	/**
-	 * Returns a width hint for a button control.
-	 */
-	public static int getButtonWidthHint(Button button) {
-		if (button.getFont().equals(JFaceResources.getDefaultFont()))
-			button.setFont(JFaceResources.getDialogFont());
-		PixelConverter converter= new PixelConverter(button);
-		int widthHint= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-	}
-
-	/**
-	 * Returns a height hint for a button control.
-	 */		
-	public static int getButtonHeigthHint(Button button) {
-		if (button.getFont().equals(JFaceResources.getDefaultFont()))
-			button.setFont(JFaceResources.getDialogFont());
-		PixelConverter converter= new PixelConverter(button);
-		return converter.convertVerticalDLUsToPixels(IDialogConstants.BUTTON_HEIGHT);
-	}	
-
-	
-	/**
-	 * Sets width and height hint for the button control.
-	 * <b>Note:</b> This is a NOP if the button's layout data is not
-	 * an instance of <code>GridData</code>.
-	 * 
-	 * @param	the button for which to set the dimension hint
-	 */		
-	public static void setButtonDimensionHint(Button button) {
-		Assert.isNotNull(button);
-		Object gd= button.getLayoutData();
-		if (gd instanceof GridData) {
-			((GridData)gd).heightHint= getButtonHeigthHint(button);
-			((GridData)gd).widthHint= getButtonWidthHint(button);		 
-		}
-	}		
-	
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/TestSearchEngine.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/TestSearchEngine.java
deleted file mode 100644
index cab1ecb..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/util/TestSearchEngine.java
+++ /dev/null
@@ -1,222 +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.jdt.internal.junit.util;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-import org.eclipse.jface.operation.IRunnableContext;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import org.eclipse.ui.IFileEditorInput;
-
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.ISourceReference;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchResultCollector;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.ISearchPattern;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitMessages;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-
-/**
- * Custom Search engine for suite() methods
- */
-public class TestSearchEngine {
-
-	private class JUnitSearchResultCollector implements IJavaSearchResultCollector {
-		IProgressMonitor fProgressMonitor;
-		List fList;
-		Set fFailed= new HashSet();
-		Set fMatches= new HashSet();
-		
-		public JUnitSearchResultCollector(List list, IProgressMonitor progressMonitor) {
-			fProgressMonitor= progressMonitor;
-			fList= list;
-		}
-		
-		public void accept(IResource resource, int start, int end, IJavaElement enclosingElement, int accuracy) throws JavaModelException{
-			if (!(enclosingElement instanceof IMethod)) 
-				return;
-			
-			IMethod method= (IMethod)enclosingElement;		
-			
-			IType declaringType= method.getDeclaringType();
-			if (fMatches.contains(declaringType) || fFailed.contains(declaringType))
-				return;
-			if (!hasSuiteMethod(declaringType) && !isTestType(declaringType)) {
-				fFailed.add(declaringType);
-				return;
-			}
-			fMatches.add(declaringType);
-		}
-		
-		public IProgressMonitor getProgressMonitor() {
-			return fProgressMonitor;
-		}
-				
-		public void aboutToStart() {
-		}
-		
-		public void done() {
-			fList.addAll(fMatches);
-		}
-	}
-	
-	private List searchMethod(IProgressMonitor pm, final IJavaSearchScope scope) throws JavaModelException {
-		final List typesFound= new ArrayList(200);	
-		searchMethod(typesFound, scope, pm);
-		return typesFound;	
-	}
-
-	private List searchMethod(final List v, IJavaSearchScope scope, final IProgressMonitor progressMonitor) throws JavaModelException {		
-		IJavaSearchResultCollector collector= new JUnitSearchResultCollector(v, progressMonitor);
-		ISearchPattern suitePattern= SearchEngine.createSearchPattern("suite() Test", IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, true); //$NON-NLS-1$
-		ISearchPattern testPattern= SearchEngine.createSearchPattern("test*() void", IJavaSearchConstants.METHOD , IJavaSearchConstants.DECLARATIONS, true); //$NON-NLS-1$
-		SearchEngine engine= new SearchEngine();
-		engine.search(ResourcesPlugin.getWorkspace(), SearchEngine.createOrSearchPattern(suitePattern, testPattern), scope, collector); 
-		return v;
-	}
-	
-	public static IType[] findTests(IRunnableContext context, final Object[] elements) throws InvocationTargetException, InterruptedException{
-		final Set result= new HashSet();
-	
-		if (elements.length > 0) {
-			IRunnableWithProgress runnable= new IRunnableWithProgress() {
-				public void run(IProgressMonitor pm) throws InterruptedException {
-					doFindTests(elements, result, pm);
-				}
-			};
-			context.run(true, true, runnable);			
-		}
-		return (IType[]) result.toArray(new IType[result.size()]) ;
-	}
-
-	public static void doFindTests(Object[] elements, Set result, IProgressMonitor pm) throws InterruptedException {
-		int nElements= elements.length;
-		pm.beginTask(JUnitMessages.getString("TestSearchEngine.message.searching"), nElements);  //$NON-NLS-1$
-		try {
-			for (int i= 0; i < nElements; i++) {
-				try {
-					collectTypes(elements[i], new SubProgressMonitor(pm, 1), result);
-				} catch (JavaModelException e) {
-					JUnitPlugin.log(e.getStatus());
-				}
-				if (pm.isCanceled()) {
-					throw new InterruptedException();
-				}
-			}
-		} finally {
-			pm.done();
-		}
-	}
-
-	private static void collectTypes(Object element, IProgressMonitor pm, Set result) throws JavaModelException/*, InvocationTargetException*/ {
-		element= computeScope(element);
-		while((element instanceof IJavaElement) && !(element instanceof ICompilationUnit) && (element instanceof ISourceReference)) {
-			if(element instanceof IType) {
-				if (hasSuiteMethod((IType)element) || isTestType((IType)element)) {
-					result.add(element);
-					return;
-				}
-			}
-			element= ((IJavaElement)element).getParent();
-		}
-		if (element instanceof ICompilationUnit) {
-			ICompilationUnit cu= (ICompilationUnit)element;
-			IType[] types= cu.getAllTypes();
-			for (int i= 0; i < types.length; i++) {
-				if (hasSuiteMethod(types[i])  || isTestType(types[i]))
-					result.add(types[i]);
-			}
-		} 
-		else if (element instanceof IJavaElement) {
-			List found= searchSuiteMethods(pm, (IJavaElement)element);
-			result.addAll(found);
-		}
-	}
-
-	private static Object computeScope(Object element) throws JavaModelException {
-		if (element instanceof IFileEditorInput)
-			element= ((IFileEditorInput)element).getFile();
-		if (element instanceof IResource)
-			element= JavaCore.create((IResource)element);
-		if (element instanceof IClassFile) {
-			IClassFile cf= (IClassFile)element;
-			element= cf.getType();
-		}
-		return element;
-	}
-	
-	private static List searchSuiteMethods(IProgressMonitor pm, IJavaElement element) throws JavaModelException {	
-		IJavaSearchScope scope= SearchEngine.createJavaSearchScope(new IJavaElement[] { element });
-		TestSearchEngine searchEngine= new TestSearchEngine(); 
-		return searchEngine.searchMethod(pm, scope);
-	}
-		
-	public static boolean hasSuiteMethod(IType type) throws JavaModelException {
-		IMethod method= type.getMethod("suite", new String[0]); //$NON-NLS-1$
-		if (method == null || !method.exists()) 
-			return false;
-		
-		if (!Flags.isStatic(method.getFlags()) ||	
-			!Flags.isPublic(method.getFlags()) ||			
-			!Flags.isPublic(method.getDeclaringType().getFlags())) { 
-			return false;
-		}
-		return true;
-	}
-	
-	private static boolean isTestType(IType type) throws JavaModelException {
-		if (Flags.isAbstract(type.getFlags())) 
-			return false;
-		if (!Flags.isPublic(type.getFlags())) 
-			return false;
-		
-		IType[] interfaces= type.newSupertypeHierarchy(null).getAllSuperInterfaces(type);
-		for (int i= 0; i < interfaces.length; i++)
-			if(interfaces[i].getFullyQualifiedName().equals(JUnitPlugin.TEST_INTERFACE_NAME))
-				return true;
-		return false;
-	}
-
-	public static boolean isTestImplementor(IType type) throws JavaModelException {
-		ITypeHierarchy typeHier= type.newSupertypeHierarchy(null);
-		IType[] superInterfaces= typeHier.getAllInterfaces();
-		for (int i= 0; i < superInterfaces.length; i++) {
-			if (superInterfaces[i].getFullyQualifiedName().equals(JUnitPlugin.TEST_INTERFACE_NAME))
-				return true;
-		}
-		return false;
-	}
-
-	public static boolean isTestOrTestSuite(IType type) throws JavaModelException {
-		return hasSuiteMethod(type) || isTestType(type);
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/JUnitWizard.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/JUnitWizard.java
deleted file mode 100644
index 009120f..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/JUnitWizard.java
+++ /dev/null
@@ -1,119 +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.jdt.internal.junit.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.junit.util.ExceptionHandler;
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-/**
- * The wizard base class for JUnit creation wizards.
- */
-public abstract class JUnitWizard extends Wizard implements INewWizard {
-
-	private IWorkbench fWorkbench;
-	protected static String DIALOG_SETTINGS_KEY= "JUnitWizards"; //$NON-NLS-1$
-	private IStructuredSelection fSelection;
-
-	public JUnitWizard() {
-		setNeedsProgressMonitor(true);
-		initializeDefaultPageImageDescriptor();
-	}
-	
-	/*
-	 * @see IWizard#performFinish()
-	 */
-	public abstract boolean performFinish();
-
-	/**
-	 * Run a runnable
-	 */	
-	protected boolean finishPage(IRunnableWithProgress runnable) {
-		IRunnableWithProgress op= new WorkspaceModifyDelegatingOperation(runnable);
-		try {
-			getContainer().run(false, true, op);
-		} catch (InvocationTargetException e) {
-			Shell shell= getShell();
-			String title= WizardMessages.getString("NewJUnitWizard.op_error.title"); //$NON-NLS-1$
-			String message= WizardMessages.getString("NewJUnitWizard.op_error.message"); //$NON-NLS-1$
-			ExceptionHandler.handle(e, shell, title, message);
-			return false;
-		} catch  (InterruptedException e) {
-			return false;
-		}
-		return true;
-	}
-
-	protected void openResource(final IResource resource) {
-		if (resource.getType() == IResource.FILE) {
-			final IWorkbenchPage activePage= JUnitPlugin.getActivePage();
-			if (activePage != null) {
-				final Display display= getShell().getDisplay();
-				if (display != null) {
-					display.asyncExec(new Runnable() {
-						public void run() {
-							try {
-								IDE.openEditor(activePage, (IFile)resource, true);
-							} catch (PartInitException e) {
-								JUnitPlugin.log(e);
-							}
-						}
-					});
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection currentSelection) {
-		fWorkbench= workbench;
-		fSelection= currentSelection;
-	}
-	
-	public IStructuredSelection getSelection() {
-		return fSelection;
-	}
-
-	protected void selectAndReveal(IResource newResource) {
-		BasicNewResourceWizard.selectAndReveal(newResource, fWorkbench.getActiveWorkbenchWindow());
-	} 
-	
-	protected void initDialogSettings() {
-		IDialogSettings pluginSettings= JUnitPlugin.getDefault().getDialogSettings();
-		IDialogSettings wizardSettings= pluginSettings.getSection(DIALOG_SETTINGS_KEY);
-		if (wizardSettings == null) {
-			wizardSettings= new DialogSettings(DIALOG_SETTINGS_KEY);
-			pluginSettings.addSection(wizardSettings);
-		}
-		setDialogSettings(wizardSettings);
-	}
-
-	protected abstract void initializeDefaultPageImageDescriptor();
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/MethodStubsSelectionButtonGroup.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/MethodStubsSelectionButtonGroup.java
deleted file mode 100644
index 80bfc9a..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/MethodStubsSelectionButtonGroup.java
+++ /dev/null
@@ -1,481 +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.jdt.internal.junit.wizards;
-
-import org.eclipse.jdt.internal.junit.util.*;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * A group of controls used in the JUnit TestCase and TestSuite wizards
- * for selecting method stubs to create.
- */
-public class MethodStubsSelectionButtonGroup {
-
-	private Label fLabel;
-	protected String fLabelText;
-	
-	private SelectionButtonGroupListener fGroupListener;
-	
-	private boolean fEnabled;
-
-	private Composite fButtonComposite;
-	
-	private Button[] fButtons;
-	private String[] fButtonNames;
-	private boolean[] fButtonsSelected;
-	private boolean[] fButtonsEnabled;
-	private Combo fMainCombo;
-	private boolean fMainComboEnabled;
-	
-	private int fGroupBorderStyle;
-	private int fGroupNumberOfColumns;
-	private int fButtonsStyle;	
-
-	public interface SelectionButtonGroupListener {
-		/**
-		 * The dialog field has changed.
-		 */
-		void groupChanged(MethodStubsSelectionButtonGroup field);
-	}
-		
-	/**
-	 * Creates a group without border.
-	 */
-	public MethodStubsSelectionButtonGroup(int buttonsStyle, String[] buttonNames, int nColumns) {
-		this(buttonsStyle, buttonNames, nColumns, SWT.NONE);		
-	}	
-	
-	/**
-	 * Creates a group with border (label in border).
-	 * Accepted button styles are: SWT.RADIO, SWT.CHECK, SWT.TOGGLE
-	 * For border styles see <code>Group</code>
-	 */	
-	public MethodStubsSelectionButtonGroup(int buttonsStyle, String[] buttonNames, int nColumns, int borderStyle) {
-		fEnabled= true;
-		fLabel= null;
-		fLabelText= ""; //$NON-NLS-1$
-		
-		Assert.isTrue(buttonsStyle == SWT.RADIO || buttonsStyle == SWT.CHECK || buttonsStyle == SWT.TOGGLE);
-		fButtonNames= buttonNames;
-		
-		int nButtons= buttonNames.length;
-		fButtonsSelected= new boolean[nButtons];
-		fButtonsEnabled= new boolean[nButtons];
-		for (int i= 0; i < nButtons; i++) {
-			fButtonsSelected[i]= false;
-			fButtonsEnabled[i]= true;
-		}
-		fMainComboEnabled= true;
-		if (fButtonsStyle == SWT.RADIO) {
-			fButtonsSelected[0]= true;
-		}
-		
-		fGroupBorderStyle= borderStyle;
-		fGroupNumberOfColumns= (nColumns <= 0) ? nButtons : nColumns;
-		
-		fButtonsStyle= buttonsStyle;
-	}
-	
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */
-	public Control[] doFillIntoGrid(Composite parent, int nColumns) {
-		assertEnoughColumns(nColumns);
-				
-		if (fGroupBorderStyle == SWT.NONE) {
-			Label label= getLabelControl(parent);
-			label.setLayoutData(gridDataForLabel(1));
-		
-			Composite buttonsgroup= getSelectionButtonsGroup(parent);
-			GridData gd= new GridData();
-			gd.horizontalSpan= nColumns - 1;
-			buttonsgroup.setLayoutData(gd);
-			return new Control[] { label, buttonsgroup };
-		} else {
-			Composite buttonsgroup= getSelectionButtonsGroup(parent);
-			GridData gd= new GridData();
-			gd.horizontalSpan= nColumns;
-			buttonsgroup.setLayoutData(gd);
-			return new Control[] { buttonsgroup };
-		}
-	}	
-
-	/*
-	 * @see DialogField#doFillIntoGrid
-	 */	
-	public int getNumberOfControls() {
-		return (fGroupBorderStyle == SWT.NONE) ? 2 : 1;
-	}
-	
-	private Button createSelectionButton(int index, Composite group, SelectionListener listener) {
-		Button button= new Button(group, fButtonsStyle | SWT.LEFT);
-		button.setFont(group.getFont());			
-		button.setText(fButtonNames[index]);
-		button.setEnabled(isEnabled() && fButtonsEnabled[index]);
-		button.setSelection(fButtonsSelected[index]);
-		button.addSelectionListener(listener);
-		button.setLayoutData(new GridData());
-		return button;
-	}
-	
-	private Button createMainCombo(int index, Composite group, SelectionListener listener) {
-		Composite buttonComboGroup= new Composite(group, 0);
-
-		GridLayout layout= new GridLayout();
-		layout.marginHeight= 0;
-		layout.marginWidth= 20;
-		layout.numColumns= 2;
-		buttonComboGroup.setLayout(layout);
-		
-		Button button= new Button(buttonComboGroup, fButtonsStyle | SWT.LEFT);
-		button.setFont(group.getFont());			
-		button.setText(fButtonNames[index]);
-		button.setEnabled(isEnabled() && fButtonsEnabled[index]);
-		button.setSelection(fButtonsSelected[index]);
-		button.addSelectionListener(listener);
-		button.setLayoutData(new GridData());
-
-
-		fMainCombo= new Combo(buttonComboGroup, SWT.READ_ONLY);
-		fMainCombo.setItems(new String[] {"text ui","swing ui","awt ui"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		fMainCombo.select(0);
-		fMainCombo.setEnabled(isEnabled() && fMainComboEnabled);
-		fMainCombo.setFont(group.getFont());
-		fMainCombo.setLayoutData(new GridData());
-		return button;
-	}
-
-	public String getMainMethod(String typeName) {
-		StringBuffer main= new StringBuffer("public static void main(String[] args) {"); //$NON-NLS-1$
-		if (isSelected(1)) {
-			main.append("junit."); //$NON-NLS-1$
-			switch (getComboSelection()) {
-				case 0:
-					main.append("textui"); //$NON-NLS-1$
-					break;
-				case 1:
-					main.append("swingui"); //$NON-NLS-1$
-					break;
-				case 2 :
-					main.append("awtui"); //$NON-NLS-1$
-					break;
-				default :
-					main.append("textui"); //$NON-NLS-1$
-					break;
-			}
-			main.append(".TestRunner.run(" + typeName + ".class);"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		main.append("}\n\n"); //$NON-NLS-1$
-		return main.toString();
-	}
-
-	/**
-	 * Returns the group widget. When called the first time, the widget will be created.
-	 * @param The parent composite when called the first time, or <code>null</code>
-	 * after.
-	 */
-	public Composite getSelectionButtonsGroup(Composite parent) {
-		if (fButtonComposite == null) {
-			assertCompositeNotNull(parent);
-			
-			GridLayout layout= new GridLayout();
-			layout.makeColumnsEqualWidth= true;
-			layout.numColumns= fGroupNumberOfColumns;			
-			
-			if (fGroupBorderStyle != SWT.NONE) {
-				Group group= new Group(parent, fGroupBorderStyle);
-				if (fLabelText != null && fLabelText.length() > 0) {
-					group.setText(fLabelText);
-				}
-				fButtonComposite= group;
-			} else {
-				fButtonComposite= new Composite(parent, SWT.NULL);
-				layout.marginHeight= 0;
-				layout.marginWidth= 0;
-			}
-			fButtonComposite.setLayout(layout);
-			
-			SelectionListener listener= new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					doWidgetSelected(e);
-				}
-				public void widgetSelected(SelectionEvent e) {
-					doWidgetSelected(e);
-				}
-			};
-			int nButtons= fButtonNames.length;
-			fButtons= new Button[nButtons];
-
-			fButtons[0]= createSelectionButton(0, fButtonComposite, listener);
-			fButtons[1]= createMainCombo(1, fButtonComposite, listener);
-			for (int i= 2; i < nButtons; i++) {
-				fButtons[i]= createSelectionButton(i, fButtonComposite, listener);
-			}
-			int nRows= nButtons / fGroupNumberOfColumns;
-			int nFillElements= nRows * fGroupNumberOfColumns - nButtons;
-			for (int i= 0; i < nFillElements; i++) {
-				createEmptySpace(fButtonComposite);
-			}
-			setSelectionGroupListener(new SelectionButtonGroupListener() {
-				public void groupChanged(MethodStubsSelectionButtonGroup field) {
-					field.setEnabled(1, isEnabled() && field.isSelected(0));
-				}
-			});			
-		}
-		return fButtonComposite;
-	}
-
-	/**
-	 * Returns a button from the group or <code>null</code> if not yet created.
-	 */	
-	public Button getSelectionButton(int index) {
-		if (index >= 0 && index < fButtons.length) {
-			return fButtons[index];
-		}
-		return null;
-	}
-	
-	private void doWidgetSelected(SelectionEvent e) {
-		Button button= (Button)e.widget;
-		for (int i= 0; i < fButtons.length; i++) {
-			if (fButtons[i] == button) {
-				fButtonsSelected[i]= button.getSelection();
-				dialogFieldChanged();
-				return;
-			}
-		}
-	}	
-	
-	/**
-	 * Returns the selection state of a button contained in the group.
-	 * @param The index of the button
-	 */
-	public boolean isSelected(int index) {
-		if (index >= 0 && index < fButtonsSelected.length) {
-			return fButtonsSelected[index];
-		}
-		return false;
-	}
-	
-	/**
-	 * Sets the selection state of a button contained in the group.
-	 */
-	public void setSelection(int index, boolean selected) {
-		if (index >= 0 && index < fButtonsSelected.length) {
-			if (fButtonsSelected[index] != selected) {
-				fButtonsSelected[index]= selected;
-				if (fButtons != null) {
-					Button button= fButtons[index];
-					if (isOkToUse(button)) {
-						button.setSelection(selected);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns the enabled state of a button contained in the group.
-	 * @param The index of the button
-	 */
-	public boolean isEnabled(int index) {
-		if (index >= 0 && index < fButtonsEnabled.length) {
-			return fButtonsEnabled[index];
-		}
-		return false;
-	}
-	
-	/**
-	 * Sets the selection state of a button contained in the group.
-	 */
-	public void setEnabled(int index, boolean enabled) {
-		if (index >= 0 && index < fButtonsEnabled.length) {
-			if (fButtonsEnabled[index] != enabled) {
-				fButtonsEnabled[index]= enabled;
-				if (index == 1)
-					fMainComboEnabled= enabled;
-				if (fButtons != null) {
-					Button button= fButtons[index];
-					if (isOkToUse(button)) {
-						button.setEnabled(enabled);
-						if (index == 1)
-							fMainCombo.setEnabled(isEnabled() && enabled);
-					}
-				}
-			}
-		}
-	}
-
-	protected void updateEnableState() {
-		if (fLabel != null) {
-			fLabel.setEnabled(fEnabled);
-		}
-		if (fButtons != null) {
-			boolean enabled= isEnabled();
-			for (int i= 0; i < fButtons.length; i++) {
-				Button button= fButtons[i];
-				if (isOkToUse(button)) {
-					button.setEnabled(enabled && fButtonsEnabled[i]);
-				}
-			}
-			fMainCombo.setEnabled(enabled && fMainComboEnabled);
-		}
-	}
-	
-	public int getComboSelection() {
-		return fMainCombo.getSelectionIndex();
-	}
-	
-	public void setComboSelection(int index) {
-		fMainCombo.select(index);
-	}
-
-
-	/**
-	 * Sets the label of the dialog field.
-	 */
-	public void setLabelText(String labeltext) {
-		fLabelText= labeltext;
-	}
-		
-	/**
-	 * Defines the listener for this dialog field.
-	 */	
-	public final void setSelectionGroupListener(SelectionButtonGroupListener listener) {
-		fGroupListener= listener;
-	}
-
-	/**
-	 * Programatical invocation of a dialog field change.
-	 */		
-	public void dialogFieldChanged() {
-		if (fGroupListener != null) {
-			fGroupListener.groupChanged(this);
-		}
-	}	
-	
-	/**
-	 * Tries to set the focus to the dialog field.
-	 * Returns <code>true</code> if the dialog field can take focus.
-	 * 	To be reimplemented by dialog field implementors.
-	 */
-	public boolean setFocus() {
-		return false;
-	}
-
-	/**
-	 * Posts <code>setFocus</code> to the display event queue.
-	 */	
-	public void postSetFocusOnDialogField(Display display) {
-		if (display != null) {
-			display.asyncExec(
-				new Runnable() {
-					public void run() {
-						setFocus();
-					}
-				}
-			);
-		}
-	}		
-	
-	protected static GridData gridDataForLabel(int span) {
-		GridData gd= new GridData();
-		gd.horizontalSpan= span;
-		return gd;
-	}
-	
-	/**
-	 * Creates or returns the created label widget.
-	 * @param parent The parent composite or <code>null</code> if the widget has
-	 * already been created.
-	 */			
-	public Label getLabelControl(Composite parent) {
-		if (fLabel == null) {
-			assertCompositeNotNull(parent);
-			
-			fLabel= new Label(parent, SWT.LEFT | SWT.WRAP);
-			fLabel.setFont(parent.getFont());
-			fLabel.setEnabled(fEnabled);		
-			if (fLabelText != null && !"".equals(fLabelText)) { //$NON-NLS-1$
-				fLabel.setText(fLabelText);
-			} else {
-				// XXX: to avoid a 16 pixel wide empty label - revisit
-				fLabel.setText("."); //$NON-NLS-1$
-				fLabel.setVisible(false);
-			}			
-		}
-		return fLabel;
-	}
-
-	/**
-	 * Creates a spacer control.
-	 * @param parent The parent composite
-	 */		
-	public static Control createEmptySpace(Composite parent) {
-		return createEmptySpace(parent, 1);
-	}
-
-	/**
-	 * Creates a spacer control with the given span.
-	 * The composite is assumed to have <code>MGridLayout</code> as
-	 * layout.
-	 * @param parent The parent composite
-	 */			
-	public static Control createEmptySpace(Composite parent, int span) {
-		return LayoutUtil.createEmptySpace(parent, span);
-	}
-	
-	/**
-	 * Tests is the control is not <code>null</code> and not disposed.
-	*/
-	protected final boolean isOkToUse(Control control) {
-		return (control != null) && !(control.isDisposed());
-	}
-	
-	// --------- enable / disable management
-	
-	/**
-	 * Sets the enable state of the dialog field.
-	 */
-	public final void setEnabled(boolean enabled) {
-		if (enabled != fEnabled) {
-			fEnabled= enabled;
-			updateEnableState();
-		}
-	}
-	
-	/**
-	 * Gets the enable state of the dialog field.
-	 */	
-	public final boolean isEnabled() {
-		return fEnabled;
-	}
-
-	protected final void assertCompositeNotNull(Composite comp) {
-		Assert.isNotNull(comp, "uncreated control requested with composite null"); //$NON-NLS-1$
-	}
-	
-	protected final void assertEnoughColumns(int nColumns) {
-		Assert.isTrue(nColumns >= getNumberOfControls(), "given number of columns is too small"); //$NON-NLS-1$
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizard.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizard.java
deleted file mode 100644
index 78fb761..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizard.java
+++ /dev/null
@@ -1,81 +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.jdt.internal.junit.wizards;
-
-import java.net.MalformedURLException;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-
-/**
- * A wizard for creating test cases.
- */
-public class NewTestCaseCreationWizard extends JUnitWizard {
-
-	private NewTestCaseCreationWizardPage fPage;
-	private NewTestCaseCreationWizardPage2 fPage2;
-
-	public NewTestCaseCreationWizard() {
-		super();
-		setWindowTitle(WizardMessages.getString("Wizard.title.new.testcase")); //$NON-NLS-1$
-		initDialogSettings();
-	}
-
-	protected void initializeDefaultPageImageDescriptor() {
-		try {
-			ImageDescriptor id= ImageDescriptor.createFromURL(JUnitPlugin.makeIconFileURL("wizban/newtest_wiz.gif")); //$NON-NLS-1$
-			setDefaultPageImageDescriptor(id);
-	} catch (MalformedURLException e) {
-			// Should not happen.  Ignore.
-		}
-	}
-
-
-	/*
-	 * @see Wizard#createPages
-	 */	
-	public void addPages() {
-		super.addPages();
-		fPage= new NewTestCaseCreationWizardPage();
-		fPage2= new NewTestCaseCreationWizardPage2(fPage);
-		addPage(fPage);
-		fPage.init(getSelection(), fPage2);
-		addPage(fPage2);
-	}	
-	
-	/*
-	 * @see Wizard#performFinish
-	 */		
-	public boolean performFinish() {
-		if (finishPage(fPage.getRunnable())) {
-			IType newClass= fPage.getCreatedType();
-
-			ICompilationUnit cu= newClass.getCompilationUnit();				
-
-			if (cu.isWorkingCopy()) {
-				cu= (ICompilationUnit)cu.getOriginalElement();
-			}	
-			IResource resource= cu.getResource();
-			if (resource != null) {
-				selectAndReveal(resource);
-				openResource(resource);
-			}
-			fPage.saveWidgetValues();
-			fPage2.saveWidgetValues();
-			
-			return true;
-		}
-		return false;		
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizardPage.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizardPage.java
deleted file mode 100644
index bfeffbb..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizardPage.java
+++ /dev/null
@@ -1,872 +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
- *     Sebastian Davids - bug 38507
- *******************************************************************************/
-package org.eclipse.jdt.internal.junit.wizards;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.internal.junit.ui.IJUnitHelpContextIds;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.junit.util.JUnitStatus;
-import org.eclipse.jdt.internal.junit.util.JUnitStubUtility;
-import org.eclipse.jdt.internal.junit.util.LayoutUtil;
-import org.eclipse.jdt.internal.junit.util.TestSearchEngine;
-import org.eclipse.jdt.internal.junit.util.JUnitStubUtility.GenStubSettings;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-import org.eclipse.jdt.internal.ui.util.SWTUtil;
-import org.eclipse.jdt.ui.IJavaElementSearchConstants;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-/**
- * The first page of the TestCase creation wizard. 
- */
-public class NewTestCaseCreationWizardPage extends NewTypeWizardPage {
-
-	private final static String PAGE_NAME= "NewTestCaseCreationWizardPage"; //$NON-NLS-1$
-	private final static String CLASS_TO_TEST= PAGE_NAME + ".classtotest"; //$NON-NLS-1$
-	private final static String TEST_SUFFIX= "Test"; //$NON-NLS-1$
-	private final static String SETUP= "setUp"; //$NON-NLS-1$
-	private final static String TEARDOWN= "tearDown"; //$NON-NLS-1$
-
-	private final static String STORE_GENERATE_MAIN= PAGE_NAME + ".GENERATE_MAIN"; //$NON-NLS-1$
-	private final static String STORE_USE_TESTRUNNER= PAGE_NAME + ".USE_TESTRUNNER";	//$NON-NLS-1$
-	private final static String STORE_TESTRUNNER_TYPE= PAGE_NAME + ".TESTRUNNER_TYPE"; //$NON-NLS-1$
-	
-	private String fDefaultClassToTest;
-	private NewTestCaseCreationWizardPage2 fPage2;
-	private MethodStubsSelectionButtonGroup fMethodStubsButtons;
-
-	private IType fClassToTest;
-	private IStatus fClassToTestStatus;
-	private IStatus fTestClassStatus;
-
-	private int fIndexOfFirstTestMethod;
-
-	private Label fClassToTestLabel;
-	private Text fClassToTestText;
-	private Button fClassToTestButton;
-	
-	private boolean fFirstTime;  
-
-	public NewTestCaseCreationWizardPage() {
-		super(true, PAGE_NAME);
-		fFirstTime= true;
-		
-		setTitle(WizardMessages.getString("NewTestClassWizPage.title")); //$NON-NLS-1$
-		setDescription(WizardMessages.getString("NewTestClassWizPage.description")); //$NON-NLS-1$
-		
-		String[] buttonNames= new String[] {
-			"public static void main(Strin&g[] args)", //$NON-NLS-1$
-			/* Add testrunner statement to main Method */
-			WizardMessages.getString("NewTestClassWizPage.methodStub.testRunner"), //$NON-NLS-1$
-			WizardMessages.getString("NewTestClassWizPage.methodStub.setUp"), //$NON-NLS-1$
-			WizardMessages.getString("NewTestClassWizPage.methodStub.tearDown"), //$NON-NLS-1$
-			WizardMessages.getString("NewTestClassWizPage.methodStub.constructor") //$NON-NLS-1$
-		};
-		
-		fMethodStubsButtons= new MethodStubsSelectionButtonGroup(SWT.CHECK, buttonNames, 1);
-		fMethodStubsButtons.setLabelText(WizardMessages.getString("NewTestClassWizPage.method.Stub.label")); //$NON-NLS-1$
-
-		fClassToTestStatus= new JUnitStatus();
-		fTestClassStatus= new JUnitStatus();
-		
-		fDefaultClassToTest= ""; //$NON-NLS-1$
-	}
-
-	// -------- Initialization ---------
-
-	/**
-	 * Should be called from the wizard with the initial selection and the 2nd page of the wizard..
-	 */
-	public void init(IStructuredSelection selection, NewTestCaseCreationWizardPage2 page2) {
-		fPage2= page2;
-		IJavaElement element= getInitialJavaElement(selection);
-
-		initContainerPage(element);
-		initTypePage(element);
-		doStatusUpdate();		
-		// put default class to test		
-		if (element != null) {
-			IType classToTest= null;
-			// evaluate the enclosing type
-			IType typeInCompUnit= (IType) element.getAncestor(IJavaElement.TYPE);
-			if (typeInCompUnit != null) {
-				if (typeInCompUnit.getCompilationUnit() != null) {
-					classToTest= typeInCompUnit;
-				}
-			} else {
-				ICompilationUnit cu= (ICompilationUnit) element.getAncestor(IJavaElement.COMPILATION_UNIT);
-				if (cu != null) 
-					classToTest= cu.findPrimaryType();
-				else {
-					if (element instanceof IClassFile) {
-						try {
-							IClassFile cf= (IClassFile) element;
-							if (cf.isStructureKnown())
-								classToTest= cf.getType();
-						} catch(JavaModelException e) {
-							JUnitPlugin.log(e);
-						}
-					}					
-				}
-			}
-			if (classToTest != null) {
-				try {
-					if (!TestSearchEngine.isTestImplementor(classToTest)) {
-						fDefaultClassToTest= classToTest.getFullyQualifiedName();
-					}
-				} catch (JavaModelException e) {
-					JUnitPlugin.log(e);
-				}
-			}
-		}
-		fMethodStubsButtons.setSelection(0, false); //main
-		fMethodStubsButtons.setSelection(1, false); //add textrunner
-		fMethodStubsButtons.setEnabled(1, false); //add text
-		fMethodStubsButtons.setSelection(2, false); //setUp
-		fMethodStubsButtons.setSelection(3, false); //tearDown
-		fMethodStubsButtons.setSelection(4, false); //constructor
-	}
-	
-	/**
-	 * @see NewContainerWizardPage#handleFieldChanged
-	 */
-	protected void handleFieldChanged(String fieldName) {
-		super.handleFieldChanged(fieldName);
-		if (fieldName.equals(CLASS_TO_TEST)) {
-			fClassToTestStatus= classToTestClassChanged();
-		} else if (fieldName.equals(SUPER)) {
-			validateSuperClass(); 
-			if (!fFirstTime)
-				fTestClassStatus= typeNameChanged();	
-		} else if (fieldName.equals(TYPENAME)) {
-			fTestClassStatus= typeNameChanged();
-		} else if (fieldName.equals(PACKAGE) || fieldName.equals(CONTAINER) || fieldName.equals(SUPER)) {
-			if (fieldName.equals(PACKAGE))
-				fPackageStatus= packageChanged();
-			if (!fFirstTime) {
-				validateSuperClass();
-				fClassToTestStatus= classToTestClassChanged();			
-				fTestClassStatus= typeNameChanged();
-			}
-			if (fieldName.equals(CONTAINER)) {
-				validateJUnitOnBuildPath(); 
-			}
-		}
-		doStatusUpdate();
-	}
-
-	// ------ validation --------
-	private void doStatusUpdate() {
-		// status of all used components
-		IStatus[] status= new IStatus[] {
-			fContainerStatus,
-			fPackageStatus,
-			fTestClassStatus,
-			fClassToTestStatus,
-			fModifierStatus,
-			fSuperClassStatus
-		};
-		
-		// the mode severe status will be displayed and the ok button enabled/disabled.
-		updateStatus(status);
-	}
-
-	/*
-	 * @see IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-		
-		Composite composite= new Composite(parent, SWT.NONE);
-		
-		int nColumns= 4;
-		
-		GridLayout layout= new GridLayout();
-		layout.numColumns= nColumns;		
-		composite.setLayout(layout);
-
-		createContainerControls(composite, nColumns);	
-		createPackageControls(composite, nColumns);
-		createSeparator(composite, nColumns);
-		createTypeNameControls(composite, nColumns);		
-		createSuperClassControls(composite, nColumns);
-		createMethodStubSelectionControls(composite, nColumns);
-		setSuperClass(JUnitPlugin.TEST_SUPERCLASS_NAME, true);
-		createSeparator(composite, nColumns);
-		createClassToTestControls(composite, nColumns);
-		
-		setControl(composite);
-			
-		//set default and focus
-		if (fDefaultClassToTest.length() > 0) {
-			fClassToTestText.setText(fDefaultClassToTest);
-			setTypeName(Signature.getSimpleName(fDefaultClassToTest)+TEST_SUFFIX, true);
-		}
-		restoreWidgetValues();
-		Dialog.applyDialogFont(composite);
-		WorkbenchHelp.setHelp(composite, IJUnitHelpContextIds.NEW_TESTCASE_WIZARD_PAGE);	
-
-	}
-
-	private void createMethodStubSelectionControls(Composite composite, int nColumns) {
-		LayoutUtil.setHorizontalSpan(fMethodStubsButtons.getLabelControl(composite), nColumns);
-		LayoutUtil.createEmptySpace(composite,1);
-		LayoutUtil.setHorizontalSpan(fMethodStubsButtons.getSelectionButtonsGroup(composite), nColumns - 1);	
-	}	
-
-	private void createClassToTestControls(Composite composite, int nColumns) {
-		fClassToTestLabel= new Label(composite, SWT.LEFT | SWT.WRAP);
-		fClassToTestLabel.setFont(composite.getFont());
-
-		fClassToTestLabel.setText(WizardMessages.getString("NewTestClassWizPage.class_to_test.label")); //$NON-NLS-1$
-		GridData gd= new GridData();
-		gd.horizontalSpan= 1;
-		fClassToTestLabel.setLayoutData(gd);
-
-		fClassToTestText= new Text(composite, SWT.SINGLE | SWT.BORDER);
-		fClassToTestText.setEnabled(true);
-		fClassToTestText.setFont(composite.getFont());
-		fClassToTestText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				handleFieldChanged(CLASS_TO_TEST);
-			}
-		});
-		gd= new GridData();
-		gd.horizontalAlignment= GridData.FILL;
-		gd.grabExcessHorizontalSpace= true;
-		gd.horizontalSpan= nColumns - 2;
-		fClassToTestText.setLayoutData(gd);
-		
-		fClassToTestButton= new Button(composite, SWT.PUSH);
-		fClassToTestButton.setText(WizardMessages.getString("NewTestClassWizPage.class_to_test.browse")); //$NON-NLS-1$
-		fClassToTestButton.setEnabled(true);
-		fClassToTestButton.addSelectionListener(new SelectionListener() {
-			public void widgetDefaultSelected(SelectionEvent e) {
-				classToTestButtonPressed();
-			}
-			public void widgetSelected(SelectionEvent e) {
-				classToTestButtonPressed();
-			}
-		});	
-		gd= new GridData();
-		gd.horizontalAlignment= GridData.FILL;
-		gd.grabExcessHorizontalSpace= false;
-		gd.horizontalSpan= 1;
-		gd.heightHint = SWTUtil.getButtonHeightHint(fClassToTestButton);
-		gd.widthHint = SWTUtil.getButtonWidthHint(fClassToTestButton);		
-		fClassToTestButton.setLayoutData(gd);
-
-	}
-
-	private void classToTestButtonPressed() {
-		IType type= chooseClassToTestType();
-		if (type != null) {
-			fClassToTestText.setText(JavaModelUtil.getFullyQualifiedName(type));
-			handleFieldChanged(CLASS_TO_TEST);
-		}
-	}
-
-	private IType chooseClassToTestType() {	
-		IPackageFragmentRoot root= getPackageFragmentRoot();
-		if (root == null) 
-			return null;
-
-		IJavaElement[] elements= new IJavaElement[] { root.getJavaProject() };
-		IJavaSearchScope scope= SearchEngine.createJavaSearchScope(elements);
-		
-		IType type= null;
-		try {		
-			SelectionDialog dialog= JavaUI.createTypeDialog(getShell(), getWizard().getContainer(), scope, IJavaElementSearchConstants.CONSIDER_CLASSES, false, getClassToTestText());
-			dialog.setTitle(WizardMessages.getString("NewTestClassWizPage.class_to_test.dialog.title")); //$NON-NLS-1$
-			dialog.setMessage(WizardMessages.getString("NewTestClassWizPage.class_to_test.dialog.message")); //$NON-NLS-1$
-			dialog.open();
-			if (dialog.getReturnCode() != Window.OK)
-				return type;
-			else {
-				Object[] resultArray= dialog.getResult();
-				if (resultArray != null && resultArray.length > 0)
-					type= (IType) resultArray[0];
-			}
-		} catch (JavaModelException e) {
-			JUnitPlugin.log(e);
-		}
-		return type;
-	}
-
-	private IStatus classToTestClassChanged() {
-		fClassToTestButton.setEnabled(getPackageFragmentRoot() != null);	// sets the test class field?
-		IStatus status= validateClassToTest();
-		return status;
-	}
-
-	/**
-	 * Returns the content of the class to test text field.
-	 */
-	public String getClassToTestText() {
-		return fClassToTestText.getText();
-	}
-	
-	/**
-	 * Returns the class to be tested.
-	 */
-	public IType getClassToTest() {
-		return fClassToTest;
-	}
-
-	/**
-	 * Sets the name of the class to test.
-	 */		
-	public void setClassToTest(String name) {
-		fClassToTestText.setText(name);
-	}	
-
-	/**
-	 * @see NewTypeWizardPage#createTypeMembers
-	 */
-	protected void createTypeMembers(IType type, ImportsManager imports, IProgressMonitor monitor) throws CoreException {
-		fIndexOfFirstTestMethod= 0;
-
-		if (fMethodStubsButtons.isSelected(0)) 
-			createMain(type);
-		
-		if (fMethodStubsButtons.isSelected(2)) {
-			createSetUp(type, imports);
-		}
-		
-		if (fMethodStubsButtons.isSelected(3)) {
-			createTearDown(type, imports);
-		}
-
-		if (fMethodStubsButtons.isSelected(4))
-			createConstructor(type, imports); 		
-
-		if (isNextPageValid()) {
-			createTestMethodStubs(type);
-		}
-	}
-
-	private void createConstructor(IType type, ImportsManager imports) throws JavaModelException {
-		ITypeHierarchy typeHierarchy= null;
-		IType[] superTypes= null;
-		String constr= ""; //$NON-NLS-1$
-		IMethod methodTemplate= null;
-		if (type.exists()) {
-			typeHierarchy= type.newSupertypeHierarchy(null);
-			superTypes= typeHierarchy.getAllSuperclasses(type);
-			for (int i= 0; i < superTypes.length; i++) {
-				if (superTypes[i].exists()) {
-					IMethod constrMethod= superTypes[i].getMethod(superTypes[i].getElementName(), new String[] {"Ljava.lang.String;"}); //$NON-NLS-1$
-					if (constrMethod.exists() && constrMethod.isConstructor()) {
-						methodTemplate= constrMethod;
-						break;
-					}
-				}
-			}
-		}
-		CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings();
-		if (methodTemplate != null) {
-			GenStubSettings genStubSettings= new GenStubSettings(settings);
-			genStubSettings.fCallSuper= true;				
-			genStubSettings.fMethodOverwrites= true;
-			constr= JUnitStubUtility.genStub(getTypeName(), methodTemplate, genStubSettings, imports);
-		} else {
-			constr += "public "+getTypeName()+"(String name) {" + //$NON-NLS-1$  //$NON-NLS-2$ 
-					getLineDelimiter() +
-					"super(name);" + //$NON-NLS-1$ 
-					getLineDelimiter() +
-					"}" + //$NON-NLS-1$ 
-					getLineDelimiter() + getLineDelimiter();
-		}
-		type.createMethod(constr, null, true, null);	
-		fIndexOfFirstTestMethod++;
-	}
-
-	private void createMain(IType type) throws JavaModelException {
-		type.createMethod(fMethodStubsButtons.getMainMethod(getTypeName()), null, false, null);	
-		fIndexOfFirstTestMethod++;		
-	}
-
-	private void createSetUp(IType type, ImportsManager imports) throws JavaModelException {
-		ITypeHierarchy typeHierarchy= null;
-		IType[] superTypes= null;
-		String setUp= ""; //$NON-NLS-1$
-		IMethod methodTemplate= null;
-		if (type.exists()) {
-			typeHierarchy= type.newSupertypeHierarchy(null);
-			superTypes= typeHierarchy.getAllSuperclasses(type);
-			for (int i= 0; i < superTypes.length; i++) {
-				if (superTypes[i].exists()) {
-					IMethod testMethod= superTypes[i].getMethod(SETUP, new String[] {});
-					if (testMethod.exists()) {
-						methodTemplate= testMethod;
-						break;
-					}
-				}
-			}
-		}
-		CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings();
-		if (methodTemplate != null) {
-			GenStubSettings genStubSettings= new GenStubSettings(settings);
-			genStubSettings.fCallSuper= true;				
-			genStubSettings.fMethodOverwrites= true;
-			setUp= JUnitStubUtility.genStub(getTypeName(), methodTemplate, genStubSettings, imports);
-		} else {
-			if (settings.createComments)
-				setUp= "/**" + //$NON-NLS-1$
-					getLineDelimiter() + 
-					" * Sets up the fixture, for example, open a network connection." + //$NON-NLS-1$
-					getLineDelimiter() +
-					" * This method is called before a test is executed." + //$NON-NLS-1$
-					getLineDelimiter() +
-					" * @throws Exception" + //$NON-NLS-1$
-					getLineDelimiter() +
-					" */" + //$NON-NLS-1$
-					getLineDelimiter(); 
-			setUp+= "protected void "+SETUP+"() throws Exception {}" + //$NON-NLS-1$ //$NON-NLS-2$
-				getLineDelimiter() + getLineDelimiter(); 
-		}
-		type.createMethod(setUp, null, false, null);	
-		fIndexOfFirstTestMethod++;
-	}
-	
-	private void createTearDown(IType type, ImportsManager imports) throws JavaModelException {
-		ITypeHierarchy typeHierarchy= null;
-		IType[] superTypes= null;
-		String tearDown= ""; //$NON-NLS-1$
-		IMethod methodTemplate= null;
-		if (type.exists()) {
-			if (typeHierarchy == null) {
-				typeHierarchy= type.newSupertypeHierarchy(null);
-				superTypes= typeHierarchy.getAllSuperclasses(type);
-			}
-			for (int i= 0; i < superTypes.length; i++) {
-				if (superTypes[i].exists()) {
-					IMethod testM= superTypes[i].getMethod(TEARDOWN, new String[] {});
-					if (testM.exists()) {
-						methodTemplate= testM;
-						break;
-					}
-				}
-			}
-		}
-		CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings();
-		if (methodTemplate != null) {
-			GenStubSettings genStubSettings= new GenStubSettings(settings);				
-			genStubSettings.fCallSuper= true;
-			genStubSettings.fMethodOverwrites= true;
-			tearDown= JUnitStubUtility.genStub(getTypeName(), methodTemplate, genStubSettings, imports);
-			type.createMethod(tearDown, null, false, null);	
-			fIndexOfFirstTestMethod++;
-		}				
-	}
-
-	private void createTestMethodStubs(IType type) throws JavaModelException {
-		IMethod[] methods= fPage2.getCheckedMethods();
-		if (methods.length == 0)
-			return;
-		/* find overloaded methods */
-		IMethod[] allMethodsArray= fPage2.getAllMethods();
-		List allMethods= new ArrayList();
-		allMethods.addAll(Arrays.asList(allMethodsArray));
-		List overloadedMethods= getOveloadedMethods(allMethods);
-			
-		/* used when for example both sum and Sum methods are present. Then
-		 * sum -> testSum
-		 * Sum -> testSum1
-		 */
-		List newMethodsNames= new ArrayList();				
-			for (int i = 0; i < methods.length; i++) {
-			IMethod testedMethod= methods[i];
-			String elementName= testedMethod.getElementName();
-			StringBuffer methodName= new StringBuffer(NewTestCaseCreationWizardPage2.PREFIX+Character.toUpperCase(elementName.charAt(0))+elementName.substring(1));
-			StringBuffer newMethod= new StringBuffer();
-	
-			if (overloadedMethods.contains(testedMethod)) {
-				appendMethodComment(newMethod, testedMethod);
-				String[] params= testedMethod.getParameterTypes();
-				appendParameterNamesToMethodName(methodName, params);
-			}
-			/* Should I for examples have methods
-			 * 	void foo(java.lang.StringBuffer sb) {}
-			 *  void foo(mypackage1.StringBuffer sb) {}
-			 *  void foo(mypackage2.StringBuffer sb) {}
-			 * I will get in the test class:
-			 *  testFooStringBuffer()
-			 *  testFooStringBuffer1()
-			 *  testFooStringBuffer2()
-			 */
-			if (newMethodsNames.contains(methodName.toString())) {
-				int suffix= 1;
-				while (newMethodsNames.contains(methodName.toString() + Integer.toString(suffix)))
-					suffix++;
-				methodName.append(Integer.toString(suffix));
-			}
-			newMethodsNames.add(methodName.toString());
-			newMethod.append("public ");//$NON-NLS-1$ 
-			if (fPage2.getCreateFinalMethodStubsButtonSelection())
-				newMethod.append("final "); //$NON-NLS-1$
-			newMethod.append("void ");//$NON-NLS-1$ 
-			newMethod.append(methodName.toString());
-			newMethod.append("()");//$NON-NLS-1$ 
-			appendTestMethodBody(newMethod, testedMethod);
-			type.createMethod(newMethod.toString(), null, false, null);	
-		}
-	}
-	
-	private String getLineDelimiter(){
-		IType classToTest= getClassToTest();
-		
-		if (classToTest != null && classToTest.exists())
-			return JUnitStubUtility.getLineDelimiterUsed(classToTest);
-		else	
-			return JUnitStubUtility.getLineDelimiterUsed(getPackageFragment());
-	}
-	
-	private void appendTestMethodBody(StringBuffer newMethod, IMethod testedMethod) {
-		newMethod.append("{"); //$NON-NLS-1$
-		if (createTasks()){
-			newMethod.append(getLineDelimiter());
-			newMethod.append("//"); //$NON-NLS-1$
-			newMethod.append(JUnitStubUtility.getTodoTaskTag(getPackageFragment().getJavaProject()));
-			newMethod.append(WizardMessages.getFormattedString("NewTestClassWizPage.marker.message", testedMethod.getElementName())); //$NON-NLS-1$
-			newMethod.append(getLineDelimiter());		
-		}
-		newMethod.append("}").append(getLineDelimiter()).append(getLineDelimiter()); //$NON-NLS-1$
-	}
-
-	public void appendParameterNamesToMethodName(StringBuffer methodName, String[] params) {
-		for (int i= 0; i < params.length; i++) {
-			String param= params[i];
-			methodName.append(Signature.getSimpleName(Signature.toString(Signature.getElementType(param))));
-			for (int j= 0, arrayCount= Signature.getArrayCount(param); j < arrayCount; j++) {
-				methodName.append("Array"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	private void appendMethodComment(StringBuffer newMethod, IMethod method) throws JavaModelException {
-		String returnType= Signature.toString(method.getReturnType());
-		String body= WizardMessages.getFormattedString("NewTestClassWizPage.comment.class_to_test", new String[]{returnType, method.getElementName()}); //$NON-NLS-1$
-		newMethod.append("/*");//$NON-NLS-1$
-		newMethod.append(getLineDelimiter());
-		newMethod.append(" * ");//$NON-NLS-1$
-		newMethod.append(body);
-		newMethod.append("(");//$NON-NLS-1$
-		String[] paramTypes= method.getParameterTypes();
-		if (paramTypes.length > 0) {
-			if (paramTypes.length > 1) {
-				for (int j= 0; j < paramTypes.length-1; j++) {
-					newMethod.append(Signature.toString(paramTypes[j])+", "); //$NON-NLS-1$
-				}
-			}
-			newMethod.append(Signature.toString(paramTypes[paramTypes.length-1]));
-		}
-		newMethod.append(")");//$NON-NLS-1$
-		newMethod.append(getLineDelimiter());
-		newMethod.append(" */");//$NON-NLS-1$
-		newMethod.append(getLineDelimiter()); 
-	}
-
-	private List getOveloadedMethods(List allMethods) {
-		List overloadedMethods= new ArrayList();
-		for (int i= 0; i < allMethods.size(); i++) {
-			IMethod current= (IMethod) allMethods.get(i);
-			String currentName= current.getElementName();
-			boolean currentAdded= false;
-			for (ListIterator iter= allMethods.listIterator(i+1); iter.hasNext(); ) {
-				IMethod iterMethod= (IMethod) iter.next();
-				if (iterMethod.getElementName().equals(currentName)) {
-					//method is overloaded
-					if (!currentAdded) {
-						overloadedMethods.add(current);
-						currentAdded= true;
-					}
-					overloadedMethods.add(iterMethod);
-					iter.remove();
-				}
-			}
-		}
-		return overloadedMethods;
-	}
-
-	/**
-	 * @see DialogPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		if (visible && fFirstTime) {
-			if (getClassToTestText().equals("")) //$NON-NLS-1$
-				setPageComplete(false);
-			else
-				handleFieldChanged(CLASS_TO_TEST); //creates error message when wizard is opened if TestCase already exists
-			fFirstTime= false;
-		}
-		
-		if (visible) setFocus();
-	}
-
-	private void validateJUnitOnBuildPath() {
-		IPackageFragmentRoot root= getPackageFragmentRoot();
-		if (root == null)
-			return;
-		IJavaProject jp= root.getJavaProject();
-		
-		try {
-			if (jp.findType(JUnitPlugin.TEST_SUPERCLASS_NAME) != null)
-				return;
-		} catch (JavaModelException e) {
-		}
-		if (MessageDialog.openQuestion(getShell(), WizardMessages.getString("NewTestClassWizPage.not_on_buildpath.title"), WizardMessages.getString("NewTestClassWizPage.not_on_buildpath.message"))) { //$NON-NLS-1$ //$NON-NLS-2$
-			try {
-				addJUnitToBuildPath(jp);
-				return;
-			} catch(JavaModelException e) {
-				ErrorDialog.openError(getShell(), WizardMessages.getString("NewTestClassWizPage.cannot_add.title"), WizardMessages.getString("NewTestClassWizPage.cannot_add.message"), e.getStatus()); //$NON-NLS-1$ //$NON-NLS-2$
-			}	
-		}
-		JUnitStatus status= new JUnitStatus();
-		status.setWarning(WizardMessages.getString("NewTestClassWizPage.error.junitNotOnbuildpath")); //$NON-NLS-1$		
-		fContainerStatus= status;
-	}
-	
-	public static void addJUnitToBuildPath(IJavaProject project) throws JavaModelException {
-		IPath junitHome= new Path(JUnitPlugin.JUNIT_HOME);
-		IClasspathEntry entry= JavaCore.newVariableEntry(
-			junitHome.append("junit.jar"),  //$NON-NLS-1$
-			junitHome.append("junitsrc.zip"),  //$NON-NLS-1$
-			null
-		);
-		addToClasspath(project, entry);
-	}	
-	
-	private static void addToClasspath(IJavaProject project, IClasspathEntry entry) throws JavaModelException {
-		IClasspathEntry[] oldEntries= project.getRawClasspath();
-		for (int i= 0; i < oldEntries.length; i++) {
-			if (oldEntries[i].equals(entry)) {
-				return;
-			}
-		}
-		int nEntries= oldEntries.length;
-		IClasspathEntry[] newEntries= new IClasspathEntry[nEntries + 1];
-		System.arraycopy(oldEntries, 0, newEntries, 0, nEntries);
-		newEntries[nEntries]= entry;
-		project.setRawClasspath(newEntries, null);
-	}
-
-
-	/**
-	 * Returns the index of the first method that is a test method, i.e. excluding main, setUp() and tearDown().
-	 * If none of the aforementioned method stubs is created, then 0 is returned. As such method stubs are created,
-	 * this counter is incremented.
-	 */
-	public int getIndexOfFirstMethod() {
-		return fIndexOfFirstTestMethod;
-	}
-
-	private boolean createTasks() {
-		return fPage2.getCreateTasksButtonSelection();
-	}	
-
-	private void validateSuperClass() {
-		fMethodStubsButtons.setEnabled(2, true);//enable setUp() checkbox
-		fMethodStubsButtons.setEnabled(3, true);//enable tearDown() checkbox
-		String superClassName= getSuperClass();
-		if (superClassName == null || superClassName.trim().equals("")) { //$NON-NLS-1$
-			fSuperClassStatus= new JUnitStatus();
-			((JUnitStatus)fSuperClassStatus).setError(WizardMessages.getString("NewTestClassWizPage.error.superclass.empty")); //$NON-NLS-1$
-			return;	
-		}
-		if (getPackageFragmentRoot() != null) { //$NON-NLS-1$
-			try {
-				IType type= resolveClassNameToType(getPackageFragmentRoot().getJavaProject(), getPackageFragment(), superClassName);
-				JUnitStatus status = new JUnitStatus();				
-				if (type == null) {
-					/* TODO: is this a warning or error? */
-					status.setWarning(WizardMessages.getString("NewTestClassWizPage.error.superclass.not_exist")); //$NON-NLS-1$
-					fSuperClassStatus= status;
-				} else {
-					if (type.isInterface()) {
-						status.setError(WizardMessages.getString("NewTestClassWizPage.error.superclass.is_interface")); //$NON-NLS-1$
-						fSuperClassStatus= status;
-					}
-					if (!TestSearchEngine.isTestImplementor(type)) {
-						status.setError(WizardMessages.getFormattedString("NewTestClassWizPage.error.superclass.not_implementing_test_interface", JUnitPlugin.TEST_INTERFACE_NAME)); //$NON-NLS-1$
-						fSuperClassStatus= status;
-					} else {
-						IMethod setupMethod= type.getMethod(SETUP, new String[] {});
-						IMethod teardownMethod= type.getMethod(TEARDOWN, new String[] {});
-						if (setupMethod.exists())
-							fMethodStubsButtons.setEnabled(2, !Flags.isFinal(setupMethod.getFlags()));
-						if (teardownMethod.exists())
-							fMethodStubsButtons.setEnabled(3, !Flags.isFinal(teardownMethod.getFlags()));
-					}
-				}
-			} catch (JavaModelException e) {
-				JUnitPlugin.log(e);
-			}
-		}
-	}
-		
-	/**
-	 * @see IWizardPage#canFlipToNextPage
-	 */
-	public boolean canFlipToNextPage() {
-		return isPageComplete() && getNextPage() != null && isNextPageValid();
-	}
-
-	protected boolean isNextPageValid() {
-		return !getClassToTestText().equals(""); //$NON-NLS-1$
-	}
-
-	private JUnitStatus validateClassToTest() {
-		IPackageFragmentRoot root= getPackageFragmentRoot();
-		IPackageFragment pack= getPackageFragment();
-		String classToTestName= getClassToTestText();
-		JUnitStatus status= new JUnitStatus();
-		
-		fClassToTest= null;
-		if (classToTestName.length() == 0) {
-			return status;
-		}
-		IStatus val= JavaConventions.validateJavaTypeName(classToTestName);
-//		if (!val.isOK()) {
-		if (val.getSeverity() == IStatus.ERROR) {
-			status.setError(WizardMessages.getString("NewTestClassWizPage.error.class_to_test.not_valid")); //$NON-NLS-1$
-			return status;
-		}
-		
-		if (root != null) {
-			try {		
-				IType type= resolveClassNameToType(root.getJavaProject(), pack, classToTestName);
-				if (type == null) {
-					//status.setWarning("Warning: "+typeLabel+" does not exist in current project.");
-					status.setError(WizardMessages.getString("NewTestClassWizPage.error.class_to_test.not_exist")); //$NON-NLS-1$
-					return status;
-				} else {
-					if (type.isInterface()) {
-						status.setWarning(WizardMessages.getFormattedString("NewTestClassWizPage.warning.class_to_test.is_interface",classToTestName)); //$NON-NLS-1$
-					}
-					if (pack != null && !JavaModelUtil.isVisible(type, pack)) {
-						status.setWarning(WizardMessages.getFormattedString("NewTestClassWizPage.warning.class_to_test.not_visible", new String[] {(type.isInterface())?WizardMessages.getString("Interface"):WizardMessages.getString("Class") , classToTestName})); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-					}
-				}
-				fClassToTest= type;
-			} catch (JavaModelException e) {
-				status.setError(WizardMessages.getString("NewTestClassWizPage.error.class_to_test.not_valid")); //$NON-NLS-1$
-			}							
-		} else {
-			status.setError(""); //$NON-NLS-1$
-		}
-		return status;
-	}
-
-	private IType resolveClassNameToType(IJavaProject jproject, IPackageFragment pack, String classToTestName) throws JavaModelException {
-		IType type= null;
-		if (type == null && pack != null) {
-			String packName= pack.getElementName();
-			// search in own package
-			if (!pack.isDefaultPackage()) {
-				type= jproject.findType(packName, classToTestName);
-			}
-			// search in java.lang
-			if (type == null && !"java.lang".equals(packName)) { //$NON-NLS-1$
-				type= jproject.findType("java.lang", classToTestName); //$NON-NLS-1$
-			}
-		}
-		// search fully qualified
-		if (type == null) {
-			type= jproject.findType(classToTestName);
-		}
-		return type;
-	}
-	
-	/**
-	 *	Use the dialog store to restore widget values to the values that they held
-	 *	last time this wizard was used to completion
-	 */
-	private void restoreWidgetValues() {
-		
-		IDialogSettings settings= getDialogSettings();
-		if (settings != null) {
-			boolean generateMain= settings.getBoolean(STORE_GENERATE_MAIN);
-			fMethodStubsButtons.setSelection(0, generateMain);
-			fMethodStubsButtons.setEnabled(1, generateMain);
-			fMethodStubsButtons.setSelection(1,settings.getBoolean(STORE_USE_TESTRUNNER));
-			try {
-				fMethodStubsButtons.setComboSelection(settings.getInt(STORE_TESTRUNNER_TYPE));
-			} catch(NumberFormatException e) {}
-		}		
-	}	
-
-	/**
-	 * 	Since Finish was pressed, write widget values to the dialog store so that they
-	 *	will persist into the next invocation of this wizard page
-	 */
-	void saveWidgetValues() {
-		IDialogSettings settings= getDialogSettings();
-		if (settings != null) {
-			settings.put(STORE_GENERATE_MAIN, fMethodStubsButtons.isSelected(0));
-			settings.put(STORE_USE_TESTRUNNER, fMethodStubsButtons.isSelected(1));
-			settings.put(STORE_TESTRUNNER_TYPE, fMethodStubsButtons.getComboSelection());
-		}
-	}
-
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizardPage2.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizardPage2.java
deleted file mode 100644
index 6c4b17f..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestCaseCreationWizardPage2.java
+++ /dev/null
@@ -1,431 +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.jdt.internal.junit.wizards;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Vector;
-
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.ui.IJUnitHelpContextIds;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.dialogs.ContainerCheckedTreeViewer;
-
-/**
- * Wizard page to select the methods from a class under test.
- */
-public class NewTestCaseCreationWizardPage2 extends WizardPage {
-
-	private final static String PAGE_NAME= "NewTestCaseCreationWizardPage2"; //$NON-NLS-1$
-	private final static String STORE_USE_TASKMARKER= PAGE_NAME + ".USE_TASKMARKER"; //$NON-NLS-1$
-	private final static String STORE_CREATE_FINAL_METHOD_STUBS= PAGE_NAME + ".CREATE_FINAL_METHOD_STUBS"; //$NON-NLS-1$
-	public final static String PREFIX= "test"; //$NON-NLS-1$
-
-	private NewTestCaseCreationWizardPage fFirstPage;	
-	private IType fClassToTest;
-
-	private Button fCreateFinalMethodStubsButton;
-	private Button fCreateTasksButton;
-	private ContainerCheckedTreeViewer fMethodsTree;
-	private Button fSelectAllButton;
-	private Button fDeselectAllButton;
-	private Label fSelectedMethodsLabel;
-	
-	/**
-	 * Constructor for NewTestCaseCreationWizardPage2.
-	 */
-	protected NewTestCaseCreationWizardPage2(NewTestCaseCreationWizardPage firstPage) {
-		super(PAGE_NAME);
-		fFirstPage= firstPage;
-		setTitle(WizardMessages.getString("NewTestClassWizPage2.title")); //$NON-NLS-1$
-		setDescription(WizardMessages.getString("NewTestClassWizPage2.description")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container= new Composite(parent, SWT.NONE);
-		GridLayout layout= new GridLayout();
-		layout.numColumns= 2;
-		container.setLayout(layout);
-
-		createMethodsTreeControls(container);
-		createSpacer(container);
-		createButtonChoices(container);	
-		setControl(container);
-		restoreWidgetValues();
-		Dialog.applyDialogFont(container);
-		WorkbenchHelp.setHelp(container, IJUnitHelpContextIds.NEW_TESTCASE_WIZARD_PAGE2);	
-	}
-
-	protected void createButtonChoices(Composite container) {
-		GridLayout layout;
-		GridData gd;
-		Composite prefixContainer= new Composite(container, SWT.NONE);
-		gd= new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.horizontalSpan = 1;
-		prefixContainer.setLayoutData(gd);
-		
-		layout = new GridLayout();
-		layout.numColumns = 1;
-		layout.marginWidth = 0;
-		layout.marginHeight = 0;
-		prefixContainer.setLayout(layout);
-		
-		Button buttons[] = {null, null};
-
-		String buttonNames[] = {
-			WizardMessages.getString("NewTestClassWizPage2.create_final_method_stubs.text"), //$NON-NLS-1$
-			WizardMessages.getString("NewTestClassWizPage2.create_tasks.text") //$NON-NLS-1$
-		}; 
-		
-		for (int i=0; i < buttons.length; i++) {
-			buttons[i]= new Button(prefixContainer, SWT.CHECK | SWT.LEFT);
-			buttons[i].setText(buttonNames[i]); //$NON-NLS-1$
-			buttons[i].setEnabled(true);
-			buttons[i].setSelection(true);
-			gd= new GridData();
-			gd.horizontalAlignment= GridData.FILL;
-			gd.horizontalSpan= 1;
-			buttons[i].setLayoutData(gd);							
-		}
-		fCreateFinalMethodStubsButton= buttons[0];
-		fCreateTasksButton= buttons[1];	
-	}
-	
-	protected void createMethodsTreeControls(Composite container) {
-		Label label= new Label(container, SWT.LEFT | SWT.WRAP);
-		label.setFont(container.getFont());
-		label.setText(WizardMessages.getString("NewTestClassWizPage2.methods_tree.label")); //$NON-NLS-1$
-		GridData gd = new GridData();
-		gd.horizontalSpan = 2;
-		label.setLayoutData(gd);
-
-		fMethodsTree= new ContainerCheckedTreeViewer(container, SWT.BORDER);
-		gd= new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
-		gd.heightHint= 180;
-		fMethodsTree.getTree().setLayoutData(gd);
-
-		fMethodsTree.setLabelProvider(new AppearanceAwareLabelProvider());
-		fMethodsTree.setAutoExpandLevel(2);			
-		fMethodsTree.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				updateSelectedMethodsLabel();
-			}	
-		});
-		fMethodsTree.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement, Object element) {
-				if (element instanceof IMethod) {
-					IMethod method = (IMethod) element;
-					return !method.getElementName().equals("<clinit>"); //$NON-NLS-1$
-				}
-				return true;
-			}
-		});
-
-		Composite buttonContainer= new Composite(container, SWT.NONE);
-		gd= new GridData(GridData.FILL_VERTICAL);
-		buttonContainer.setLayoutData(gd);
-		GridLayout buttonLayout= new GridLayout();
-		buttonLayout.marginWidth= 0;
-		buttonLayout.marginHeight= 0;
-		buttonContainer.setLayout(buttonLayout);
-
-		fSelectAllButton= new Button(buttonContainer, SWT.PUSH);
-		fSelectAllButton.setText(WizardMessages.getString("NewTestClassWizPage2.selectAll")); //$NON-NLS-1$
-		gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
-		fSelectAllButton.setLayoutData(gd);
-		fSelectAllButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				fMethodsTree.setCheckedElements((Object[]) fMethodsTree.getInput());
-				updateSelectedMethodsLabel();
-			}
-		});
-
-		fDeselectAllButton= new Button(buttonContainer, SWT.PUSH);
-		fDeselectAllButton.setText(WizardMessages.getString("NewTestClassWizPage2.deselectAll")); //$NON-NLS-1$
-		gd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
-		fDeselectAllButton.setLayoutData(gd);
-		fDeselectAllButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				fMethodsTree.setCheckedElements(new Object[0]);
-				updateSelectedMethodsLabel();
-			}
-		});
-
-		/* No of selected methods label */
-		fSelectedMethodsLabel= new Label(container, SWT.LEFT);
-		fSelectedMethodsLabel.setFont(container.getFont());
-		updateSelectedMethodsLabel();
-		gd= new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan= 1;
-		fSelectedMethodsLabel.setLayoutData(gd);
-		
-		Label emptyLabel= new Label(container, SWT.LEFT);
-		gd= new GridData();
-		gd.horizontalSpan= 1;
-		emptyLabel.setLayoutData(gd);
-	}
-
-	protected void createSpacer(Composite container) {
-		Label spacer= new Label(container, SWT.NONE);
-		GridData data= new GridData();
-		data.horizontalSpan= 2;
-		data.horizontalAlignment= GridData.FILL;
-		data.verticalAlignment= GridData.BEGINNING;
-		data.heightHint= 4;
-		spacer.setLayoutData(data);
-	}
-
-	/**
-	 * @see DialogPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible) {
-			fClassToTest= fFirstPage.getClassToTest();
-			IType currType= fClassToTest;
-			ArrayList types= null;
-			try {
-				ITypeHierarchy hierarchy= currType.newSupertypeHierarchy(null);
-				IType[] superTypes;
-				if (currType.isClass())
-					superTypes= hierarchy.getAllSuperclasses(currType);
-				else if (currType.isInterface())
-					superTypes= hierarchy.getAllSuperInterfaces(currType);
-				else
-					superTypes= new IType[0];
-				types= new ArrayList(superTypes.length+1);
-				types.add(currType);
-				types.addAll(Arrays.asList(superTypes));
-			} catch(JavaModelException e) {
-				JUnitPlugin.log(e);
-			}
-			fMethodsTree.setContentProvider(new MethodsTreeContentProvider(types.toArray()));
-			if (types == null)
-				types= new ArrayList();
-			fMethodsTree.setInput(types.toArray());
-			fMethodsTree.setSelection(new StructuredSelection(currType), true);
-			updateSelectedMethodsLabel();
-			setFocus();
-		}
-	}
-
-	/**
-	 * Returns all checked methods in the Methods tree.
-	 */
-	public IMethod[] getCheckedMethods() {
-		Object[] checkedObjects= fMethodsTree.getCheckedElements();
-		int methodCount= 0;
-		for (int i = 0; i < checkedObjects.length; i++) {
-			if (checkedObjects[i] instanceof IMethod)
-				methodCount++;
-		}
-		IMethod[] checkedMethods= new IMethod[methodCount];
-		int j= 0;
-		for (int i = 0; i < checkedObjects.length; i++) {
-			if (checkedObjects[i] instanceof IMethod) {
-				checkedMethods[j]= (IMethod)checkedObjects[i];
-				j++;
-			}
-		}
-		return checkedMethods;
-	}
-	
-	private static class MethodsTreeContentProvider implements ITreeContentProvider {
-		private Object[] fTypes;
-		private IMethod[] fMethods;
-		private final Object[] fEmpty= new Object[0];
-
-		public MethodsTreeContentProvider(Object[] types) {
-			fTypes= types;
-			Vector methods= new Vector();
-			for (int i = types.length-1; i > -1; i--) {
-				Object object = types[i];
-				if (object instanceof IType) {
-					IType type = (IType) object;
-					try {
-						IMethod[] currMethods= type.getMethods();
-						for_currMethods:
-						for (int j = 0; j < currMethods.length; j++) {
-							IMethod currMethod = currMethods[j];
-							int flags= currMethod.getFlags();
-							if (!Flags.isPrivate(flags)) {
-								for (int k = 0; k < methods.size(); k++) {
-									IMethod m= ((IMethod)methods.get(k));
-									if (m.getElementName().equals(currMethod.getElementName())
-										&& m.getSignature().equals(currMethod.getSignature())) {
-										methods.set(k,currMethod);
-										continue for_currMethods;
-									}
-								}
-								methods.add(currMethod);
-							}
-						}
-					} catch (JavaModelException e) {
-						JUnitPlugin.log(e);
-					}
-				}
-			}
-			fMethods= new IMethod[methods.size()];
-			methods.copyInto(fMethods);
-		}
-		
-		/*
-		 * @see ITreeContentProvider#getChildren(Object)
-		 */
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof IType) {
-				IType parentType= (IType)parentElement;
-				ArrayList result= new ArrayList(fMethods.length);
-				for (int i= 0; i < fMethods.length; i++) {
-					if (fMethods[i].getDeclaringType().equals(parentType)) {
-						result.add(fMethods[i]);
-					}
-				}
-				return result.toArray();
-			}
-			return fEmpty;
-		}
-
-		/*
-		 * @see ITreeContentProvider#getParent(Object)
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof IMethod) 
-				return ((IMethod)element).getDeclaringType();
-			return null;
-		}
-
-		/*
-		 * @see ITreeContentProvider#hasChildren(Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		/*
-		 * @see IStructuredContentProvider#getElements(Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			return fTypes;
-		}
-
-		/*
-		 * @see IContentProvider#dispose()
-		 */
-		public void dispose() {
-		}
-
-		/*
-		 * @see IContentProvider#inputChanged(Viewer, Object, Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-		
-		public IMethod[] getAllMethods() {
-			return fMethods;
-		}
-	}
-
-	/**
-	 * Returns true if the checkbox for creating tasks is checked.
-	 */
-	public boolean getCreateTasksButtonSelection() {
-		return fCreateTasksButton.getSelection();
-	}
-
-	/**
-	 * Returns true if the checkbox for final method stubs is checked.
-	 */
-	public boolean getCreateFinalMethodStubsButtonSelection() {
-		return fCreateFinalMethodStubsButton.getSelection();
-	}
-		
-	private void updateSelectedMethodsLabel() {
-		Object[] checked= fMethodsTree.getCheckedElements();
-		int checkedMethodCount= 0;
-		for (int i= 0; i < checked.length; i++) {
-			if (checked[i] instanceof IMethod)
-				checkedMethodCount++;
-		}
-		String label= ""; //$NON-NLS-1$
-		if (checkedMethodCount == 1)
-			label= WizardMessages.getFormattedString("NewTestClassWizPage2.selected_methods.label_one", new Integer(checkedMethodCount)); //$NON-NLS-1$
-		else
-			label= WizardMessages.getFormattedString("NewTestClassWizPage2.selected_methods.label_many", new Integer(checkedMethodCount)); //$NON-NLS-1$
-		fSelectedMethodsLabel.setText(label);
-	}
-	
-	/**
-	 * Returns all the methods in the Methods tree.
-	 */
-	public IMethod[] getAllMethods() {
-		return ((MethodsTreeContentProvider)fMethodsTree.getContentProvider()).getAllMethods();
-	}
-
-	/**
-	 * Sets the focus on the type name.
-	 */		
-	protected void setFocus() {
-		fMethodsTree.getControl().setFocus();
-	}
-		
-	/**
-	 *	Use the dialog store to restore widget values to the values that they held
-	 *	last time this wizard was used to completion
-	 */
-	private void restoreWidgetValues() {
-		IDialogSettings settings= getDialogSettings();
-		if (settings != null) {
-			fCreateTasksButton.setSelection(settings.getBoolean(STORE_USE_TASKMARKER));
-			fCreateFinalMethodStubsButton.setSelection(settings.getBoolean(STORE_CREATE_FINAL_METHOD_STUBS));
-		}		
-	}	
-
-	/**
-	 * 	Since Finish was pressed, write widget values to the dialog store so that they
-	 *	will persist into the next invocation of this wizard page
-	 */
-	void saveWidgetValues() {
-		IDialogSettings settings= getDialogSettings();
-		if (settings != null) {
-			settings.put(STORE_USE_TASKMARKER, fCreateTasksButton.getSelection());
-			settings.put(STORE_CREATE_FINAL_METHOD_STUBS, fCreateFinalMethodStubsButton.getSelection());
-		}
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestSuiteCreationWizard.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestSuiteCreationWizard.java
deleted file mode 100644
index efe4a9a..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestSuiteCreationWizard.java
+++ /dev/null
@@ -1,155 +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.jdt.internal.junit.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * A wizard for creating test suites.
- */
-public class NewTestSuiteCreationWizard extends JUnitWizard {
-
-	private NewTestSuiteCreationWizardPage fPage;
-	
-	public NewTestSuiteCreationWizard() {
-		super();
-		setWindowTitle(WizardMessages.getString("Wizard.title.new.testsuite")); //$NON-NLS-1$
-		initDialogSettings();
-	}
-
-	/*
-	 * @see Wizard#createPages
-	 */	
-	public void addPages() {
-		super.addPages();
-		fPage= new NewTestSuiteCreationWizardPage();
-		addPage(fPage);
-		fPage.init(getSelection());
-	}	
-
-	/*
-	 * @see Wizard#performFinish
-	 */		
-	public boolean performFinish() {
-		IPackageFragment pack= fPage.getPackageFragment();
-		String filename= fPage.getTypeName() + ".java"; //$NON-NLS-1$
-		ICompilationUnit cu= pack.getCompilationUnit(filename);
-		if (cu.exists()) {
-			IEditorPart cu_ep= EditorUtility.isOpenInEditor(cu);
-			if (cu_ep != null && cu_ep.isDirty()) {
-				boolean saveUnsavedChanges= 
-					MessageDialog.openQuestion(fPage.getShell(), 
-						WizardMessages.getString("NewTestSuiteWiz.unsavedchangesDialog.title"), //$NON-NLS-1$
-						WizardMessages.getFormattedString("NewTestSuiteWiz.unsavedchangesDialog.message", //$NON-NLS-1$
-						filename));  
-				if (saveUnsavedChanges) {
-					ProgressMonitorDialog progressDialog= new ProgressMonitorDialog(fPage.getShell());
-					try {
-						progressDialog.run(false, false, getRunnableSave(cu_ep));
-					} catch (Exception e) {
-						JUnitPlugin.log(e);
-					}
-				}
-			}
-			IType suiteType= cu.getType(fPage.getTypeName());
-			IMethod suiteMethod= suiteType.getMethod("suite", new String[] {}); //$NON-NLS-1$
-			if (suiteMethod.exists()) {
-				try {
-				ISourceRange range= suiteMethod.getSourceRange();
-				IBuffer buf= cu.getBuffer();
-				String originalContent= buf.getText(range.getOffset(), range.getLength());
-				int start= originalContent.indexOf(NewTestSuiteCreationWizardPage.START_MARKER);
-				if (start > -1) {
-					int end= originalContent.indexOf(NewTestSuiteCreationWizardPage.END_MARKER, start);
-					if (end < 0) {
-						fPage.cannotUpdateSuiteError();
-						return false;
-					}
-				} else {
-					fPage.cannotUpdateSuiteError();
-					return false;
-				}
-				} catch (JavaModelException e) {
-					JUnitPlugin.log(e);
-					return false;
-				}
-			}
-		}
-		
-		if (finishPage(fPage.getRunnable())) {
-			if (!fPage.hasUpdatedExistingClass())
-				postCreatingType();
-			fPage.saveWidgetValues();				
-			return true;
-		}
-
-		return false;		
-	}
-
-	protected void postCreatingType() {
-		IType newClass= fPage.getCreatedType();
-		if (newClass == null)
-			return;
-		ICompilationUnit cu= newClass.getCompilationUnit();
-		if (cu.isWorkingCopy()) {
-			cu= (ICompilationUnit) cu.getOriginalElement();
-			//added here
-		}
-		IResource resource= cu.getResource();
-		if (resource != null) {
-			selectAndReveal(resource);
-			openResource(resource);
-		}
-	}
-
-	public NewTestSuiteCreationWizardPage getPage() {
-		return fPage;
-	}
-	
-	protected void initializeDefaultPageImageDescriptor() {
-		try {
-			ImageDescriptor id= ImageDescriptor.createFromURL(JUnitPlugin.makeIconFileURL("wizban/newtest_wiz.gif")); //$NON-NLS-1$
-			setDefaultPageImageDescriptor(id);
-	} catch (MalformedURLException e) {
-			// Should not happen.  Ignore.
-		}
-	}
-
-	public IRunnableWithProgress getRunnableSave(final IEditorPart cu_ep) {
-		return new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-					if (monitor == null) {
-						monitor= new NullProgressMonitor();
-					}
-					cu_ep.doSave(monitor);
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestSuiteCreationWizardPage.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestSuiteCreationWizardPage.java
deleted file mode 100644
index 5c43061..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/NewTestSuiteCreationWizardPage.java
+++ /dev/null
@@ -1,672 +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.jdt.internal.junit.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaConventions;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.junit.ui.IJUnitHelpContextIds;
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.junit.util.ExceptionHandler;
-import org.eclipse.jdt.internal.junit.util.JUnitStatus;
-import org.eclipse.jdt.internal.junit.util.JUnitStubUtility;
-import org.eclipse.jdt.internal.junit.util.LayoutUtil;
-import org.eclipse.jdt.internal.junit.util.SWTUtil;
-import org.eclipse.jdt.internal.junit.util.TestSearchEngine;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.help.WorkbenchHelp;
-
-/**
- * Wizard page to select the test classes to include
- * in the test suite.
- */
-public class NewTestSuiteCreationWizardPage extends NewTypeWizardPage {
-
-	private final static String PAGE_NAME= "NewTestSuiteCreationWizardPage"; //$NON-NLS-1$
-	private final static String CLASSES_IN_SUITE= PAGE_NAME + ".classesinsuite"; //$NON-NLS-1$
-	private final static String SUITE_NAME= PAGE_NAME + ".suitename"; //$NON-NLS-1$
-
-	protected final static String STORE_GENERATE_MAIN= PAGE_NAME + ".GENERATE_MAIN"; //$NON-NLS-1$
-	protected final static String STORE_USE_TESTRUNNER= PAGE_NAME + ".USE_TESTRUNNER";	//$NON-NLS-1$
-	protected final static String STORE_TESTRUNNER_TYPE= PAGE_NAME + ".TESTRUNNER_TYPE"; //$NON-NLS-1$
-
-
-	public static final String START_MARKER= "//$JUnit-BEGIN$"; //$NON-NLS-1$
-	public static final String END_MARKER= "//$JUnit-END$"; //$NON-NLS-1$
-	
-	private CheckboxTableViewer fClassesInSuiteTable;	
-	private Button fSelectAllButton;
-	private Button fDeselectAllButton;
-	private Label fSelectedClassesLabel;
-
-	private Label fSuiteNameLabel;
-	private Text fSuiteNameText;
-	private String fSuiteNameTextInitialValue;
-	private MethodStubsSelectionButtonGroup fMethodStubsButtons;
-	
-	private boolean fUpdatedExistingClassButton;
-
-	protected IStatus fClassesInSuiteStatus;
-	protected IStatus fSuiteNameStatus;
-	
-	public NewTestSuiteCreationWizardPage() {
-		super(true, PAGE_NAME);
-
-		fSuiteNameStatus= new JUnitStatus();
-		fSuiteNameTextInitialValue= ""; //$NON-NLS-1$
-		setTitle(WizardMessages.getString("NewTestSuiteWizPage.title")); //$NON-NLS-1$
-		setDescription(WizardMessages.getString("NewTestSuiteWizPage.description")); //$NON-NLS-1$
-		
-		String[] buttonNames= new String[] {
-			"public static void main(Strin&g[] args)", //$NON-NLS-1$
-			/* Add testrunner statement to main Method */
-			WizardMessages.getString("NewTestClassWizPage.methodStub.testRunner"), //$NON-NLS-1$
-		};
-		
-		fMethodStubsButtons= new MethodStubsSelectionButtonGroup(SWT.CHECK, buttonNames, 1);
-		fMethodStubsButtons.setLabelText(WizardMessages.getString("NewTestClassWizPage2.method.Stub.label")); //$NON-NLS-1$
-		
-		fClassesInSuiteStatus= new JUnitStatus();
-	}
-
-	/**
-	 * @see IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-		
-		Composite composite= new Composite(parent, SWT.NONE);
-		int nColumns= 4;
-		
-		GridLayout layout= new GridLayout();
-		layout.numColumns= nColumns;		
-		composite.setLayout(layout);
-	
-		createContainerControls(composite, nColumns);	
-		createPackageControls(composite, nColumns);	
-		createSeparator(composite, nColumns);
-		createSuiteNameControl(composite, nColumns);
-		setTypeName("AllTests", true); //$NON-NLS-1$
-		createSeparator(composite, nColumns);
-		createClassesInSuiteControl(composite, nColumns);
-		createMethodStubSelectionControls(composite, nColumns);
-		setControl(composite);
-		restoreWidgetValues();
-		Dialog.applyDialogFont(composite);	
-		WorkbenchHelp.setHelp(composite, IJUnitHelpContextIds.NEW_TESTSUITE_WIZARD_PAGE);			
-	}
-
-	protected void createMethodStubSelectionControls(Composite composite, int nColumns) {
-		LayoutUtil.setHorizontalSpan(fMethodStubsButtons.getLabelControl(composite), nColumns);
-		LayoutUtil.createEmptySpace(composite,1);
-		LayoutUtil.setHorizontalSpan(fMethodStubsButtons.getSelectionButtonsGroup(composite), nColumns - 1);	
-	}	
-
-	/**
-	 * Should be called from the wizard with the initial selection.
-	 */
-	public void init(IStructuredSelection selection) {
-		IJavaElement jelem= getInitialJavaElement(selection);
-		initContainerPage(jelem);
-		initTypePage(jelem);
-		doStatusUpdate();
-
-		fMethodStubsButtons.setSelection(0, false); //main
-		fMethodStubsButtons.setSelection(1, false); //add textrunner
-		fMethodStubsButtons.setEnabled(1, false); //add text
-	}
-	
-	/**
-	 * @see NewContainerWizardPage#handleFieldChanged
-	 */
-	protected void handleFieldChanged(String fieldName) {
-		super.handleFieldChanged(fieldName);
-		if (fieldName.equals(PACKAGE) || fieldName.equals(CONTAINER)) {
-			if (fieldName.equals(PACKAGE))
-				fPackageStatus= packageChanged();
-			updateClassesInSuiteTable();
-		} else if (fieldName.equals(CLASSES_IN_SUITE)) {
-			fClassesInSuiteStatus= classesInSuiteChanged();
-			fSuiteNameStatus= testSuiteChanged(); //must check this one too
-			updateSelectedClassesLabel();
-		} else if (fieldName.equals(SUITE_NAME)) {
-			fSuiteNameStatus= testSuiteChanged();
-		}
-
-		doStatusUpdate();
-	}
-
-	// ------ validation --------
-	private void doStatusUpdate() {
-		// status of all used components
-		IStatus[] status= new IStatus[] {
-			fContainerStatus,
-			fPackageStatus,
-			fSuiteNameStatus,
-			fClassesInSuiteStatus			
-		};
-		
-		// the most severe status will be displayed and the ok button enabled/disabled.
-		updateStatus(status);
-	}
-
-	/**
-	 * @see DialogPage#setVisible(boolean)
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		if (visible) {
-			setFocus();		
-			updateClassesInSuiteTable();
-			handleAllFieldsChanged();
-		}
-	}
-
-	private void handleAllFieldsChanged() {
-		handleFieldChanged(PACKAGE);
-		handleFieldChanged(CONTAINER);
-		handleFieldChanged(CLASSES_IN_SUITE);
-		handleFieldChanged(SUITE_NAME);
-	}
-
-	protected void updateClassesInSuiteTable() {
-		if (fClassesInSuiteTable != null) {
-			IPackageFragment pack= getPackageFragment();
-			if (pack == null) {
-				IPackageFragmentRoot root= getPackageFragmentRoot();
-				if (root != null)
-					pack= root.getPackageFragment(""); //$NON-NLS-1$
-				else
-					return;
-			}
-			fClassesInSuiteTable.setInput(pack);
-			fClassesInSuiteTable.setAllChecked(true);
-			updateSelectedClassesLabel();	
-		}
-	}
-	
-	protected void createClassesInSuiteControl(Composite parent, int nColumns) {
-		if (fClassesInSuiteTable == null) {
-
-			Label label = new Label(parent, SWT.LEFT);
-			label.setText(WizardMessages.getString("NewTestSuiteWizPage.classes_in_suite.label")); //$NON-NLS-1$
-			GridData gd= new GridData();
-			gd.horizontalAlignment = GridData.FILL;
-			gd.horizontalSpan= nColumns;
-			label.setLayoutData(gd);
-
-			fClassesInSuiteTable= CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
-			gd= new GridData(GridData.FILL_BOTH);
-			gd.heightHint= 80;
-			gd.horizontalSpan= nColumns-1;
-
-			fClassesInSuiteTable.getTable().setLayoutData(gd);
-			fClassesInSuiteTable.setContentProvider(new ClassesInSuitContentProvider());
-			fClassesInSuiteTable.setLabelProvider(new JavaElementLabelProvider());
-			fClassesInSuiteTable.addCheckStateListener(new ICheckStateListener() {
-				public void checkStateChanged(CheckStateChangedEvent event) {
-					handleFieldChanged(CLASSES_IN_SUITE);
-				}
-			});
-
-			Composite buttonContainer= new Composite(parent, SWT.NONE);
-			gd= new GridData(GridData.FILL_VERTICAL);
-			buttonContainer.setLayoutData(gd);
-			GridLayout buttonLayout= new GridLayout();
-			buttonLayout.marginWidth= 0;
-			buttonLayout.marginHeight= 0;
-			buttonContainer.setLayout(buttonLayout);
-	
-			fSelectAllButton= new Button(buttonContainer, SWT.PUSH);
-			fSelectAllButton.setText(WizardMessages.getString("NewTestSuiteWizPage.selectAll")); //$NON-NLS-1$
-			GridData bgd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
-			bgd.heightHint = SWTUtil.getButtonHeigthHint(fSelectAllButton);
-			bgd.widthHint = SWTUtil.getButtonWidthHint(fSelectAllButton);
-			fSelectAllButton.setLayoutData(bgd);
-			fSelectAllButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					fClassesInSuiteTable.setAllChecked(true);
-					handleFieldChanged(CLASSES_IN_SUITE);
-				}
-			});
-	
-			fDeselectAllButton= new Button(buttonContainer, SWT.PUSH);
-			fDeselectAllButton.setText(WizardMessages.getString("NewTestSuiteWizPage.deselectAll")); //$NON-NLS-1$
-			bgd= new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
-			bgd.heightHint = SWTUtil.getButtonHeigthHint(fDeselectAllButton);
-			bgd.widthHint = SWTUtil.getButtonWidthHint(fDeselectAllButton);
-			fDeselectAllButton.setLayoutData(bgd);
-			fDeselectAllButton.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					fClassesInSuiteTable.setAllChecked(false);
-					handleFieldChanged(CLASSES_IN_SUITE);
-				}
-			});
-
-			// No of selected classes label
-			fSelectedClassesLabel= new Label(parent, SWT.LEFT | SWT.WRAP);
-			fSelectedClassesLabel.setFont(parent.getFont());
-			updateSelectedClassesLabel();
-			gd = new GridData();
-			gd.horizontalSpan = 2;
-			fSelectedClassesLabel.setLayoutData(gd);
-		}
-	}
-
-	static class ClassesInSuitContentProvider implements IStructuredContentProvider {
-			
-		public Object[] getElements(Object parent) {
-			if (! (parent instanceof IPackageFragment))
-				return new Object[0];
-			IPackageFragment pack= (IPackageFragment) parent;
-			if (! pack.exists())
-				return new Object[0];
-			try {
-				ICompilationUnit[] cuArray= pack.getCompilationUnits();
-				List typesArrayList= new ArrayList();
-				for (int i= 0; i < cuArray.length; i++) {
-					ICompilationUnit cu= cuArray[i];
-					IType[] types= cu.getTypes();
-					for (int j= 0; j < types.length; j++) {
-						IType type= types[j];
-						if (type.isClass() && ! Flags.isAbstract(type.getFlags()) && TestSearchEngine.isTestImplementor(type))	
-							typesArrayList.add(types[j]);
-					}
-				}
-				return typesArrayList.toArray();
-			} catch (JavaModelException e) {
-				JUnitPlugin.log(e);
-				return new Object[0];
-			}
-		}
-		
-		public void dispose() {
-		}
-		
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-	}
-
-	/*
-	 * @see TypePage#evalMethods
-	 */
-	protected void createTypeMembers(IType type, ImportsManager imports, IProgressMonitor monitor) throws CoreException {
-		writeImports(imports);
-		if (fMethodStubsButtons.isEnabled() && fMethodStubsButtons.isSelected(0)) 
-			createMain(type);
-		type.createMethod(getSuiteMethodString(), null, false, null);	
-	}
-
-	protected void createMain(IType type) throws JavaModelException {
-		type.createMethod(fMethodStubsButtons.getMainMethod(getTypeName()), null, false, null);	
-	}
-
-	/**
-	 * Returns the string content for creating a new suite() method.
-	 */
-	public String getSuiteMethodString() throws JavaModelException {
-		IPackageFragment pack= getPackageFragment();
-		String packName= pack.getElementName();
-		StringBuffer suite= new StringBuffer("public static Test suite () {TestSuite suite= new TestSuite(\"Test for "+((packName.equals(""))?"default package":packName)+"\");\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		suite.append(getUpdatableString());
-		suite.append("\nreturn suite;}"); //$NON-NLS-1$
-		return suite.toString();
-	}
-	
-	/**
-	 * Returns the new code to be included in a new suite() or which replaces old code in an existing suite().
-	 */
-	public static String getUpdatableString(Object[] selectedClasses) throws JavaModelException {
-		StringBuffer suite= new StringBuffer();
-		suite.append(START_MARKER+"\n"); //$NON-NLS-1$
-		for (int i= 0; i < selectedClasses.length; i++) {
-			if (selectedClasses[i] instanceof IType) {
-				IType testType= (IType) selectedClasses[i];
-				IMethod suiteMethod= testType.getMethod("suite", new String[] {}); //$NON-NLS-1$
-				if (!suiteMethod.exists()) {
-					suite.append("suite.addTestSuite("+testType.getElementName()+".class);"); //$NON-NLS-1$ //$NON-NLS-2$
-				} else {
-					suite.append("suite.addTest("+testType.getElementName()+".suite());"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-		}
-		suite.append("\n"+END_MARKER); //$NON-NLS-1$
-		return suite.toString();
-	}
-	
-	private String getUpdatableString() throws JavaModelException {
-		return getUpdatableString(fClassesInSuiteTable.getCheckedElements());
-	}
-
-	/**
-	 * Runnable for replacing an existing suite() method.
-	 */
-	public IRunnableWithProgress getRunnable() {
-		return new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				try {
-					if (monitor == null) {
-						monitor= new NullProgressMonitor();
-					}
-					updateExistingClass(monitor);
-				} catch (CoreException e) {
-					throw new InvocationTargetException(e);
-				} 				
-			}
-		};
-	}
-	
-	protected void updateExistingClass(IProgressMonitor monitor) throws CoreException, InterruptedException {
-		try {
-			IPackageFragment pack= getPackageFragment();
-			ICompilationUnit cu= pack.getCompilationUnit(getTypeName() + ".java"); //$NON-NLS-1$
-			
-			if (!cu.exists()) {
-				createType(monitor);
-				fUpdatedExistingClassButton= false;
-				return;
-			}
-			
-			if (! UpdateTestSuite.checkValidateEditStatus(cu, getShell()))
-				return;
-
-			IType suiteType= cu.getType(getTypeName());
-			monitor.beginTask(WizardMessages.getString("NewTestSuiteWizPage.createType.beginTask"), 10); //$NON-NLS-1$
-			IMethod suiteMethod= suiteType.getMethod("suite", new String[] {}); //$NON-NLS-1$
-			monitor.worked(1);
-			
-			String lineDelimiter= JUnitStubUtility.getLineDelimiterUsed(cu);
-			if (suiteMethod.exists()) {
-				ISourceRange range= suiteMethod.getSourceRange();
-				if (range != null) {
-					IBuffer buf= cu.getBuffer();
-					String originalContent= buf.getText(range.getOffset(), range.getLength());
-					StringBuffer source= new StringBuffer(originalContent);
-					//using JDK 1.4
-					//int start= source.toString().indexOf(START_MARKER) --> int start= source.indexOf(START_MARKER);
-					int start= source.toString().indexOf(START_MARKER);
-					if (start > -1) {
-						//using JDK 1.4
-						//int end= source.toString().indexOf(END_MARKER, start) --> int end= source.indexOf(END_MARKER, start)
-						int end= source.toString().indexOf(END_MARKER, start);
-						if (end > -1) {
-							monitor.subTask(WizardMessages.getString("NewTestSuiteWizPage.createType.updating.suite_method")); //$NON-NLS-1$
-							monitor.worked(1);
-							end += END_MARKER.length();
-							source.replace(start, end, getUpdatableString());
-							buf.replace(range.getOffset(), range.getLength(), source.toString());
-							cu.reconcile();  
-							originalContent= buf.getText(0, buf.getLength());
-							monitor.worked(1);
-							String formattedContent=
-								JUnitStubUtility.codeFormat(originalContent, 0, lineDelimiter);
-							buf.replace(0, buf.getLength(), formattedContent);
-							monitor.worked(1);
-							cu.save(new SubProgressMonitor(monitor, 1), false);
-						} else {
-							cannotUpdateSuiteError();
-						}
-					} else {
-						cannotUpdateSuiteError();
-					}
-				} else {
-					MessageDialog.openError(getShell(), WizardMessages.getString("NewTestSuiteWizPage.createType.updateErrorDialog.title"), WizardMessages.getString("NewTestSuiteWizPage.createType.updateErrorDialog.message")); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			} else {
-				suiteType.createMethod(getSuiteMethodString(), null, true, monitor);
-				ISourceRange range= cu.getSourceRange();
-				IBuffer buf= cu.getBuffer();
-				String originalContent= buf.getText(range.getOffset(), range.getLength());
-				monitor.worked(2);
-				String formattedContent=
-					JUnitStubUtility.codeFormat(originalContent, 0, lineDelimiter);
-				buf.replace(range.getOffset(), range.getLength(), formattedContent);
-				monitor.worked(1);
-				cu.save(new SubProgressMonitor(monitor, 1), false);
-			}
-			monitor.done();
-			fUpdatedExistingClassButton= true;
-		} catch (JavaModelException e) {
-			String title= WizardMessages.getString("NewTestSuiteWizPage.error_tile"); //$NON-NLS-1$
-			String message= WizardMessages.getString("NewTestSuiteWizPage.error_message"); //$NON-NLS-1$
-			ExceptionHandler.handle(e, getShell(), title, message);
-		}
-	}
-
-	/**
-	 * Returns true iff an existing suite() method has been replaced.
-	 */
-	public boolean hasUpdatedExistingClass() {
-		return fUpdatedExistingClassButton;
-	}
-	
-	private IStatus classesInSuiteChanged() {
-		JUnitStatus status= new JUnitStatus();
-		if (fClassesInSuiteTable.getCheckedElements().length <= 0)
-			status.setWarning(WizardMessages.getString("NewTestSuiteWizPage.classes_in_suite.error.no_testclasses_selected")); //$NON-NLS-1$
-		return status;
-	}
-	
-	private void updateSelectedClassesLabel() {
-		int noOfClassesChecked= fClassesInSuiteTable.getCheckedElements().length;
-		String key= (noOfClassesChecked==1) ? "NewTestClassWizPage.treeCaption.classSelected" : "NewTestClassWizPage.treeCaption.classesSelected"; //$NON-NLS-1$ //$NON-NLS-2$
-		fSelectedClassesLabel.setText(WizardMessages.getFormattedString(key, new Integer(noOfClassesChecked)));
-	}
-
-	protected void createSuiteNameControl(Composite composite, int nColumns) {
-		fSuiteNameLabel= new Label(composite, SWT.LEFT | SWT.WRAP);
-		fSuiteNameLabel.setFont(composite.getFont());
-		fSuiteNameLabel.setText(WizardMessages.getString("NewTestSuiteWizPage.suiteName.text")); //$NON-NLS-1$
-		GridData gd= new GridData();
-		gd.horizontalSpan= 1;
-		fSuiteNameLabel.setLayoutData(gd);
-
-		fSuiteNameText= new Text(composite, SWT.SINGLE | SWT.BORDER);
-		// moved up due to 1GEUNW2
-		fSuiteNameText.setEnabled(true);
-		fSuiteNameText.setFont(composite.getFont());
-		fSuiteNameText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				handleFieldChanged(SUITE_NAME);
-			}
-		});
-		gd= new GridData();
-		gd.horizontalAlignment= GridData.FILL;
-		gd.grabExcessHorizontalSpace= true;
-		gd.horizontalSpan= nColumns - 2;
-		fSuiteNameText.setLayoutData(gd);
-		
-		Label space= new Label(composite, SWT.LEFT);
-		space.setText(" "); //$NON-NLS-1$
-		gd= new GridData();
-		gd.horizontalSpan= 1;
-		space.setLayoutData(gd);		
-	}
-	
-	/**
-	 * Gets the type name.
-	 */
-	public String getTypeName() {
-		return (fSuiteNameText==null)?fSuiteNameTextInitialValue:fSuiteNameText.getText();
-	}
-	
-	/**
-	 * Sets the type name.
-	 * @param canBeModified Selects if the type name can be changed by the user
-	 */	
-	public void setTypeName(String name, boolean canBeModified) {
-		if (fSuiteNameText == null) {
-			fSuiteNameTextInitialValue= name;
-		} else {
-			fSuiteNameText.setText(name);
-			fSuiteNameText.setEnabled(canBeModified);
-		}
-	}	
-
-	/**
-	 * Called when the type name has changed.
-	 * The method validates the type name and returns the status of the validation.
-	 * Can be extended to add more validation
-	 */
-	protected IStatus testSuiteChanged() {
-		JUnitStatus status= new JUnitStatus();
-		String typeName= getTypeName();
-		// must not be empty
-		if (typeName.length() == 0) {
-			status.setError(WizardMessages.getString("NewTestSuiteWizPage.typeName.error.name_empty")); //$NON-NLS-1$
-			return status;
-		}
-		if (typeName.indexOf('.') != -1) {
-			status.setError(WizardMessages.getString("NewTestSuiteWizPage.typeName.error.name_qualified")); //$NON-NLS-1$
-			return status;
-		}
-		IStatus val= JavaConventions.validateJavaTypeName(typeName);
-		if (val.getSeverity() == IStatus.ERROR) {
-			status.setError(WizardMessages.getString("NewTestSuiteWizPage.typeName.error.name_not_valid")+val.getMessage()); //$NON-NLS-1$
-			return status;
-		} else if (val.getSeverity() == IStatus.WARNING) {
-			status.setWarning(WizardMessages.getString("NewTestSuiteWizPage.typeName.error.name.name_discouraged")+val.getMessage()); //$NON-NLS-1$
-			// continue checking
-		}		
-
-		JUnitStatus recursiveSuiteInclusionStatus= checkRecursiveTestSuiteInclusion();
-		if (! recursiveSuiteInclusionStatus.isOK())
-			return recursiveSuiteInclusionStatus;
-			
-		IPackageFragment pack= getPackageFragment();
-		if (pack != null) {
-			ICompilationUnit cu= pack.getCompilationUnit(typeName + ".java"); //$NON-NLS-1$
-			if (cu.exists()) {
-				status.setWarning(WizardMessages.getString("NewTestSuiteWizPage.typeName.warning.already_exists")); //$NON-NLS-1$
-				fMethodStubsButtons.setEnabled(false);
-				return status;
-			}
-		}
-		fMethodStubsButtons.setEnabled(true);
-		return status;
-	}
-
-	private JUnitStatus checkRecursiveTestSuiteInclusion(){
-		if (fClassesInSuiteTable == null)
-			return new JUnitStatus();
-		String typeName= getTypeName();
-		JUnitStatus status= new JUnitStatus();
-		Object[] checkedClasses= fClassesInSuiteTable.getCheckedElements();
-		for (int i= 0; i < checkedClasses.length; i++) {
-			IType checkedClass= (IType)checkedClasses[i];
-			if (checkedClass.getElementName().equals(typeName)){
-				status.setWarning(WizardMessages.getString("NewTestSuiteCreationWizardPage.infinite_recursion")); //$NON-NLS-1$
-				return status;
-			}
-		}
-		return new JUnitStatus();
-	}
-
-	/**
-	 * Sets the focus.
-	 */		
-	protected void setFocus() {
-		fSuiteNameText.setFocus();
-	}
-
-	/**
-	 * Sets the classes in <code>elements</code> as checked.
-	 */	
-	public void setCheckedElements(Object[] elements) {
-		fClassesInSuiteTable.setCheckedElements(elements);
-	}
-	
-	protected void cannotUpdateSuiteError() {
-		MessageDialog.openError(getShell(), WizardMessages.getString("NewTestSuiteWizPage.cannotUpdateDialog.title"), //$NON-NLS-1$
-			WizardMessages.getFormattedString("NewTestSuiteWizPage.cannotUpdateDialog.message", new String[] {START_MARKER, END_MARKER})); //$NON-NLS-1$
-
-	}
-
-	private void writeImports(ImportsManager imports) {
-		imports.addImport("junit.framework.Test"); //$NON-NLS-1$
-		imports.addImport("junit.framework.TestSuite");		 //$NON-NLS-1$
-	}
-
-	/**
-	 *	Use the dialog store to restore widget values to the values that they held
-	 *	last time this wizard was used to completion
-	 */
-	private void restoreWidgetValues() {
-		IDialogSettings settings= getDialogSettings();
-		if (settings != null) {
-			boolean generateMain= settings.getBoolean(STORE_GENERATE_MAIN);
-			fMethodStubsButtons.setSelection(0, generateMain);
-			fMethodStubsButtons.setEnabled(1, generateMain);
-			fMethodStubsButtons.setSelection(1,settings.getBoolean(STORE_USE_TESTRUNNER));
-			//The next 2 lines are necessary. Otherwise, if fMethodsStubsButtons is disabled, and USE_TESTRUNNER gets enabled,
-			//then the checkbox for USE_TESTRUNNER will be the only enabled component of fMethodsStubsButton
-			fMethodStubsButtons.setEnabled(!fMethodStubsButtons.isEnabled());
-			fMethodStubsButtons.setEnabled(!fMethodStubsButtons.isEnabled());
-			try {
-				fMethodStubsButtons.setComboSelection(settings.getInt(STORE_TESTRUNNER_TYPE));
-			} catch(NumberFormatException e) {}
-		}		
-	}	
-
-	/**
-	 * 	Since Finish was pressed, write widget values to the dialog store so that they
-	 *	will persist into the next invocation of this wizard page
-	 */
-	void saveWidgetValues() {
-		IDialogSettings settings= getDialogSettings();
-		if (settings != null) {
-			settings.put(STORE_GENERATE_MAIN, fMethodStubsButtons.isSelected(0));
-			settings.put(STORE_USE_TESTRUNNER, fMethodStubsButtons.isSelected(1));
-			settings.put(STORE_TESTRUNNER_TYPE, fMethodStubsButtons.getComboSelection());
-		}
-	}	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/UpdateTestSuite.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/UpdateTestSuite.java
deleted file mode 100644
index 482f078..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/UpdateTestSuite.java
+++ /dev/null
@@ -1,275 +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.jdt.internal.junit.wizards;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-import org.eclipse.jdt.internal.junit.util.CheckedTableSelectionDialog;
-import org.eclipse.jdt.internal.junit.util.ExceptionHandler;
-import org.eclipse.jdt.internal.junit.util.JUnitStatus;
-import org.eclipse.jdt.internal.junit.util.JUnitStubUtility;
-import org.eclipse.jdt.internal.junit.util.Resources;
-
-/**
- * An object contribution action that updates existing AllTests classes.
- */
-public class UpdateTestSuite implements IObjectActionDelegate {
-	private Shell fShell;
-	private IPackageFragment fPack;
-	private ICompilationUnit fTestSuite;
-	private IMethod fSuiteMethod;
-	private static boolean fEmptySelectionAllowed= false;
-	private Object[] fSelectedTestCases;
-
-	private class UpdateAllTestsValidator implements ISelectionStatusValidator {	
-		/*
-		 * @see ISelectionValidator#validate(Object[])
-		 */
-		public IStatus validate(Object[] selection) {
-			int count= 0;
-			for (int i= 0; i < selection.length; i++) {
-				if (selection[i] instanceof IType) {
-					count++;
-				}
-			}
-			if (count == 0 && !fEmptySelectionAllowed) {
-				return new JUnitStatus(IStatus.ERROR, ""); //$NON-NLS-1$
-			}
-			
-			IStatus recursiveInclusionStatus= checkRecursiveSuiteInclusion(selection);
-			if (recursiveInclusionStatus != null && ! recursiveInclusionStatus.isOK())
-				return recursiveInclusionStatus;
-				
-			String message;
-			if (count == 1) {
-				message= WizardMessages.getFormattedString("UpdateAllTests.selected_methods.label_one", new Integer(count)); //$NON-NLS-1$
-			} else {
-				message= WizardMessages.getFormattedString("UpdateAllTests.selected_methods.label_many", new Integer(count)); //$NON-NLS-1$
-			}
-			return new JUnitStatus(IStatus.INFO, message);
-		}
-		
-		private IStatus checkRecursiveSuiteInclusion(Object[] selection){
-			IType suiteClass= fSuiteMethod.getDeclaringType();
-			for (int i= 0; i < selection.length; i++) {
-				if (selection[i] instanceof IType){
-					if (((IType)selection[i]).equals(suiteClass)){
-						return new JUnitStatus(IStatus.WARNING, WizardMessages.getString("UpdateTestSuite.infinite_recursion")); //$NON-NLS-1$
-					}
-				}
-			}
-			return null;
-		}
-	}
-
-	public UpdateTestSuite() {
-		super();
-	}
-
-	/*
-	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-	}
-
-	/*
-	 * @see IActionDelegate#run(IAction)
-	 */
-	public void run(IAction action) {		
-		ILabelProvider lprovider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
-		IStructuredContentProvider cprovider= new NewTestSuiteCreationWizardPage.ClassesInSuitContentProvider();
-	
-		/* find TestClasses already in Test Suite */
-		IType testSuiteType= fTestSuite.findPrimaryType();
-		fSuiteMethod= testSuiteType.getMethod("suite", new String[] {}); //$NON-NLS-1$
-		if (fSuiteMethod.exists()) {
-			try {
-			ISourceRange range= fSuiteMethod.getSourceRange();
-			IBuffer buf= fTestSuite.getBuffer();
-			String originalContent= buf.getText(range.getOffset(), range.getLength());
-			buf.close();
-			int start= originalContent.indexOf(NewTestSuiteCreationWizardPage.START_MARKER);
-			if (start > -1) {
-				if (originalContent.indexOf(NewTestSuiteCreationWizardPage.END_MARKER, start) > -1) {
-					CheckedTableSelectionDialog dialog= new CheckedTableSelectionDialog(fShell, lprovider, cprovider);
-					dialog.setValidator(new UpdateAllTestsValidator());
-					dialog.setTitle(WizardMessages.getString("UpdateAllTests.title")); //$NON-NLS-1$
-					dialog.setMessage(WizardMessages.getString("UpdateAllTests.message")); //$NON-NLS-1$
-					dialog.setInitialSelections(cprovider.getElements(fPack));
-					dialog.setSize(60, 25);
-					dialog.setInput(fPack);
-					if (dialog.open() == CheckedTableSelectionDialog.OK) {
-						fSelectedTestCases= dialog.getResult();
-						ProgressMonitorDialog progressDialog= new ProgressMonitorDialog(fShell);
-						try {
-							progressDialog.run(false, false, getRunnable());
-						} catch (Exception e) {
-							JUnitPlugin.log(e);
-						}
-					}
-				} else {
-					cannotUpdateSuiteError();
-				}
-			} else {
-				cannotUpdateSuiteError();
-			}
-			} catch (JavaModelException e) {
-				JUnitPlugin.log(e);
-			}
-		} else {
-			noSuiteError();
-		}
-	}
-
-	/*
-	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		fShell= JUnitPlugin.getActiveWorkbenchShell();		
-		if (selection instanceof IStructuredSelection) {
-			Object testSuiteObj= ((IStructuredSelection) selection).getFirstElement();
-			if (testSuiteObj != null && testSuiteObj instanceof ICompilationUnit) {
-				fTestSuite= (ICompilationUnit) testSuiteObj;
-				IJavaElement packIJE= fTestSuite.getParent();
-				if (packIJE instanceof IPackageFragment) {
-					fPack= (IPackageFragment) packIJE;
-				}
-			}
-		}
-	}
-	
-	private void updateTestCasesInSuite(IProgressMonitor monitor) {
-
-		try {
-			monitor.beginTask(WizardMessages.getString("UpdateAllTests.beginTask"), 5); //$NON-NLS-1$
-			if (! checkValidateEditStatus(fTestSuite, fShell))
-				return;
-				
-			ISourceRange range= fSuiteMethod.getSourceRange();
-			IBuffer buf= fTestSuite.getBuffer();
-			String originalContent= buf.getText(range.getOffset(), range.getLength());
-			StringBuffer source= new StringBuffer(originalContent);
-			//using JDK 1.4
-			//int start= source.toString().indexOf(NewTestSuiteCreationWizardPage.startMarker) --> int start= source.indexOf(NewTestSuiteCreationWizardPage.startMarker)
-			int start= source.toString().indexOf(NewTestSuiteCreationWizardPage.START_MARKER);
-			if (start > -1) {
-				//using JDK 1.4
-				//int end= source.toString().indexOf(NewTestSuiteCreationWizardPage.endMarker, start) --> int end= source.indexOf(NewTestSuiteCreationWizardPage.endMarker, start)
-				int end= source.toString().indexOf(NewTestSuiteCreationWizardPage.END_MARKER, start);
-				if (end > -1) {
-					monitor.worked(1);
-					end += NewTestSuiteCreationWizardPage.END_MARKER.length();
-					//					String updatableCode= source.substring(start,end+NewTestSuiteCreationWizardPage.endMarker.length());
-					source.replace(start, end, NewTestSuiteCreationWizardPage.getUpdatableString(fSelectedTestCases));
-					buf.replace(range.getOffset(), range.getLength(), source.toString());
-					monitor.worked(1);
-					fTestSuite.reconcile();
-					originalContent= buf.getText(0, buf.getLength());
-					monitor.worked(1);
-					String formattedContent=
-						JUnitStubUtility.codeFormat(
-							originalContent,
-							0,
-							JUnitStubUtility.getLineDelimiterUsed(fTestSuite));
-					//buf.replace(range.getOffset(), range.getLength(), formattedContent);
-					buf.replace(0, buf.getLength(), formattedContent);
-					monitor.worked(1);
-					fTestSuite.save(new SubProgressMonitor(monitor, 1), true);
-				}
-			}
-		} catch (JavaModelException e) {
-			ExceptionHandler.handle(e, fShell, WizardMessages.getString("UpdateTestSuite.update"), WizardMessages.getString("UpdateTestSuite.error")); //$NON-NLS-1$ //$NON-NLS-2$
-		} finally{
-			monitor.done();
-		}
-	}
-	
-	static boolean checkValidateEditStatus(ICompilationUnit testSuiteCu, Shell shell){
-		IStatus status= validateModifiesFiles(getTestSuiteFile(testSuiteCu));
-		if (status.isOK())	
-			return true;
-		ErrorDialog.openError(shell, WizardMessages.getString("UpdateTestSuite.update"), WizardMessages.getString("UpdateTestSuite.could_not_update"), status); //$NON-NLS-1$ //$NON-NLS-2$
-		return false;
-	}
-	
-	private static IFile getTestSuiteFile(ICompilationUnit testSuiteCu){
-		if (testSuiteCu.isWorkingCopy())
-			return (IFile)testSuiteCu.getOriginalElement().getResource();
-		else
-			return (IFile)testSuiteCu.getResource();
-	}
-	
-	private static IStatus validateModifiesFiles(IFile fileToModify) {
-		IFile[] filesToModify= {fileToModify};
-		IStatus status= Resources.checkInSync(filesToModify);
-		if (! status.isOK())
-			return status;
-		status= Resources.makeCommittable(filesToModify, null);
-		if (! status.isOK())
-			return status;
-		return new JUnitStatus();
-	}
-
-	public IRunnableWithProgress getRunnable() {
-		return new IRunnableWithProgress() {
-			public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-				if (monitor == null) {
-					monitor= new NullProgressMonitor();
-				}
-				updateTestCasesInSuite(monitor);
-			}
-		};
-	}
-
-	private void cannotUpdateSuiteError() {
-		MessageDialog.openError(fShell, WizardMessages.getString("UpdateAllTests.cannotUpdate.errorDialog.title"), //$NON-NLS-1$
-			WizardMessages.getFormattedString("UpdateAllTests.cannotUpdate.errorDialog.message", new String[] {NewTestSuiteCreationWizardPage.START_MARKER, NewTestSuiteCreationWizardPage.END_MARKER})); //$NON-NLS-1$
-
-	}
-
-	private void noSuiteError() {
-		MessageDialog.openError(fShell, WizardMessages.getString("UpdateAllTests.cannotFind.errorDialog.title"), WizardMessages.getString("UpdateAllTests.cannotFind.errorDialog.message")); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/WizardMessages.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/WizardMessages.java
deleted file mode 100644
index 567158b..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/WizardMessages.java
+++ /dev/null
@@ -1,50 +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.jdt.internal.junit.wizards;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class WizardMessages {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jdt.internal.junit.wizards.WizardMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE= ResourceBundle.getBundle(BUNDLE_NAME);
-
-	private WizardMessages() {
-	}
-
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-	
-	/**
-	 * Gets a string from the resource bundle and formats it with the argument
-	 * 
-	 * @param key	the string used to get the bundle value, must not be null
-	 */
-	public static String getFormattedString(String key, Object arg) {
-		return MessageFormat.format(getString(key), new Object[] { arg });
-	}
-
-	/**
-	 * Gets a string from the resource bundle and formats it with arguments
-	 */	
-	public static String getFormattedString(String key, Object[] args) {
-		return MessageFormat.format(getString(key), args);
-	}
-	
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/WizardMessages.properties b/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/WizardMessages.properties
deleted file mode 100644
index 07a562e..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/internal/junit/wizards/WizardMessages.properties
+++ /dev/null
@@ -1,132 +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
-###############################################################################
-#
-# Miscellaneous
-#
-Wizard.title.new.testcase=New JUnit Test Case
-Wizard.title.new.testsuite=New JUnit Test Suite
-#
-# CheckedTableSelectionDialog
-#
-CheckedTableSelectionDialog.emptyListMessage=No entries available.
-CheckedTableSelectionDialog.selectAll=&Select All
-CheckedTableSelectionDialog.deselectAll=&Deselect All
-
-#
-# NewTestCaseCreationWizard Page 1
-#
-NewTestClassWizPage.title=JUnit Test Case
-NewTestClassWizPage.description=Select the name of the new JUnit test case. Optionally, specify the class and methods to be tested.
-NewTestClassWizPage.methodStub.testRunner=&Add TestRunner statement for:
-NewTestClassWizPage.methodStub.setUp=set&Up()
-NewTestClassWizPage.methodStub.tearDown=tearDow&n()
-NewTestClassWizPage.methodStub.constructor=&constructor()
-NewTestClassWizPage.method.Stub.label=Which method stubs would you like to create?
-NewTestClassWizPage.class_to_test.label=&Class to test:
-NewTestClassWizPage.class_to_test.browse=B&rowse...
-NewTestClassWizPage.class_to_test.dialog.title=Class to Test
-NewTestClassWizPage.class_to_test.dialog.message=Class for which tests shall be written:
-NewTestClassWizPage.marker.message=\ Implement {0}().
-NewTestClassWizPage.error.superclass.not_exist=Superclass does not exist.
-NewTestClassWizPage.error.superclass.is_interface=Superclass is an interface.
-NewTestClassWizPage.error.superclass.not_implementing_test_interface=Superclass does not implement the ''{0}'' interface.
-NewTestClassWizPage.error.superclass.empty=Super class name is empty
-NewTestClassWizPage.testcase.label=&Name:
-NewTestClassWizPage.error.class_to_test.not_valid=Class to test is not valid.
-NewTestClassWizPage.error.class_to_test.not_exist=Class to test does not exist in current project.
-NewTestClassWizPage.warning.class_to_test.is_interface=Warning: Class to test ''{0}'' is an interface.
-NewTestClassWizPage.warning.class_to_test.not_visible=Warning: {0} ''{1}'' is not visible.
-NewTestClassWizPage.comment.class_to_test=Class to test for {0} {1}
-NewTestClassWizPage.error.junitNotOnbuildpath=junit.jar is not on the project\'s build path. 
-NewTestClassWizPage.info.add_to_classpath=Warning: {0} ''{1}'' is not visible.
-
-Interface=Interface
-Class=Class
-
-#
-# NewTestCaseCreationWizard Page 2
-#
-NewTestClassWizPage2.selected_methods.label_one={0} method selected.
-NewTestClassWizPage2.selected_methods.label_many={0} methods selected.
-NewTestClassWizPage2.title=Test Methods
-NewTestClassWizPage2.description=Select methods for which test method stubs should be created.
-NewTestClassWizPage2.create_tasks.text=Create &tasks for generated test methods
-NewTestClassWizPage2.create_final_method_stubs.text=Create &final method stubs
-NewTestClassWizPage2.create_constructor.text=&Create test case constructor
-NewTestClassWizPage2.methods_tree.label=Available &methods:
-NewTestClassWizPage2.selectAll=&Select All
-NewTestClassWizPage2.deselectAll=&Deselect All
-NewTestClassWizPage2.method.Stub.label=Would you like to create a method stub for main?
-
-#
-# NewTestSuiteCreationWizard
-#
-NewTestSuiteWiz.unsavedchangesDialog.title=Unsaved changes
-NewTestSuiteWiz.unsavedchangesDialog.message={0} contains unsaved changes. Save before updating?
-
-#
-# NewTestSuiteCreationWizard Page
-#
-NewTestSuiteWizPage.title=JUnit Test Suite
-NewTestSuiteWizPage.description=Create a new JUnit Test Suite class for a package
-NewTestSuiteWizPage.classes_in_suite.label=Test &Classes to include in Suite:
-NewTestSuiteWizPage.selectAll=&Select All
-NewTestSuiteWizPage.deselectAll=D&eselect All
-NewTestSuiteWizPage.createType.beginTask=Creating test suite....
-NewTestSuiteWizPage.createType.updating.suite_method=Updating existing suite() method
-NewTestSuiteWizPage.createType.updateErrorDialog.title=Error updating class
-NewTestSuiteWizPage.createType.updateErrorDialog.message=There is no source associated with this class file
-NewTestSuiteWizPage.classes_in_suite.error.no_testclasses_selected=Warning: No Test Classes selected
-NewTestSuiteWizPage.suiteName.text=&Test suite:
-NewTestSuiteWizPage.typeName.error.name_empty=Test suite name is empty
-NewTestSuiteWizPage.typeName.error.name_qualified=Test suite name must not be qualified
-NewTestSuiteWizPage.typeName.error.name_not_valid=Test suite name is not valid. 
-NewTestSuiteWizPage.typeName.error.name.name_discouraged=Warning: Test suite name is discouraged. 
-NewTestSuiteWizPage.typeName.warning.already_exists=Warning: Test suite already exists. suite() method will be replaced.
-NewTestSuiteWizPage.cannotUpdateDialog.title=Cannot update suite() method
-NewTestSuiteWizPage.cannotUpdateDialog.message=The code in suite() that the wizard replaces must start with {0} and end with {1}
-NewTestSuiteWizPage.error_tile=New Test Suite
-NewTestSuiteWizPage.error_message=Creation of new test suite failed:
-NewTestClassWizPage.treeCaption.classSelected={0} class selected
-NewTestClassWizPage.treeCaption.classesSelected={0} classes selected
-NewTestSuiteCreationWizardPage.infinite_recursion=Warning: Adding a test suite as a test case in itself will result in infinite recursion and StackOverflowError
-
-#
-# UpdateTestSuite
-#
-UpdateAllTests.selected_methods.label_one={0} type selected.
-UpdateAllTests.selected_methods.label_many={0} types selected.
-UpdateAllTests.title=Recreate Test Suite
-UpdateAllTests.message=&Test Classes to be included
-UpdateAllTests.beginTask=Recreating suite() method....
-UpdateAllTests.cannotUpdate.errorDialog.title=Cannot recreate suite() method.
-UpdateAllTests.cannotUpdate.errorDialog.message=The code in suite() that the wizard replaces must start with {0} and end with {1}
-UpdateAllTests.cannotFind.errorDialog.title=Cannot find suite() method.
-UpdateAllTests.cannotFind.errorDialog.message=No suite() method could be found.
-
-#
-# JUnitWizard
-#
-NewJUnitWizard.op_error.title=New
-NewJUnitWizard.op_error.message=Creation of element failed.
-
-#
-# ExceptionHandler
-#
-ExceptionDialog.seeErrorLogMessage= See error log for more details.
-UpdateTestSuite.infinite_recursion=Adding suite to itself may result in StackOverflowError
-UpdateTestSuite.error=Error occurred
-UpdateTestSuite.update=Update JUnit Test Suite
-UpdateTestSuite.could_not_update=The test suite could not be updated
-NewTestClassWizPage.not_on_buildpath.title=New Test Case
-NewTestClassWizPage.not_on_buildpath.message=The JUnit library \'junit.jar\' is not on the build path. Do you want to add it?
-NewTestClassWizPage.cannot_add.title=Error
-NewTestClassWizPage.cannot_add.message=Cannot add the junit.jar to the build path
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/ITestRunListener.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/ITestRunListener.java
deleted file mode 100644
index 97a7d3c..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/ITestRunListener.java
+++ /dev/null
@@ -1,109 +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.jdt.junit;
-  
-/**
- * A listener interface for observing the execution of a test run.
- * <p>
- * Clients contributing to the 
- * <code>org.eclipse.jdt.junit.testRunListener</code>
- * extension point implement this interface.
- * </p>
- * 
- * @since 2.1
- */
- public interface ITestRunListener {
-	/**
-   	 * Status constant indicating that a test passed (constant value 0).
- 	 * 
-     * @see #testFailed
- 	 */
- 	public static final int STATUS_OK= 0;
- 	/**
-	 * Status constant indicating that a test had an error an unanticipated
-	 * exception (constant value 1).
- 	 * 
-	 * @see #testFailed
- 	 */
- 	public static final int STATUS_ERROR= 1;
- 	/**
-	 * Status constant indicating that a test failed an assertion
-	 * (constant value 2).
- 	 * 
- 	 * @see #testFailed
-	 */
- 	public static final int STATUS_FAILURE= 2;
- 	/**
- 	 * A test run has started.
- 	 * 
- 	 * @param testCount the number of individual tests that will be run
- 	 */
-	public void testRunStarted(int testCount);
-	/**
- 	 * A test run has ended.
-	 *
-	 * @param elapsedTime the total elapsed time of the test run
-	 */
-	public void testRunEnded(long elapsedTime);
-	/**
-	 * A test run has been stopped prematurely.
-	 *
- 	 * @param elapsedTime the time elapsed before the test run was stopped
-	 */
-	public void testRunStopped(long elapsedTime);
-	/**
-	 * An individual test has started.
-	 * 
-	 * @param testId a unique Id identifying the test
-	 * @param testName the name of the test that started
-	 */
-	public void testStarted(String testId, String testName);
-	/**
-	 * An individual test has ended.
-	 * 
-	 * @param testId a unique Id identifying the test
-	 * @param testName the name of the test that ended
-	 */
-	public void testEnded(String testId, String testName);
-	/**
-	 * An individual test has failed with a stack trace.
-	 * 
-	 * @param testId a unique Id identifying the test
- 	 * @param testName the name of the test that failed
-	 * @param status the outcome of the test; one of 
-	 * {@link #STATUS_ERROR STATUS_ERROR} or
-	 * {@link #STATUS_FAILURE STATUS_FAILURE}
-	 * @param trace the stack trace
-	 */
-	public void testFailed(int status, String testId, String testName, String trace);	
-			
-	/**
-	 * The VM instance performing the tests has terminated.
-	 */
-	public void testRunTerminated();
-	
-	/**
- 	 * An individual test has been rerun.
-	 * 
-	 * @param testId a unique Id identifying the test
-	 * @param testClass the name of the test class that was rerun
-	 * @param testName the name of the test that was rerun
-	 * @param status the outcome of the test that was rerun; one of 
-	 * {@link #STATUS_OK STATUS_OK}, {@link #STATUS_ERROR STATUS_ERROR},
-	 * or {@link #STATUS_FAILURE STATUS_FAILURE}
-	 * @param trace the stack trace in the case of abnormal termination,
-	 * or the empty string if none
-	 */
-	public void testReran(String testId, String testClass, String testName, int status, String trace);
-}
-
-
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/JUnitCore.java b/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/JUnitCore.java
deleted file mode 100644
index 7b5cbbc..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/JUnitCore.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.eclipse.jdt.junit;
-
-import org.eclipse.jdt.internal.junit.ui.JUnitPlugin;
-
-/**
- * Class for accessing JUnit support; all functionality is provided by 
- * static methods.
- * </p>
- * 
- * @since 2.1
- */
-public class JUnitCore {
-
-	/**
-	 * Adds a listener for test runs.
-	 * 
-	 * @param listener listener to be added
-	 */
-	public static void addTestRunListener(ITestRunListener listener) {
-		JUnitPlugin.getDefault().addTestRunListener(listener);
-	}
-
-	/**
-	 * Removes a listener for test runs.
-	 * 
-	 * @param listener listener to be removed
-	 */
-	public static void removeTestRunListener(ITestRunListener listener) {
-		JUnitPlugin.getDefault().removeTestRunListener(listener);
-	}
-}
diff --git a/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/package.html b/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/package.html
deleted file mode 100644
index 63db8cf..0000000
--- a/org.eclipse.jdt.junit/src/org/eclipse/jdt/junit/package.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="Author" content="IBM">
-   <meta name="GENERATOR" content="Mozilla/4.75 [en] (Windows NT 5.0; U) [Netscape]">
-   <title>Package-level Javadoc</title>
-</head>
-<body>
-Application programming interfaces for interaction
-with the Eclipse Java Development Tools JUnit support.
-<h2>
-Package Specification</h2>
-An API to track the execution of a JUnit test run.
-</body>
-</html>
diff --git a/org.eclipse.jdt.ui.examples.javafamily/.classpath b/org.eclipse.jdt.ui.examples.javafamily/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.ui.examples.javafamily/.cvsignore b/org.eclipse.jdt.ui.examples.javafamily/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.jdt.ui.examples.javafamily/.project b/org.eclipse.jdt.ui.examples.javafamily/.project
deleted file mode 100644
index eb3644a..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/.project
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt.ui.examples.javafamily</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.core.variables</project>
-		<project>org.eclipse.debug.core</project>
-		<project>org.eclipse.debug.ui</project>
-		<project>org.eclipse.jdt.core</project>
-		<project>org.eclipse.jdt.debug</project>
-		<project>org.eclipse.jdt.debug.ui</project>
-		<project>org.eclipse.jdt.launching</project>
-		<project>org.eclipse.jdt.ui</project>
-		<project>org.eclipse.jface</project>
-		<project>org.eclipse.jface.text</project>
-		<project>org.eclipse.search</project>
-		<project>org.eclipse.text</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.editors</project>
-		<project>org.eclipse.ui.ide</project>
-		<project>org.eclipse.ui.workbench.texteditor</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.jdt.ui.examples.javafamily/ReleaseNotes.html b/org.eclipse.jdt.ui.examples.javafamily/ReleaseNotes.html
deleted file mode 100644
index 8ee466c..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/ReleaseNotes.html
+++ /dev/null
@@ -1,300 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>
-  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><title>Javafamily Release Notes</title></head><body>
-<h1 style="text-align: left;">Release Notes</h1>
-October 6, 2003<br>
-<br>
-The javafamily plug-in is a collection of prototypes that illustrate how
-the existing (mostly Java) infrastructure can be extended to support
-Java-like languages like JSP. Since this is a first cut, the project
-still contains a number of workarounds and duplications. However, it is
-our ultimate goal to eliminate all of these in order to make
-supporting Java-like languages smooth and simple.<br>
-<br>
-This initial release contains:<br>
-<ul>
-  <li>a JSP editor with reconciling,<br>
-  </li>
-  <li>a JSP aware Java search,<br>
-  </li>
-  <li>a JSP aware Rename Type refactoring that uses the new Refactoring Participants.</li>
-  <li>a Tomcat launcher and JSP source locator<br>
-  </li>
-</ul>
-In addition this document contains a collection of findings we made
-while developing the various pieces.<br>
-<h2>Known issues and limitations:</h2>
-<ul>
-  <li>Currently the JSP index isn't persisted and automatic indexing of JSP files is not enabled.
-So if you want to try the Rename Type refactoring or the JSP/Java search, you'll need to turn on
-JSP indexing via Window > Preferences > Java > JavaFamily Example > Start JSP indexing.
-Without this a JSP/Java search or a Rename Type refactoring
-will not find Java types in non-Java resources.</li>
-<li>
-JSP Search works only for types (because JSP indexing is only done for types).
-</li>
-</ul>
-<h2>Reconciling Steps</h2>
-Findings while developing the JSP Editor:<br>
-<ul>
-  <li>JSR-045 specifies a line-oriented mapping between several input
-files
-(translated-source) and one output file (translated-source or
-final-source). The output file can either be the final-source or
-multiple output files (translated-source) can serve as input for a
-next mapping (e.g. MyCustomFormat -&gt; JSP -&gt; Java). Each step
-(language-translator) produces a SMAP file (.smap). The mapping cannot
-be used to exactly map positions inside a line.</li>
-  <li>The compiler aborts compilation if it hits some severe errors.
-Because a JSP line sequence is not necessarily the same as in the
-intermediate Java file it might happen that the compiler stops very
-early on an error that corresponds to a JSP line which is at the very
-end of the file.<br>
-  </li>
-  <li>An annotation position reported on the Java file can correspond to<br>
-  </li>
-  <ul>
-    <li>an annotation in the JSP file with adapted offset and length</li>
-    <li>several annotation in the JSP file either distributed in the
-same Java partition or over several partitions</li>
-    <li>no annotation at all, e.g. if the error is caused by the
-translator or by a wrong Java build path</li>
-  </ul>
-  <li>A JSP file can <span style="font-style: italic;">include</span>
-other JSP files. If an SMAP based approach is used and one of the
-included
-JSP files is opened in the editor then we need to find the correct SMAP
-file.</li>
-  <li>For
-most of the tags in the JSP file it is not possible to
-provide a generic parsing and mapping. This has to be defined for each
-tag. The generated Java code and the mapping are tightly coupled and
-should be kept in a single class that we call tag handler. A tag
-handler might handle more than one tag. </li>
-  <li>Special tags are needed to handle non-tagged sections like HTML
-in a JSP file.<br>
-  </li>
-  <li>The default implementation of the tag handler must be extensible
-in order to allow tag lib providers to extend the handler.</li>
-  <li>Even if we decide to use an existing translator we will have to
-provide tag handlers that can map positions in a translated line back
-to the position in the corresponding source line.</li>
-  <li>Unless we don't build a fully generic editor which can handle
-several file types (e.g. XML, Java and JSP) there's no need to have
-global tag handler factory which manages different languages.</li>
-  <li>Currently only the source line is passed to the tag handler. If
-JSP
-allows that tag (lib) attributes span multiple lines then we must
-change the interface and pass sourceLineStart and sourceLineEnd.<br>
-  </li>
-</ul>
-<h2>Towards Language Neutral Search<br>
-</h2>
-We tried to reuse the Java indexing/searching infrastructure from
-jdt.core for
-non-Java JSP files. This was easily possible for the indexing side,
-because that part makes almost no assumptions about was is being
-indexed. On the other hand, searching was more challenging because the
-search infrastructure makes hardwired assumptions about the type of
-files referenced from the index. So if a file doesn't have the .java
-extensions it is assumed to be a .class file without further checking
-of its extension. As a consequence it was not possible to get *.jsp
-files from a search because the search engine would treat them as class
-files and would run in a NPE.<br>
-<br>
-To solve this issue we created a new package
-"org.eclipse.core.indexsearch" as a starting point for an indexed
-search component. The package provides a minimal but sufficient API for
-indexing/searching non-Java files and uses the existing mechanisms from
-jdt.core as far as possible.<br>
-<br>
-As a first use case for this indexed search we combined the Type Rename
-refactoring participants
-with a JSP search engine based on "org.eclipse.core.indexsearch" and a
-simple JSP parser (org.eclipse.jsp.AbstractJspParser). With this you
-can rename Java types and
-automatically rename all occurrences of the Java type in JSP tags as
-well.<br>
-<br>
-In a second use case&nbsp; we created a new Java/JSP Search page that
-combines the existing Java search with the JSP search. As a result you
-can search for a Java type and can find occurrences not only in Java
-source but in JSP tags as well. The current implementation copies some
-of the classes from "org.eclipse.jdt.internal.ui.search" in order to be
-able to show non-Java files in the Java search result viewer. However,
-the ultimate goal would be to provide a new extension point for Java
-search that would allow for plugging in arbitrary "search
-participants".<br>
-Please note: it is not possible to automatically have
-every Java search return JSP search results as well, because some
-places in Eclipse assume that the search results only contain Java
-source, and they would fail miserably when confronted with non-Java
-files, e.g. JSP files.<br>
-<br>
-<span style="font-weight: bold;">Design considerations for an indexed
-search component:</span><br>
-<ul>
-  <li>language independence</li>
-  <li>a single index and a single indexer thread for all languages</li>
-  <li>minimal API surface area</li>
-  <li>flexible queries</li>
-  <li>background indexing and searching</li>
-  <li>not tied to IResources</li>
-</ul>
-<h3>The API</h3>
-<h4>Search Engine: class <code>SearchEngine</code></h4>
-<ul>
-  <li>API entry point</li>
-  <li>combines indexing API with searching API</li>
-  <li>manages concurrency issues between indexing access and searching</li>
-  <li>indexing based on the JobManager (current impl. delegates to
-jdt.core
-IndexManager)</li>
-  <li>index requests are added as AddFileToIndex subclasses (like today)</li>
-  <li>lifecycle issues: loading/saving index</li>
-  <li>no notion of "Scope"; scope can be introduced as an
-implementation
-detail of the IIndexQuery</li>
-</ul>
-&nbsp; <code>/**<br>
-&nbsp; * Perform the given query against the index
-and return results via the resultCollector.<br>
-&nbsp; */<br>
-&nbsp;public void <span style="font-weight: bold;">search</span>(IIndexQuery
-search,
-ISearchResultCollector resultCollector,<br>
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
-&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
-IProgressMonitor progressMonitor, int waitingPolicy);<br>
-</code><br>
-<h4>Search query: interface <code>IIndexQuery</code></h4>
-An IIndexQuery is used to perform a query against the searching
-framework.<br>
-<pre>/**<br>&nbsp;* Compute the list of paths which are keying index files and add them to the given list.<br>&nbsp;*/<br>void <span style="font-weight: bold;">computePathsKeyingIndexFiles</span>(ArrayList requiredIndexKeys);<br></pre>
-<pre>/**<br>&nbsp;* Perform the query on the given index and adds the paths of all found documents to the given collector.<br> */<br>void <span style="font-weight: bold;">findIndexMatches</span>(IIndex index, PathCollector collector, IProgressMonitor progressMonitor) throws IOException;<br><br>/**<br>&nbsp;* Locate all matches of this query in the given file candidate and return them via the resultcollector. <br>&nbsp;*/<br>void <span style="font-weight: bold;">locateMatches</span>(IFile candidate, ISearchResultCollector resultCollector);</pre>
-<h4>Search results: interface <code>ISearchResultCollector</code></h4>
-<ul>
-  <li>search results reported via ISearchResultCollector</li>
-</ul>
-<code>/**<br>
-&nbsp;* Accepts the given search result.<br>
-&nbsp;*<br>
-&nbsp;* @param resource the resource in which the
-match has been found<br>
-&nbsp;* @param start the start position of the
-match, -1 if it is unknown<br>
-&nbsp;* @param length the length of the match<br>
-&nbsp;* @exception CoreException if this collector
-had a problem accepting the search result<br>
-&nbsp;*/<br>
-public void <span style="font-weight: bold;">accept</span>(IResource
-resource, int start,
-int length) throws CoreException;<br>
-</code>
-<h3>Open Issues</h3>
-<ul>
-  <li>the PathCollector API has Java-specific methods which are not used</li>
-  <li>Transparent search in WorkingCopies/Buffers: whenever a file
-resource in opened in an Editor, search should transparently search in
-the buffer and not in the underlying resource. Two options to make
-buffers available to SearchEngine:</li>
-  <ul>
-    <li>&nbsp; as argument to search(...) method</li>
-    <li>&nbsp; whenever buffer is created or deleted it is registered
-with the SearchEngine</li>
-  </ul>
-  <li>No common abstraction for the "content" being indexed:<br>
-In the API from above "content" is represented as an IFile in
-locateMatches(...) and an IResource in
-ISearchResultCollector.accept(...). However, to transparently deal with
-"buffers" there seems to be a need for a more abstract interface for
-content access.</li>
-</ul>
-<h2><br>
-  Debugging a JSP</h2>
-<p>This section describes how to launch a Tomcat server and debug a JSP and associated 
-  Java code being developed in a workspace.</p>
-<h3>Tomcat and Project Configuration</h3>
-<p>JSP debugging with the javafamily plug-in requires that you have a local installation 
-  of Tomcat, version 5.0.2 or higher. Tomcat can be configured to locate a web 
-  application in an arbitrary loation. Thus, a web application (JSPs and Java 
-  code) can be developed in an Eclipse workspace, and Tomcat can be configured 
-  to locate the web application in the associated location in the file system.</p>
-<p>A project structure conforming to that of an expanded WAR (Web application 
-  ARchive) is required. Thus, you must create a Java project that contains the 
-  following directory structure.</p>
-<ul>
-  <li><code>root-web-app-folder</code> 
-    <ul>
-      <li><code>WEB-INF</code> 
-        <ul>
-          <li><code>classes</code></li>
-          <li><code>lib</code></li>
-        </ul>
-      </li>
-    </ul>
-  </li>
-</ul>
-<p>A root container is used to store a <code>WEB-INF</code> folder, which contains 
-  a <code>web.xml</code> file describing the web application. Note that the root 
-  container may be a Java project itself. The <code>classes</code> folder contains 
-  any required class files (i.e. client code that is not part of the standard 
-  class libraries, or common libraries shipped with Tomcat). Thus, your Java project 
-  must be configured to have an output location pointing to the <code>classes</code> 
-  folder. Similarly, the <code>lib</code> folder contains any required jars. JSPs 
-  should be developed in the web application's root folder.</p>
-<p>To configure Tomcat to find the web application, a context entry is added to 
-  Tomcat's <code>server.xml</code> configuration file (found in the <code>/conf</code> 
-  directory of your Tomcat installation), for each external web application being 
-  developed. Following is an example extract of context entries for the default 
-  context (identified by the empty <code>path</code> attribute), and a sample 
-  web application being developed in an Eclipse workspace (in this case, rooted 
-  at <code>d:\testspaces\test-space\JSPs\webapps\myWebApp</code>).</p>
-<pre>&lt;Context path="" docBase="ROOT" debug="0"/&gt;<br>&lt;Context path="/myWebApp" docBase="d:\testspaces\test-space\JSPs\webapps\myWebApp" debug="0"/&gt;</pre>
-<p>The corresponding Java project is "<code>JSPs</code>", containing 
-  the folder "<code>webapps</code>", etc. The project may also contain 
-  Java source code (for example, in a "<code>src</code>" folder), and 
-  the output location is set to "<code>JSPs\webapps\myWebApp\WEB-INF\classes</code>". 
-  JSPs are created in the "<code>myWebApp</code>" folder.</p>
-<h3>Example JSP Project</h3>
-<p>An example JSP project is included in the <code>exampleJspProject.zip</code> 
-  file, found in the <code>stuff</code> folder of the <code>javafamily</code> 
-  plug-in. It demonstrates the directory structure and includes a simple JSP and 
-  associated Java class.</p>
-<h3>Setting a Breakpoint in a JSP</h3>
-<p>To create a breakpoint in a JSP, double click in the JSP edtior ruler on the 
-  line where you want the breakpoint. The breakpoint will appear in the <b>Breakpoints</b> 
-  view as well as the editor's vertical ruler. Breakpoints can also be placed 
-  in Java source code.</p>
-<h3>Launching Tomcat</h3>
-<p>To debug a JSP, Tomcat must be launched in debug mode. This can be done with 
-  a "Tomcat Server" launch configuration.</p>
-<p>To create a Tomcat launch configuration for a web application in the workspace, 
-  open the launch configuration dialog, and create a new "Tomcat Server" 
-  launch configuration. You will notice an error message indicating that the Tomcat 
-  install directory or "${catalina_home}" does not exist. To solve this 
-  problem, set the value of the <code>${catalina_home}</code> string variable 
-  in the <b>Run/Debug </b>&gt; <b>String Substitution</b> preference page to the location 
-  of your Tomcat installation. For example, "<code>d:\jakarta-tomcat-5.0.2</code>".</p>
-<p>On the Tomcat tab, also provide the location of your web application - for 
-  example "<code>JSPs\webapps\myWebApp</code>". This can also be done 
-  by pressing the <b>Browse</b> button and selecting the associated web application 
-  root folder in the workspace.</p>
-<p>Now you can launch Tomcat by pressing the <b>Debug</b> button.<br>
-</p>
-<h3>Summary to Debug a JSP</h3>
-<p>The following steps must be performed to debug a JSP</p>
-<ul>
-  <li>Install Tomcat 5.0.2 or higher</li>
-  <li>Set the value of <code>${catalina_home}</code> (<b>Run/Debug</b> &gt; <b>String 
-    Substitution</b> preference page) to point to the Tomcat installation</li>
-  <li>Create a project (web app) in your workspace in the expanded WAR format</li>
-  <li>Ensure the output location of the project is the <code>WEB-INF/classes</code> 
-    folder</li>
-  <li>Configure Tomcat to locate the web app by adding a context entry in the 
-    <code>server.xml</code> file</li>
-  <li>Code JSPs in the web app's root folder</li>
-  <li>Create a Tomcate Server launch configuration that includes the web app location 
-    (located on the "Tomcat" tab of the launch config)</li>
-</ul>
-<pre>&nbsp; </pre>
-</body></html>
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.examples.javafamily/about.html b/org.eclipse.jdt.ui.examples.javafamily/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/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/org.eclipse.jdt.ui.examples.javafamily/build.properties b/org.eclipse.jdt.ui.examples.javafamily/build.properties
deleted file mode 100644
index d185e4a..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/build.properties
+++ /dev/null
@@ -1,20 +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.javafamily.jar = src/
-bin.includes = plugin.xml,\
-               about.html,\
-               icons/,\
-               plugin.properties,\
-               *.jar,\
-               ReleaseNotes.html,\
-               stuff/
-src.includes = about.html
-source.javafamily.jar = src/
diff --git a/org.eclipse.jdt.ui.examples.javafamily/icons/full/clcl16/search_sortmatch.gif b/org.eclipse.jdt.ui.examples.javafamily/icons/full/clcl16/search_sortmatch.gif
deleted file mode 100644
index 9ed470d..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/icons/full/clcl16/search_sortmatch.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/brkp_obj.gif b/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/brkp_obj.gif
deleted file mode 100644
index 06d0079..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/brkp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/jsearch_obj.gif b/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/jsearch_obj.gif
deleted file mode 100644
index ee75bdb..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/jsearch_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/jsp_obj.gif b/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/jsp_obj.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/jsp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/tomcat_obj.gif b/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/tomcat_obj.gif
deleted file mode 100644
index 3f18c55..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/icons/full/obj16/tomcat_obj.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.javafamily/plugin.properties b/org.eclipse.jdt.ui.examples.javafamily/plugin.properties
deleted file mode 100644
index 9cb446d..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/plugin.properties
+++ /dev/null
@@ -1,64 +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= Java Development Tools JavaFamily Example
-providerName= Eclipse.org
-
-##########################################################################
-# Java Search
-##########################################################################
-JavaSearchPage.label= Java/JSP Search
-openJavaSearchPageAction.label= &Java...
-ElementNameSorter.label= &Name
-ElementNameSorter.tooltip= Sort the view by Java Element Name
-ParentNameSorter.label= &Parent Name
-ParentNameSorter.tooltip= Sort the view by Java Element Parent Name
-PathNameSorter.label= P&ath
-PathNameSorter.tooltip= Sort the view by Resource Path
-PositionSorter.label= &Line number
-PositionSorter.tooltip= Sort the view by location
-
-# Action sets
-JavaSearchActionSet.label= Java Search
-JavaSearchActionSet.description= Action set containing search related Java actions
-
-# Menus
-searchMenu.label= Se&arch
-OccurrencesInFile.label=Occurrences in File
-declarationsSubMenu.label= Dec&larations
-referencesSubMenu.label= R&eferences
-implementorsSubMenu.label= &Implementors
-readAccessSubMenu.label= &Read Access
-writeAccessSubMenu.label= &Write Access
-
-ReferencesInWorkspace.label= &Workspace
-DeclarationsInWorkspace.label= &Workspace
-
-InWorkspace.label= &Workspace
-InHierarchy.label= &Hierarchy
-InWorkingSet.label= Working &Set...
-
-##########################################################################
-# JSP Editor
-##########################################################################
-jspEditorName= JSP Editor
-
-##########################################################################
-# Tomcat Launching
-##########################################################################
-tomcatLaunchConfigurationTypeName= Tomcat Server
-catalinaHomeDescription= Root Tomcat installation directory 
-TomcatSourceLocatorName= Tomcat Source Locator
-
-##########################################################################
-# Preference Page
-##########################################################################
-JavaFamilyExamplePreferencePage.name= JavaFamily Example
diff --git a/org.eclipse.jdt.ui.examples.javafamily/plugin.xml b/org.eclipse.jdt.ui.examples.javafamily/plugin.xml
deleted file mode 100644
index 645ac09..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/plugin.xml
+++ /dev/null
@@ -1,205 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-	id="org.eclipse.jdt.ui.examples.javafamily"
-	name="%pluginName"
-	version="3.0.0"
-	provider-name="%providerName"
-	class="org.eclipse.jsp.JspUIPlugin">
-
-	<runtime>
-		<library name="javafamily.jar"/>
-		<!--packages prefixes="org.eclipse.jsp,org.eclipse.core.indexsearch"/-->
-	</runtime>
-      
-	<requires>
-		<import plugin="org.eclipse.core.resources"/>
-		<import plugin="org.eclipse.core.variables"/>
-		<import plugin="org.eclipse.jface"/>
-		<import plugin="org.eclipse.ui"/>
-		<import plugin="org.eclipse.text"/>
-		<import plugin="org.eclipse.jface.text"/>
-		<import plugin="org.eclipse.ui.workbench.texteditor"/>
-		<import plugin="org.eclipse.ui.editors"/>
-		<import plugin="org.eclipse.ui.ide"/>
-		<import plugin="org.eclipse.search"/>
-		<import plugin="org.eclipse.jdt.core"/>
-		<import plugin="org.eclipse.jdt.ui"/>
-		<import plugin="org.eclipse.debug.core"/>
-		<import plugin="org.eclipse.debug.ui"/>
-		<import plugin="org.eclipse.jdt.debug"/>
-		<import plugin="org.eclipse.jdt.launching"/>
-		<import plugin="org.eclipse.jdt.debug.ui"/>
-		<import plugin="org.eclipse.core.runtime.compatibility" optional="true"/>
-	</requires>
-
-	<extension point="org.eclipse.jdt.ui.renameParticipants">
-	  <renameParticipant
-	  	id="org.eclipse.jsp.renameParticipant.IType"
-	  	class="org.eclipse.jsp.RenameTypeParticipant">
-	  	<enablement>
-	  	  <with variable="affectedProjects">
-	  	    <iterate>
-	  	      <test property="projectNature" value="org.eclipse.jdt.core.javanature"/>
-	  	    </iterate>
-	  	  </with>
-	  	  <with variable="selection">
-	  	    <count value="1"/>
-	  	    <iterate>
-		  	  <test property="instanceof" value="org.eclipse.jdt.core.IType"/>
-	  	    </iterate>
-	  	  </with>
-	  	</enablement>
-	  </renameParticipant>
-	</extension>
-	
-	<!-- =========================================================================== -->
-	<!-- Java Search Page                                                            -->
-	<!-- =========================================================================== -->
-	<extension point="org.eclipse.search.searchPages">
-	   <page id="org.eclipse.jdt.ui.JavaSearchPage2"
-	         icon="icons/full/obj16/jsearch_obj.gif"
-	         label="%JavaSearchPage.label"
-			 sizeHint="460,160"
-			 extensions="java:90, jav:90"
-			 showScopeSection="true"
-			 class="org.eclipse.jdt.internal.ui.search2.JavaSearchPage2">
-	   </page>
-	</extension>
-	
-	<extension point="org.eclipse.search.searchResultSorters">
-		<sorter
-			id="org.eclipse.search.internal.ui.ElementNameSorter"
-			pageId="org.eclipse.jdt.ui.JavaSearchPage2"
-			label="%ElementNameSorter.label"
-			tooltip="%ElementNameSorter.tooltip"
-			icon="icons/full/clcl16/search_sortmatch.gif"
-			class="org.eclipse.jdt.internal.ui.search.ElementNameSorter">
-		</sorter>
-		<sorter
-			id="org.eclipse.search.internal.ui.ParentNameSorter"
-			pageId="org.eclipse.jdt.ui.JavaSearchPage2"
-			label="%ParentNameSorter.label"
-			tooltip="%ParentNameSorter.tooltip"
-			icon="icons/full/clcl16/search_sortmatch.gif"
-			class="org.eclipse.jdt.internal.ui.search.ParentNameSorter">
-		</sorter>
-		<sorter
-			id="org.eclipse.search.internal.ui.PathNameSorter"
-			pageId="org.eclipse.jdt.ui.JavaSearchPage2"
-			label="%PathNameSorter.label"
-			tooltip="%PathNameSorter.tooltip"
-			icon="icons/full/clcl16/search_sortmatch.gif"
-			class="org.eclipse.jdt.internal.ui.search.PathNameSorter">
-		</sorter>
-			<sorter
-			id="org.eclipse.search.internal.ui.MatchPositionSorter"
-			pageId="org.eclipse.jdt.ui.JavaFileSearch2"
-			label="%PositionSorter.label"
-			tooltip="%PositionSorter.tooltip"
-			icon="icons/full/clcl16/search_sortmatch.gif"
-			class="org.eclipse.jdt.internal.ui.search.MatchPositionSorter">
-		</sorter>
-		
-	</extension>
-
-	<!-- =========================================================================== -->
-	<!-- JSP Editor                                                                  -->
-	<!-- =========================================================================== -->
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            id="org.eclipse.jdt.ui.examples.JSPEditor"
-            name="%jspEditorName"
-            extensions="jsp"
-            icon="icons/full/obj16/jsp_obj.gif"
-            contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
-            class="org.eclipse.jdt.internal.ui.examples.jspeditor.JspEditor"
-            default="true">
-      </editor>
-   </extension>
-   
-	<!-- =========================================================================== -->
-	<!-- Tomcat Launcnhing                                                              -->
-	<!-- =========================================================================== -->
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationTypes">
-      <launchConfigurationType
-            name="%tomcatLaunchConfigurationTypeName"
-            delegate="org.eclipse.jsp.launching.TomcatLaunchDelegate"
-            modes="run, debug"
-            id="org.eclipse.jsp.TomcatConfigurationType">
-      </launchConfigurationType>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-      <launchConfigurationTabGroup
-            type="org.eclipse.jsp.TomcatConfigurationType"
-            class="org.eclipse.jsp.launching.TomcatTabGroup"
-            id="org.eclipse.jsp.TomcatTabGroup">
-      </launchConfigurationTabGroup>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-      <launchConfigurationTypeImage
-            icon="icons/full/obj16/tomcat_obj.gif"
-            configTypeID="org.eclipse.jsp.TomcatConfigurationType"
-            id="org.eclipse.jsp.image.Tomcat">
-      </launchConfigurationTypeImage>
-   </extension>
-   <extension
-         point="org.eclipse.core.variables.valueVariables">
-      <variable
-            name="catalina_home"
-            description="%catalinaHomeDescription">
-      </variable>
-   </extension>   
-   <extension point="org.eclipse.jdt.launching.classpathProviders">
-   		<classpathProvider
-   			id="org.eclipse.jsp.tomcatClasspathProvider"
-   			class="org.eclipse.jsp.launching.TomcatClasspathProvider">
-   		</classpathProvider>
-   </extension>
-   
-   <extension
-         point="org.eclipse.ui.editorActions">
-      <editorContribution
-            targetID="org.eclipse.jdt.ui.examples.JSPEditor"
-            id="org.eclipse.jsp.BreakpointRulerActions">
-         <action
-               label="%Dummy.label"
-               class="org.eclipse.jsp.launching.ToggleJspBreakpointRulerActionDelegate"
-               actionID="RulerDoubleClick"
-               id="org.eclipse.jsp.actions.ToggleJspBreakpointAction">
-         </action>
-      </editorContribution>
-   </extension>
-   
-   	<extension 
-		point="org.eclipse.ui.ide.markerImageProviders">
-		<imageprovider
-			id="org.eclipse.jsp.breakpointMarkerProvider"
-			markertype="org.eclipse.jdt.debug.javaStratumLineBreakpointMarker"
-			icon="icons/full/obj16/brkp_obj.gif">
-		</imageprovider>
-	</extension>
-   
-   <extension
-         point="org.eclipse.debug.core.sourceLocators">
-      <sourceLocator
-            name="%TomcatSourceLocator.name"
-            class="org.eclipse.jsp.launching.TomcatSourceLocator"
-            id="org.eclipse.jsp.TOMCAT_SOURCE_LOCATOR">
-      </sourceLocator>
-   </extension>
-   
-   	<extension
-		point="org.eclipse.ui.preferencePages">
-		<page name="%JavaFamilyExamplePreferencePage.name"
-			id="org.eclipse.jsp.JavaFamilyExamplePreferencePage"
-			class="org.eclipse.jsp.JavaFamilyExamplePreferencePage"
-			category= "org.eclipse.jdt.ui.preferences.JavaBasePreferencePage">
-		</page>	
-	</extension>
-      
-</plugin>
diff --git a/org.eclipse.jdt.ui.examples.javafamily/sample/Date2.java b/org.eclipse.jdt.ui.examples.javafamily/sample/Date2.java
deleted file mode 100644
index abd3330..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/sample/Date2.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Created on May 26, 2003
- *
- * To change the template for this generated file go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-
-/**
- * @author weinand
- *
- * To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class Date2 {
-	
-	public int getHours() {
-		return 8;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/sample/easy.jsp b/org.eclipse.jdt.ui.examples.javafamily/sample/easy.jsp
deleted file mode 100644
index a8a0ac3..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/sample/easy.jsp
+++ /dev/null
@@ -1,29 +0,0 @@
-<%@ page contentType="text/html" %>
-<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
-<html>
-  <head>
-    <title>JSP is Easy</title>
-  </head>
-  <body bgcolor="white">
-  <jsp:useBean id="clock" class="Date2" />
- 
-  <%! int globalCounter= 0; %> 
- 
-    <h1>JSP is as easy as ...</h1>
-
-    <%-- Calculate the sum of 1 + 2 + 3 dynamically --%>
-    1 + 2 + 3 = <c:out value="${1 + 2 + 3}" />
-    
-    <% int i= 4;
-       i= i+1; %>
-       
-	<% if (clock.getHours() < 12) { %>
-		Good morning!
-	<% } else if (clock.getHours() < 17) { %>
-		Good day!
-	<% } else { %>
-		Good evening!
-	<% } %>
- 
-  </body>
-</html>
diff --git a/org.eclipse.jdt.ui.examples.javafamily/scripts/exportplugin.xml b/org.eclipse.jdt.ui.examples.javafamily/scripts/exportplugin.xml
deleted file mode 100644
index 56ebfa5..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/scripts/exportplugin.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<project name="org.eclipse.jdt.ui.examples.javafamily" default="export" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.jdt.ui.examples.javafamily" />
-		<property name="version"  value="_3.0.0" />
-		<property name="dest"  value="${destdir}/${plugin}${version}" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		<jar 
-			jarfile="${dest}/javafamily.jar"
-			basedir="bin"
-		/>
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<copy todir="${dest}/icons">
-			<fileset dir="icons" />
-		</copy>
-		<zip zipfile="${dest}/javafamilysrc.zip">
-		    <fileset dir="src" />
-  		</zip>				
-	</target>
-</project>
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndex.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndex.java
deleted file mode 100644
index c916900..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndex.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.core.indexsearch;
-
-import java.util.HashSet;
-
-public interface IIndex {
-
-	void addRef(String word, String path);
-	
-	void remove(String path);
-	
-	void queryPrefix(HashSet result, String prefix);
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndexQuery.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndexQuery.java
deleted file mode 100644
index 3860b33..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndexQuery.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.core.indexsearch;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * An IndeyQuery is used to perform a query against the indexing framework.
- */
-public interface IIndexQuery {
-
-	/**
-	 * Compute the list of paths which are keying index files and add them to the given list.
-	 */
-	void computePathsKeyingIndexFiles(ArrayList requiredIndexKeys);
-	
-	/**
-	 * Perform the query on the given index and adds the paths of all found documents to the given collector.
-	 */
-	void findIndexMatches(IIndex index, HashSet collector, IProgressMonitor progressMonitor) throws IOException;
-
-	/**
-	 * Locate all matches of this query in the given file candidate and return them via the resultcollector. 
-	 */
-	void locateMatches(IFile candidate, ISearchResultCollector resultCollector);
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndexer.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndexer.java
deleted file mode 100644
index c9fd26b..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/IIndexer.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.core.indexsearch;
-
-import java.io.IOException;
-
-public interface IIndexer {
-
-	void index(IIndex index) throws IOException;
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/ISearchResultCollector.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/ISearchResultCollector.java
deleted file mode 100644
index 231919d..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/ISearchResultCollector.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.core.indexsearch;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-
-/**
- * A <code>ISearchResultCollector</code> collects search results from a <code>search</code>
- * query to a <code>SearchEngine</code>. Clients must implement this interface and pass
- * an instance to the <code>search(...)</code> methods.
- * <p>
- * The order of the results is unspecified. Clients must not rely on this order to display results, 
- * but they should sort these results.
- * <p>
- * Clients may implement this interface.
- * </p>
- *
- * @see SearchEngine#search
- */
-public interface ISearchResultCollector {
-	
-	/**
-	 * Accepts the given search result.
-	 *
-	 * @param resource the resource in which the match has been found
-	 * @param start the start position of the match, -1 if it is unknown
-	 * @param length the length of the match
-	 * @exception CoreException if this collector had a problem accepting the search result
-	 */
-	public void accept(IResource resource, int start, int length) throws CoreException;
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/SearchEngine.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/SearchEngine.java
deleted file mode 100644
index 1780e3b..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/core/indexsearch/SearchEngine.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.core.indexsearch;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.*;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-/**
- * A <code>SearchEngine</code> searches for java elements following a search pattern.
- * <p>
- * This class may be instantiated; it is not intended to be subclassed.
- */
-public class SearchEngine {
-	
-	static class MyIndex implements IIndex {
-		
-		private HashMap fMap= new HashMap();
-		
-		public void addRef(String word, String path) {
-			System.err.println("Index.add: " + path + " " + word);
-			HashMap words= (HashMap) fMap.get(path);
-			if (words == null) {
-				words= new HashMap();
-				fMap.put(path, words);
-			}
-			words.put(word, word);
-		}
-		
-		public void remove(String path) {
-			System.err.println("Index.remove: " + path);
-			fMap.remove(path);
-		}
-		
-		public void queryPrefix(HashSet results, String w) {
-			Iterator iter= fMap.keySet().iterator();
-			while (iter.hasNext()) {
-				String path= (String) iter.next();
-				HashMap words= (HashMap) fMap.get(path);
-				if (words.containsKey(w))
-					results.add(path);
-			}
-		}
-	}
-		
-	/* Waiting policies */
-	/**
-	 * The search operation throws an <code>org.eclipse.core.runtime.OperationCanceledException</code>
-	 * if the underlying indexer has not finished indexing the workspace.
-	 */
-	public static int CANCEL_IF_NOT_READY_TO_SEARCH = 0;
-	/**
-	 * The search operation waits for the underlying indexer to finish indexing 
-	 * the workspace before starting the search.
-	 */
-	public static int WAIT_UNTIL_READY_TO_SEARCH = 1;
-
-	
-	private static SearchEngine fgSearchEngine;
-	
-	private HashMap fIndexes= new HashMap();
-		
-	private SearchEngine() {
-	}
-	
-	/**
-	 * 
-	 * @return
-	 */
-	public static SearchEngine getSearchEngine() {
-		if (fgSearchEngine == null)
-			fgSearchEngine= new SearchEngine();
-		return fgSearchEngine;
-	}
-		
-	/**
-	 * Trigger removal of a resource to an index
-	 * Note: the actual operation is performed in background
-	 */
-	public void remove(String resourceName, IPath indexedContainer) {
-		IIndex index= getIndex(indexedContainer, false);
-		if (index != null)
-			index.remove(resourceName);
-	}
-	
-	public void add(IPath indexedContainer, IIndexer indexer) {
-		IIndex index= getIndex(indexedContainer, true);
-		try {
-			indexer.index(index);
-		} catch (IOException e) {
-		}
-	}
-
-	/**
-	 * Returns the files that correspond to the paths that have been collected.
-	 * TODO_SEARCH
-	 */
-	private IFile[] getFiles(HashSet pc, IWorkspace workspace) {
-		IFile[] result= new IFile[pc.size()];
-		int i = 0;
-		for (Iterator iter= pc.iterator(); iter.hasNext();) {
-			String resourcePath= (String)iter.next();
-			IPath path= new Path(resourcePath);
-			result[i++]= workspace.getRoot().getFile(path);
-		}
-		return result;
-	}
-	
-	/**
-	 * Perform the given query against the index and return results via the resultCollector.
-	 */
-	public void search(IIndexQuery search, ISearchResultCollector resultCollector,
-						IProgressMonitor progressMonitor, int waitingPolicy) {
-				
-		HashSet pathCollector= new HashSet();
-		IProgressMonitor pm= progressMonitor == null ? null : new SubProgressMonitor(progressMonitor, 5);
-		execute(search, pathCollector, pm);
-		
-		/* TODO_SEARCH */
-		IFile[] files= getFiles(pathCollector, ResourcesPlugin.getWorkspace());
-		for (int i= 0; i < files.length; i++) {
-			IFile file= files[i];
-			search.locateMatches(file, resultCollector);
-		}
-	}
-
-	public IIndex getIndex(IPath indexPath, boolean create) {
-		IIndex ix= (IIndex) fIndexes.get(indexPath);
-		if (create && ix == null) {
-			ix= new MyIndex();
-			fIndexes.put(indexPath, ix);
-		}
-		return ix;
-	}
-	
-	private boolean execute(IIndexQuery search, HashSet pathCollector, IProgressMonitor progressMonitor) {
-
-		if (progressMonitor != null && progressMonitor.isCanceled())
-			throw new OperationCanceledException();
-		boolean isComplete= true;
-		IIndex[] searchIndexes= getIndexes(search);
-		try {
-			int max= searchIndexes.length;
-			if (progressMonitor != null) {
-				progressMonitor.beginTask("", max); //$NON-NLS-1$
-			}
-			for (int i = 0; i < max; i++) {
-				isComplete &= search(search, searchIndexes[i], pathCollector, progressMonitor);
-				if (progressMonitor != null) {
-					if (progressMonitor.isCanceled()) {
-						throw new OperationCanceledException();
-					} else {
-						progressMonitor.worked(1);
-					}
-				}
-			}
-			return isComplete;
-		} finally {
-			if (progressMonitor != null) {
-				progressMonitor.done();
-			}
-		}
-	}
-	
-	private IIndex[] getIndexes(IIndexQuery search) {
-		IPath[] fIndexKeys= null; // cache of the keys for looking index up
-		if (fIndexKeys == null) {
-			ArrayList requiredIndexKeys= new ArrayList();
-			search.computePathsKeyingIndexFiles(requiredIndexKeys);
-			fIndexKeys= new IPath[requiredIndexKeys.size()];
-			requiredIndexKeys.toArray(fIndexKeys);
-		}
-		// acquire the in-memory indexes on the fly
-		int length = fIndexKeys.length;
-		IIndex[] indexes = new IIndex[length];
-		int count = 0;
-		for (int i = 0; i < length; i++){
-			// may trigger some index recreation work
-			IIndex index = getIndex(fIndexKeys[i], false);
-			if (index != null) indexes[count++] = index; // only consider indexes which are ready yet
-		}
-		if (count != length) {
-			System.arraycopy(indexes, 0, indexes= new IIndex[count], 0, count);
-		}
-		return indexes;
-	}
-
-	private boolean search(IIndexQuery search, IIndex index, HashSet pathCollector, IProgressMonitor progressMonitor) {
-
-		if (progressMonitor != null && progressMonitor.isCanceled())
-			throw new OperationCanceledException();
-
-		if (index == null)
-			return true;
-		try {
-			search.findIndexMatches(index, pathCollector, progressMonitor);
-			return true;
-		} catch (IOException e) {
-			return false;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/AnnotationAdapter.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/AnnotationAdapter.java
deleted file mode 100644
index 8a053aa..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/AnnotationAdapter.java
+++ /dev/null
@@ -1,40 +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.jdt.internal.ui.examples.jspeditor;
-
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.reconciler.IReconcileResult;
-import org.eclipse.jface.text.source.Annotation;
-
-
-/**
- * Adapts a temporary or persitent annotation to a reconcile result.
- * 
- * @since 3.0
- */
-public abstract class AnnotationAdapter implements IReconcileResult {
-
-	/**
-	 * Creates and returns the annotation adapted by this adapter.
-	 * 
-	 * @return an annotation (can be temporary or persistent)
-	 */
-	public abstract Annotation createAnnotation();
-	
-	/**
-	 * The position of the annotation adapted by this adapter.
-	 * 
-	 * @return the position
-	 */
-	public abstract Position getPosition();
-
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/AnnotationTextHover.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/AnnotationTextHover.java
deleted file mode 100644
index 5f26664..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/AnnotationTextHover.java
+++ /dev/null
@@ -1,83 +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.jdt.internal.ui.examples.jspeditor;
-
-import java.util.Iterator;
-
-import org.eclipse.jface.text.Assert;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.IAnnotationModel;
-
-/**
- * A simple text hover to show annotation information.
- * 
- * @since 3.0
- */
-public class AnnotationTextHover implements ITextHover {
-
-	/** This hover's annotation model */
-	private IAnnotationModel fModel;
-
-	/**
-	 * Creates a new annotation hover.
-	 * 
-	 * @param model this hover's annotation model
-	 */
-	public AnnotationTextHover(IAnnotationModel model)  {
-		Assert.isNotNull(model);
-		fModel= model;
-	}
-	
-	/*
-	 * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion)
-	 */
-	public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
-		
-		Iterator e= fModel.getAnnotationIterator();
-		while (e.hasNext()) {
-			Annotation a= (Annotation) e.next();
-			Position p= fModel.getPosition(a);
-			if (p != null && p.overlapsWith(hoverRegion.getOffset(), hoverRegion.getLength())) {
-				String msg= a.getText();
-				if (msg != null && msg.trim().length() > 0)
-					return msg;
-			}
-		}
-		
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int)
-	 */
-	public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
-		/*
-		 * XXX: If this is too slow then we might return new Region(offset, 0);
-		 */ 
-		Iterator e= fModel.getAnnotationIterator();
-		while (e.hasNext()) {
-			Annotation a= (Annotation) e.next();
-			Position p= fModel.getPosition(a);
-			if (p.overlapsWith(offset, 0)) {
-				String msg= a.getText();
-				if (msg != null && msg.trim().length() > 0)
-					return new Region(p.offset, p.length);
-			}
-		}
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/DefaultAnnotationHover.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/DefaultAnnotationHover.java
deleted file mode 100644
index d873966..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/DefaultAnnotationHover.java
+++ /dev/null
@@ -1,184 +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.jdt.internal.ui.examples.jspeditor;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.IAnnotationHover;
-import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.jface.text.source.ISourceViewer;
-
-
-/**
- * Determines all annotations for the given line, collects,
- * concatenates, and formats their messages.
- * 
- * @since 3.0
- */
-public class DefaultAnnotationHover implements IAnnotationHover {
-
-	/**
-	 * Returns the distance to the ruler line. 
-	 */
-	protected int compareRulerLine(Position position, IDocument document, int line) {
-	
-		if (position.getOffset() > -1 && position.getLength() > -1) {
-			try {
-				int annotationLine= document.getLineOfOffset(position.getOffset());
-				if (line == annotationLine)
-					return 1;
-				if (annotationLine <= line && line <= document.getLineOfOffset(position.getOffset() + position.getLength()))
-					return 2;
-			} catch (BadLocationException x) {
-				// ignored
-			}
-		}
-	
-		return 0;
-	}
-
-	/**
-	 * Selects a set of annotations from the two lists. By default, it just returns
-	 * the set of exact matches.
-	 */
-	protected List select(List exactMatch, List including) {
-		return exactMatch;
-	}
-
-	/**
-	 * Returns annotations for the ruler's line of activity.
-	 */
-	protected List getAnnotationsForLine(ISourceViewer viewer, int line) {
-	
-		IDocument document= viewer.getDocument();
-		IAnnotationModel model= viewer.getAnnotationModel();
-	
-		if (model == null)
-			return null;
-		
-		List exact= new ArrayList();
-		List including= new ArrayList();
-	
-		Iterator e= model.getAnnotationIterator();
-		HashMap messagesAtPosition= new HashMap();
-		while (e.hasNext()) {
-			Object o= e.next();
-
-			if (o instanceof Annotation) {
-			
-				Annotation a= (Annotation)o;
-				
-				Position position= model.getPosition(a);
-				if (position == null)
-					continue;
-
-				if (isDuplicateAnnotation(messagesAtPosition, position, a.getText()))
-					continue;
-
-				switch (compareRulerLine(position, document, line)) {
-					case 1:
-						exact.add(a);
-						break;
-					case 2:
-						including.add(a);
-						break;
-				}
-			}
-		}
-	
-		return select(exact, including);
-	}
-
-	private boolean isDuplicateAnnotation(Map messagesAtPosition, Position position, String message) {
-		if (messagesAtPosition.containsKey(position)) {
-			Object value= messagesAtPosition.get(position);
-			if (message.equals(value))
-				return true;
-
-			if (value instanceof List) {
-				List messages= (List)value;
-				if  (messages.contains(message))
-					return true;
-				else
-					messages.add(message);
-			} else {
-				ArrayList messages= new ArrayList();
-				messages.add(value);
-				messages.add(message);
-				messagesAtPosition.put(position, messages);
-			}
-		} else
-			messagesAtPosition.put(position, message);
-		return false;
-	}
-	
-	/*
-	 * @see IVerticalRulerHover#getHoverInfo(ISourceViewer, int)
-	 */
-	public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) {
-		List annotations= getAnnotationsForLine(sourceViewer, lineNumber);
-		if (annotations != null) {
-		
-			if (annotations.size() == 1) {
-			
-				// optimization
-				Annotation annotation= (Annotation) annotations.get(0);
-				String message= annotation.getText();
-				if (message != null && message.trim().length() > 0)
-					return formatSingleMessage(message);
-				
-			} else {
-				
-				List messages= new ArrayList();
-			
-				Iterator e= annotations.iterator();
-				while (e.hasNext()) {
-					Annotation annotation= (Annotation) e.next();
-					String message= annotation.getText();
-					if (message != null && message.trim().length() > 0)
-						messages.add(message.trim());
-				}
-			
-				if (messages.size() == 1)
-					return formatSingleMessage((String) messages.get(0));
-				
-				if (messages.size() > 1)
-					return formatMultipleMessages(messages);
-			}
-		}
-	
-		return null;
-	}
-
-	private String formatSingleMessage(String message) {
-		return message;
-	}
-
-	private String formatMultipleMessages(List messages) {
-		StringBuffer buffer= new StringBuffer();
-		Iterator e= messages.iterator();
-		while (e.hasNext())  {
-			buffer.append("- "); //$NON-NLS-1$
-			buffer.append((String) e.next());
-			buffer.append('\n');
-		}
-		return buffer.toString();
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JavaReconcileStep.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JavaReconcileStep.java
deleted file mode 100644
index 52a3361..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JavaReconcileStep.java
+++ /dev/null
@@ -1,352 +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.jdt.internal.ui.examples.jspeditor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-
-import org.eclipse.jface.text.Assert;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.reconciler.AbstractReconcileStep;
-import org.eclipse.jface.text.reconciler.DirtyRegion;
-import org.eclipse.jface.text.reconciler.DocumentAdapter;
-import org.eclipse.jface.text.reconciler.IReconcilableModel;
-import org.eclipse.jface.text.reconciler.IReconcileResult;
-import org.eclipse.jface.text.reconciler.IReconcileStep;
-import org.eclipse.jface.text.source.Annotation;
-
-import org.eclipse.ui.texteditor.DefaultAnnotation;
-
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IProblemRequestor;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.WorkingCopyOwner;
-import org.eclipse.jdt.core.compiler.IProblem;
-
-import org.eclipse.jdt.internal.core.BufferManager;
-
-
-/**
- * This reconcile step has a Java source document as 
- * input model and maintains a Java working copy as its model.
- * <p>
- * FIXME: We do not destroy the temporary working copy at the end.
- *         There are two ways to fix this:
- *         1. destroy it after each reconcile call ==> no internal model anylonger
- * 		   2. add life-cycle to reconcile steps (at least dispose/destroy)
- * </p>
- * @since 3.0
- */
-public class JavaReconcileStep extends AbstractReconcileStep {
-
-	private static class TemporaryWorkingCopyOwner extends WorkingCopyOwner  {
-
-		/*
-		 * @see org.eclipse.jdt.core.WorkingCopyOwner#createBuffer(org.eclipse.jdt.core.ICompilationUnit)
-		 */
-		public IBuffer createBuffer(ICompilationUnit workingCopy) {
-			// FIXME: Don't know how to get a buffer without using internal API.
-			return new BufferManager().createBuffer(workingCopy);
-		}
-	}
-
-	private static class ProblemAdapter extends AnnotationAdapter  {
-		
-		private IProblem fProblem;
-		private Position fPosition;
-		
-		ProblemAdapter(IProblem problem)  {
-			fProblem= problem;
-		}
-
-		public Position getPosition()  {
-			if (fPosition == null)
-				fPosition= createPositionFromProblem();
-			return fPosition;
-		}
-
-		public Annotation createAnnotation() {
-			int start= fProblem.getSourceStart();
-			if (start < 0)
-				return null;
-				
-			int length= fProblem.getSourceEnd() - fProblem.getSourceStart() + 1;
-			if (length < 0)
-				return null;
-
-			int type= IMarker.SEVERITY_INFO;
-			if (fProblem.isError())
-				type= IMarker.SEVERITY_ERROR;
-			else if (fProblem.isWarning())
-				type= IMarker.SEVERITY_WARNING;
-				
-			return new DefaultAnnotation(IMarker.PROBLEM, type, true, fProblem.getMessage());
-		}
-		
-		private Position createPositionFromProblem() {
-			int start= fProblem.getSourceStart();
-			if (start < 0)
-				return null;
-				
-			int length= fProblem.getSourceEnd() - fProblem.getSourceStart() + 1;
-			if (length < 0)
-				return null;
-				
-			return new Position(start, length);
-		}
-	}
-
-	private class ProblemRequestor implements IProblemRequestor  {
-		
-		private List fCollectedProblems;
-		private boolean fIsActive= false;
-		private boolean fIsRunning= false;
-	
-		/*
-		 * @see IProblemRequestor#beginReporting()
-		 */
-		public void beginReporting() {
-			fIsRunning= true;
-			fCollectedProblems= new ArrayList();
-		}
-		
-		/*
-		 * @see IProblemRequestor#acceptProblem(IProblem)
-		 */
-		public void acceptProblem(IProblem problem) {
-			if (isActive())
-				fCollectedProblems.add(problem);
-		}
-	
-		/*
-		 * @see IProblemRequestor#endReporting()
-		 */
-		public void endReporting() {
-			fIsRunning= false;
-
-// WAS:
-//			if (!isActive())
-//				return;
-//				
-//			if (isCanceled())
-//				return;
-		}
-		
-		public IReconcileResult[] getReconcileResult() {
-			Assert.isTrue(!fIsRunning);
-
-			int size= fCollectedProblems.size();
-			IReconcileResult[] result= new IReconcileResult[size];
-
-			for (int i= 0; i < size; i++)
-				result[i]= new ProblemAdapter((IProblem)fCollectedProblems.get(i));
-			
-			return result;
-		}
-		
-		/*
-		 * @see IProblemRequestor#isActive()
-		 */
-		public boolean isActive() {
-			return fIsActive && fCollectedProblems != null && !isCanceled();
-		}
-		
-		/**
-		 * Sets the active state of this problem requestor.
-		 * 
-		 * @param isActive the state of this problem requestor
-		 */
-		public void setIsActive(boolean isActive) {
-			if (fIsActive != isActive) {
-				fIsActive= isActive;
-				if (fIsActive)
-					startCollectingProblems();
-				else
-					stopCollectingProblems();
-			}
-		}
-
-		/**
-		 * Tells this annotation model to collect temporary problems from now on.
-		 */
-		private void startCollectingProblems() {
-			fCollectedProblems= new ArrayList();
-		}
-
-		/**
-		 * Tells this annotation model to no longer collect temporary problems.
-		 */
-		private void stopCollectingProblems() {
-			// empty implementation
-		}
-	}
-
-	/**
-	 * Adapts an <code>ICompilationUnit</code> to the <code>ITextModel</code> interface.
-	 */
-	class CompilationUnitAdapter implements IReconcilableModel {
-		
-		private ICompilationUnit fCompilationUnit;
-		
-		CompilationUnitAdapter(ICompilationUnit cu) {
-			fCompilationUnit= cu;
-		}
-		
-		private ICompilationUnit getCompilationUnit() {
-			return fCompilationUnit;
-		}
-	}
-
-	private CompilationUnitAdapter fWorkingCopy;
-	private ProblemRequestor fProblemRequestor;
-	private WorkingCopyOwner fTemporaryWorkingCopyOwner;
-
-	/**
-	 * Creates the last reconcile step of the pipe.
-	 */
-	public JavaReconcileStep(IFile jspFile) {
-		Assert.isNotNull(jspFile);
-		fTemporaryWorkingCopyOwner= new TemporaryWorkingCopyOwner();
-		try {
-			fWorkingCopy= new CompilationUnitAdapter(createTemporaryWorkingCopy(jspFile));
-		} catch (JavaModelException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * Creates an intermediate reconcile step which adds
-	 * the given step to the pipe.
-	 */
-	public JavaReconcileStep(IReconcileStep step, IFile jspFile) {
-		super(step);
-		Assert.isNotNull(jspFile);
-		fTemporaryWorkingCopyOwner= new TemporaryWorkingCopyOwner();
-		try {
-			fWorkingCopy= new CompilationUnitAdapter(createTemporaryWorkingCopy(jspFile));
-		} catch (JavaModelException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/*
-	 * @see AbstractReconcileStep#reconcileModel(DirtyRegion, IRegion)
-	 */
-	protected IReconcileResult[] reconcileModel(DirtyRegion dirtyRegion, IRegion subRegion) {
-		Assert.isTrue(getInputModel() instanceof DocumentAdapter, "wrong model"); //$NON-NLS-1$
-
-		ICompilationUnit cu= fWorkingCopy.getCompilationUnit(); 
-		// Cannot reconcile if CU could not be built
-		if (cu == null)
-			return null;
-
-		System.out.println("reconciling java model..."); //$NON-NLS-1$
-		
-		IBuffer buffer;
-		try {
-			buffer= cu.getBuffer();
-		} catch (JavaModelException e) {
-			e.printStackTrace();
-			buffer= null;
-		}
-		
-		if (buffer != null)
-			buffer.setContents(((DocumentAdapter)getInputModel()).getDocument().get());
-
-		try {
-			synchronized (cu) {
-				fProblemRequestor.setIsActive(true);
-				cu.reconcile(true, getProgressMonitor());
-			}
-		} catch (JavaModelException ex) {
-			ex.printStackTrace();
-		} finally  {
-			fProblemRequestor.setIsActive(false);
-		}
-
-		return fProblemRequestor.getReconcileResult();
-	}
-
-	/*
-	 * @see AbstractReconcileStep#getModel()
-	 */
-	public IReconcilableModel getModel() {
-		return fWorkingCopy;
-	}
-	
-	/*
-	 * @see org.eclipse.jdt.internal.corext.util.WorkingCopyUtil#getNewWorkingCopy
-	 */
-	private ICompilationUnit createTemporaryWorkingCopy(IFile jspFile) throws JavaModelException {
-
-		IContainer parent= jspFile.getParent();
-		IPackageFragment packageFragment= null;
-		IJavaElement je= JavaCore.create(parent);
-		
-		if (je == null || !je.exists())
-			return null;
-
-		switch (je.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT:
-				je= je.getParent();
-				// fall through
-
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				IPackageFragmentRoot packageFragmentRoot= (IPackageFragmentRoot)je;
-				packageFragment= packageFragmentRoot.getPackageFragment(IPackageFragmentRoot.DEFAULT_PACKAGEROOT_PATH);
-				break;
-
-			case IJavaElement.JAVA_PROJECT:
-				IJavaProject jProject= (IJavaProject)je;
-	
-				if (!jProject.exists())  {
-					System.out.println("Abort reconciling: cannot create working copy: JSP is not in a Java project"); //$NON-NLS-1$
-					return null;
-				}
-					
-				packageFragmentRoot= null;
-				IPackageFragmentRoot[] packageFragmentRoots= jProject.getPackageFragmentRoots();
-				int i= 0;
-				while (i < packageFragmentRoots.length) {
-					if (!packageFragmentRoots[i].isArchive() && !packageFragmentRoots[i].isExternal()) {
-						packageFragmentRoot= packageFragmentRoots[i];
-						break;
-					}
-					i++;
-				}
-				if (packageFragmentRoot == null) {
-					System.out.println("Abort reconciling: cannot create working copy: JSP is not in a Java project with source package fragment root"); //$NON-NLS-1$
-					return null;
-				}
-				packageFragment= packageFragmentRoot.getPackageFragment(IPackageFragmentRoot.DEFAULT_PACKAGEROOT_PATH);
-				break;
-
-			default :
-				return null;
-		}
-		
-		fProblemRequestor= new ProblemRequestor();
-		
-		return packageFragment.getCompilationUnit("Demo.java").getWorkingCopy(fTemporaryWorkingCopyOwner, fProblemRequestor, getProgressMonitor()); //$NON-NLS-1$
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaReconcileStep.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaReconcileStep.java
deleted file mode 100644
index e2165ca..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaReconcileStep.java
+++ /dev/null
@@ -1,141 +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.jdt.internal.ui.examples.jspeditor;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-
-import org.eclipse.jface.text.Assert;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.reconciler.AbstractReconcileStep;
-import org.eclipse.jface.text.reconciler.DirtyRegion;
-import org.eclipse.jface.text.reconciler.IReconcileStep;
-import org.eclipse.jface.text.reconciler.IReconcileResult;
-import org.eclipse.jface.text.reconciler.IReconcilableModel;
-import org.eclipse.jface.text.reconciler.DocumentAdapter;
-import org.eclipse.jface.text.source.ITranslator;
-
-import org.eclipse.jsp.JspTranslator;
-
-/**
- * This reconcile step has a JSP source document as 
- * input model and maintains a document that contains the Java
- * source.
- *
- * @since 3.0
- */
-public class Jsp2JavaReconcileStep extends AbstractReconcileStep {
-	
-	private DocumentAdapter fModel;
-	private ITranslator fJspTranslator;
-
-	/**
-	 * Creates the last reconcile step of the pipe.
-	 */
-	public Jsp2JavaReconcileStep() {
-		initialize();
-	}
-
-	/**
-	 * Creates an intermediate reconcile step which adds
-	 * the given step to the pipe.
-	 */
-	public Jsp2JavaReconcileStep(IReconcileStep step) {
-		super(step);
-		initialize();
-	}
-	
-	protected void initialize()  {
-		fJspTranslator= new JspTranslator();
-		fJspTranslator.setTagHandlerFactory(new Jsp2JavaTagHandlerFactory());
-	}
-
-	/*
-	 * @see AbstractReconcileStep#reconcileModel(DirtyRegion, IRegion)
-	 */
-	protected IReconcileResult[] reconcileModel(DirtyRegion dirtyRegion, IRegion subRegion) {
-		Assert.isTrue(getInputModel() instanceof DocumentAdapter, "wrong model"); //$NON-NLS-1$
-
-		System.out.println("reconciling jsp2java..."); //$NON-NLS-1$
-		
-		Reader reader= new StringReader(((DocumentAdapter)fInputModel).getDocument().get());
-		try {
-			String javaSource= fJspTranslator.translate(reader, "Demo"); //$NON-NLS-1$
-			fModel= new DocumentAdapter(new Document(javaSource));
-		} catch (IOException e) {
-			e.printStackTrace();
-			return null;
-		}
-
-		// This reconcile step does not create own results
-		return null;
-	}
-
-	/*
-	 * @see AbstractReconcileStep#getModel()
-	 */
-	public IReconcilableModel getModel() {
-		return fModel;
-	}
-
-	/*
-	 * @see AbstractReconcileStep#convertToInputModel(IReconcileResult[])
-	 */
-	protected IReconcileResult[] convertToInputModel(IReconcileResult[] inputResults) {
-
-		if (inputResults == null)
-			return null;
-
-		// the "only" thing we need to do is to adapt the positions
-		int[] smap= fJspTranslator.getLineMapping();
-
-		for (int i= 0; i < inputResults.length; i++) {				
-		
-			if (isCanceled())
-				return null;
-
-			if (!(inputResults[i] instanceof AnnotationAdapter))
-				continue;
-				
-			AnnotationAdapter result= (AnnotationAdapter)inputResults[i];
-			Position pos= result.getPosition();
-			int javaLine;
-			try {
-				javaLine= fModel.getDocument().getLineOfOffset(pos.offset);
-				
-				// Adjust offset to be relative to line beginning
-				pos.offset -= fModel.getDocument().getLineOffset(javaLine);
-				int relativeLineOffsetInJava= pos.offset;
-
-				int jspLine= smap[javaLine + 1]; // document is 0-based, smap is 1-based
-				
-				// Add Jsp line offset
-				pos.offset += ((DocumentAdapter)getInputModel()).getDocument().getLineOffset(jspLine-1); // document is 0-based, smap is 1-based
-				
-				String jspLineStr= ((DocumentAdapter)getInputModel()).getDocument().get(((DocumentAdapter)getInputModel()).getDocument().getLineOffset(jspLine-1), ((DocumentAdapter)getInputModel()).getDocument().getLineLength(jspLine-1));
-
-				// XXX: Once partitioner is in place the partition can be used to ease section detection
-				int offsetInLine= fJspTranslator.backTranslateOffsetInLine(jspLineStr, null, relativeLineOffsetInJava, null);
-				if (offsetInLine > 0)
-					pos.offset += offsetInLine;
-
-			} catch (BadLocationException e) {
-				e.printStackTrace();
-			}
-		}
-		return inputResults;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaTagHandler.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaTagHandler.java
deleted file mode 100644
index 1135698..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaTagHandler.java
+++ /dev/null
@@ -1,175 +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.jdt.internal.ui.examples.jspeditor;
-
-import java.io.IOException;
-
-import org.eclipse.jface.text.Assert;
-import org.eclipse.jface.text.source.ITagHandler;
-import org.eclipse.jface.text.source.ITranslatorResultCollector;
-
-/**
- * 
- * @since 3.0
- */
-public class Jsp2JavaTagHandler implements ITagHandler {
-
-	private boolean fInUseBean;
-	private boolean fInTagLib;
-	private String fTagLibValue;
-	private String fClass;
-	private String fId;
-	private String fSource;
-	private boolean fInDeclaration;
-	private boolean fInJavaSection;
-	
-
-	/*
-	 * @see org.eclipse.jface.text.source.ITagHandler#canHandleTag(java.lang.String)
-	 */
-	public boolean canHandleTag(String tag) {
-		return true;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.source.ITagHandler#canHandleText(java.lang.String)
-	 */
-	public boolean canHandleText(String text) {
-		return true;
-	}
-
-	public void reset(String startTag)  {
-		fInUseBean= "jsp:useBean".equals(startTag); //$NON-NLS-1$
-		fInTagLib= "c:out".equals(startTag); //$NON-NLS-1$
-		fInJavaSection= "<%".equals(startTag); //$NON-NLS-1$
-		fInDeclaration= "<%!".equals(startTag); //$NON-NLS-1$
-	}
-	/*
-	 * @see org.eclipse.jface.text.source.ITagHandler#addAttribute(java.lang.String, java.lang.String)
-	 */
-	public void addAttribute(String name, String value, int sourceLineNumber) {
-		if (fInUseBean) {
-			if ("id".equals(name)) //$NON-NLS-1$
-				fId= value;
-			else if ("class".equals(name)) //$NON-NLS-1$
-				fClass= value;
-		}
-		if (fInTagLib) {
-			fTagLibValue= value;
-		}
-		if ("source".equals(name)) //$NON-NLS-1$
-			fSource= value;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.source.ITagHandler#backTranslateOffsetInLine(java.lang.String, int)
-	 */
-	public int backTranslateOffsetInLine(String originalLine, String translatedLine, int offsetInTranslatedLine) {
-		int javaPartitionStart= 0;
-		if (originalLine.indexOf("<%") != -1) //$NON-NLS-1$
-			javaPartitionStart= handleJavaSection(originalLine, offsetInTranslatedLine);
-		else if (originalLine.indexOf("<jsp:useBean id=\"") != -1)  { //$NON-NLS-1$
-			javaPartitionStart= handleUseBeanTag(originalLine, offsetInTranslatedLine);
-		} else if (originalLine.indexOf("<c:out value=\"${") != -1)  { //$NON-NLS-1$
-			javaPartitionStart= handleTagLib(originalLine, offsetInTranslatedLine);
-		}
-		return javaPartitionStart;
-	}
-
-	private int handleJavaSection(String jspLineStr, int relativeLineOffsetInJava)  {
-		return jspLineStr.indexOf("<%") + 3; //$NON-NLS-1$
-	}
-
-	private int handleTagLib(String jspLineStr, int relativeLineOffsetInJava)  {
-		int javaFileOffset= "System.out.println(".length(); //$NON-NLS-1$
-		return jspLineStr.indexOf("<c:out value=\"${") + 16 - javaFileOffset; //$NON-NLS-1$
-	}
-	
-	/*
-	 * This is a good example where the relative line offset in the Java
-	 * document cannot be directly mapped back to Jsp document.
-	 */
-	private int handleUseBeanTag(String jspLineStr, int relativeLineOffsetInJava)  {
-
-		int javaPartitionStart;
-
-		int variableNameStart= jspLineStr.indexOf("<jsp:useBean id=\"") + 17; //$NON-NLS-1$
-		int variableNameLength= Math.max(0, jspLineStr.indexOf('"', variableNameStart) - variableNameStart);
-
-		int typeStart= jspLineStr.indexOf("class=\"") + 7; //$NON-NLS-1$
-		int typeLength= Math.max(0, jspLineStr.indexOf('"', typeStart) - typeStart);
-					
-		if (relativeLineOffsetInJava < typeLength)  {
-			javaPartitionStart= typeStart;
-		} else if (relativeLineOffsetInJava < typeLength + variableNameLength)
-			javaPartitionStart= variableNameStart;
-		else
-			javaPartitionStart= typeStart;
-
-		// start relative to Jsp line start
-		return javaPartitionStart - relativeLineOffsetInJava;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.source.ITagHandler#processEndTag(ITranslatorResultCollector, int)
-	 */
-	public void processEndTag(ITranslatorResultCollector resultCollector, int sourceLineNumber) throws IOException {
-		Assert.isTrue(resultCollector instanceof JspTranslatorResultCollector);
-
-		JspTranslatorResultCollector jspResultCollector= (JspTranslatorResultCollector)resultCollector;
-		
-		if (fInUseBean) {
-			if (fId != null && fClass != null) {
-				jspResultCollector.appendLocalDeclaration(fClass + " " + fId + "= new " + fClass + "();\n", sourceLineNumber); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-				fId= fClass= null;
-			}
-			fInUseBean= false;
-		}
-		if (fInTagLib && fTagLibValue != null) {
-			jspResultCollector.appendContent("System.out.println(" + fTagLibValue.substring(2, fTagLibValue.length() - 1) + ");\n", sourceLineNumber);   //$NON-NLS-1$ //$NON-NLS-2$
-			fTagLibValue= null;
-			fInTagLib= false;
-		}
-		if (fInJavaSection)  {
-			int i= 0;
-			StringBuffer out= new StringBuffer();
-			while (i < fSource.length()) {
-				char c= fSource.charAt(i++);
-				if (c == '\n') {
-					jspResultCollector.appendContent(out.toString() + "\n", sourceLineNumber++); //$NON-NLS-1$
-					out.setLength(0);
-				} else {
-					out.append(c);	
-				}
-			}
-			if (out.length() > 0)  {
-				jspResultCollector.appendContent(out.toString() + "\n", sourceLineNumber); //$NON-NLS-1$
-			}
-		}
-		if (fInDeclaration)  {
-			int i= 0;
-			StringBuffer out= new StringBuffer();
-			while (i < fSource.length()) {
-				char c= fSource.charAt(i++);
-				if (c == '\n') {
-					jspResultCollector.appendDeclaration(out.toString() + "\n", sourceLineNumber++); //$NON-NLS-1$
-					out.setLength(0);
-				} else {
-					out.append(c);	
-				}
-			}
-			if (out.length() > 0)  {
-				jspResultCollector.appendDeclaration(out.toString() + "\n", sourceLineNumber); //$NON-NLS-1$
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaTagHandlerFactory.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaTagHandlerFactory.java
deleted file mode 100644
index 4cd8b82..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/Jsp2JavaTagHandlerFactory.java
+++ /dev/null
@@ -1,42 +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.jdt.internal.ui.examples.jspeditor;
-
-import org.eclipse.jface.text.source.ITagHandler;
-import org.eclipse.jface.text.source.ITagHandlerFactory;
-
-/**
- * First cut of JSP to Java tag handler factory.
- * Only one handler is used to do the job.
- * 
- * @since 3.0
- */
-public class Jsp2JavaTagHandlerFactory implements ITagHandlerFactory {
-	
-	private ITagHandler fTagHandler= new Jsp2JavaTagHandler();
-
-	/*
-	 * @see org.eclipse.jface.text.source.IHandlerFactory#getHandler(java.lang.String)
-	 */
-	public ITagHandler getHandler(String tag) {
-		fTagHandler.reset(tag);
-		return fTagHandler;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.source.IHandlerFactory#findHandler(java.lang.String)
-	 */
-	public ITagHandler findHandler(String text) {
-		return fTagHandler;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspEditor.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspEditor.java
deleted file mode 100644
index 18cbe5b..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspEditor.java
+++ /dev/null
@@ -1,68 +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.jdt.internal.ui.examples.jspeditor;
-
-import org.eclipse.jface.text.source.IAnnotationAccess;
-
-import org.eclipse.ui.editors.text.FileDocumentProvider;
-import org.eclipse.ui.editors.text.TextEditor;
-
-import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
-import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
-
-
-/**
- * A simple JSP Editor.
- * 
- * @since 3.0
- */
-public class JspEditor extends TextEditor {
-
-	/**
-	 * The annotation preferences.
-	 * @since 2.1
-	 */
-	private MarkerAnnotationPreferences fAnnotationPreferences;
-
-	/**
-	 * Creates a new JSP editor.
-	 */
-	public JspEditor() {
-		super();
-		setSourceViewerConfiguration(new JspSourceViewerConfiguration(this));
-		setDocumentProvider(new FileDocumentProvider());
-		fAnnotationPreferences= new MarkerAnnotationPreferences();
-		
-		
-		/*
-		 * FIXME:
-		 * This would be the right thing to do. Currently
-		 * we share the preferences with the text editor.
-		 */
-//		setPreferenceStore(JspUIPlugin.getDefault().getPreferenceStore());
-	}
-
-	/*
-	 * @see TextEditor#createAnnotationAccess()
-	 */
-	protected IAnnotationAccess createAnnotationAccess() {
-		return new DefaultMarkerAnnotationAccess(fAnnotationPreferences);
-	}
-	
-	/*
-	 * @see org.eclipse.ui.editors.text.TextEditor#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		fAnnotationPreferences= null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspReconcilingStrategy.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspReconcilingStrategy.java
deleted file mode 100644
index d3f9e28..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspReconcilingStrategy.java
+++ /dev/null
@@ -1,161 +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.jdt.internal.ui.examples.jspeditor;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.jface.text.reconciler.DirtyRegion;
-import org.eclipse.jface.text.reconciler.IReconcileStep;
-import org.eclipse.jface.text.reconciler.IReconcileResult;
-import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
-import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
-import org.eclipse.jface.text.reconciler.DocumentAdapter;
-import org.eclipse.jface.text.source.Annotation;
-import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.jface.text.source.ISourceViewer;
-
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Reconciling strategy for Java parts in JSP files.
- *
- * @since 3.0
- */
-public class JspReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
-
-	private IReconcileStep fFirstStep;
-	private ITextEditor fTextEditor;
-	private IProgressMonitor fProgressMonitor;
-	
-	public JspReconcilingStrategy(ISourceViewer sourceViewer, ITextEditor textEditor) {
-		fTextEditor= textEditor;
-		IReconcileStep javaReconcileStep= new JavaReconcileStep(getFile());
-		fFirstStep= new Jsp2JavaReconcileStep(javaReconcileStep);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#setDocument(org.eclipse.jface.text.IDocument)
-	 */
-	public void setDocument(IDocument document) {
-		fFirstStep.setInputModel(new DocumentAdapter(document));
-	}
-	
-	/*
-	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.reconciler.DirtyRegion, org.eclipse.jface.text.IRegion)
-	 */
-	public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
-		removeTemporaryAnnotations();
-		process(fFirstStep.reconcile(dirtyRegion, subRegion));
-	}
-	
-	/*
-	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategy#reconcile(org.eclipse.jface.text.IRegion)
-	 */
-	public void reconcile(IRegion partition) {
-		removeTemporaryAnnotations();
-		process(fFirstStep.reconcile(partition));
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension#setProgressMonitor(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void setProgressMonitor(IProgressMonitor monitor) {
-		fFirstStep.setProgressMonitor(monitor);
-		fProgressMonitor= monitor;
-		
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension#initialReconcile()
-	 */
-	public void initialReconcile() {
-		fFirstStep.reconcile(null);
-		
-	}
-
-	private void process(final IReconcileResult[] results) {
-		
-		if (results == null)
-			return;
-
-		IRunnableWithProgress runnable= new WorkspaceModifyOperation(null) 	 {
-			/*
-			 * @see org.eclipse.ui.actions.WorkspaceModifyOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
-			 */
-			protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-				for (int i= 0; i < results.length; i++) {				
-
-					if (fProgressMonitor != null && fProgressMonitor.isCanceled())
-						return;
-		
-					if (!(results[i] instanceof AnnotationAdapter))
-						continue;
-				
-					AnnotationAdapter result= (AnnotationAdapter)results[i];
-					Position pos= result.getPosition();
-					
-					Annotation annotation= result.createAnnotation();
-					getAnnotationModel().addAnnotation(annotation, pos);
-				}
-			}
-		};
-		try {
-			runnable.run(null);
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	private IAnnotationModel getAnnotationModel()  {
-		return fTextEditor.getDocumentProvider().getAnnotationModel(fTextEditor.getEditorInput());
-	}
-
-	/*
-	 * XXX: A "real" implementation must be smarter
-	 * 		i.e. don't remove and add the annotations
-	 * 		which are the same.
-	 */	
-	private void removeTemporaryAnnotations() {
-		Iterator iter= getAnnotationModel().getAnnotationIterator();
-		while (iter.hasNext())  {
-			Object annotation= iter.next();
-			if (annotation instanceof Annotation)  {
-				Annotation extension= (Annotation)annotation;
-					if (!extension.isPersistent())
-						getAnnotationModel().removeAnnotation((Annotation)annotation);
-			}
-		}
-	}
-
-	private IFile getFile() {
-		IEditorInput input= fTextEditor.getEditorInput();
-		if (!(input instanceof IFileEditorInput))
-			return null;
-		
-		return ((IFileEditorInput)input).getFile();			
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspSourceViewerConfiguration.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspSourceViewerConfiguration.java
deleted file mode 100644
index 36c000b..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspSourceViewerConfiguration.java
+++ /dev/null
@@ -1,68 +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.jdt.internal.ui.examples.jspeditor;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jface.text.ITextHover;
-import org.eclipse.jface.text.reconciler.IReconciler;
-import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
-import org.eclipse.jface.text.reconciler.MonoReconciler;
-import org.eclipse.jface.text.source.IAnnotationHover;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jface.text.source.SourceViewerConfiguration;
-
-import org.eclipse.ui.texteditor.ITextEditor;
-
-
-/**
- * Configuration information for a simple JSP source viewer.
- * 
- * @since 3.0
- */
-public class JspSourceViewerConfiguration extends SourceViewerConfiguration {
-
-	private ITextEditor fTextEditor;
-
-	/**
-	 * Creates a new JSP source viewer configuration that behaves
-	 * according to the specification of this class' methods.
-	 */
-	public JspSourceViewerConfiguration(ITextEditor textEditor) {
-		fTextEditor= textEditor;
-	}
-	
-	/*
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getReconciler(org.eclipse.jface.text.source.ISourceViewer)
-	 */
-	public IReconciler getReconciler(ISourceViewer sourceViewer) {
-		IReconcilingStrategy reconcilingStrategy= new JspReconcilingStrategy(sourceViewer, fTextEditor);
-		MonoReconciler reconciler= new MonoReconciler(reconcilingStrategy, false);
-		reconciler.setProgressMonitor(new NullProgressMonitor());		
-		reconciler.setDelay(500);
-		return reconciler;
-	}
-
-	/*
-	 * @see SourceViewerConfiguration#getAnnotationHover(ISourceViewer)
-	 */
-	public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
-		return new DefaultAnnotationHover();
-	}
-
-	/*
-	 * @see SourceViewerConfiguration#getTextHover(ISourceViewer, String)
-	 */
-	public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
-		return new AnnotationTextHover(fTextEditor.getDocumentProvider().getAnnotationModel(fTextEditor.getEditorInput()));
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspTranslatorResultCollector.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspTranslatorResultCollector.java
deleted file mode 100644
index 7cd1582..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/examples/jspeditor/JspTranslatorResultCollector.java
+++ /dev/null
@@ -1,67 +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.jdt.internal.ui.examples.jspeditor;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.text.source.ITranslatorResultCollector;
-
-/**
- * Collects the result for the JspTranslator.
- * 
- * @since 3.0
- */
-public class JspTranslatorResultCollector implements ITranslatorResultCollector {
-
-	private StringBuffer fDeclarations= new StringBuffer();
-	private StringBuffer fContent= new StringBuffer();
-	private StringBuffer fLocalDeclarations= new StringBuffer();
-	
-	private ArrayList fContentLines= new ArrayList();
-	private ArrayList fDeclarationLines= new ArrayList();
-	private ArrayList fLocalDeclarationLines= new ArrayList();
-
-	/**
-	 * @param declarations
-	 * @param localDeclarations
-	 * @param content
-	 * @param declarationLines
-	 * @param localDeclarationLines
-	 * @param contentLines
-	 */
-	public JspTranslatorResultCollector(StringBuffer declarations, StringBuffer localDeclarations, StringBuffer content, ArrayList declarationLines, ArrayList localDeclarationLines, ArrayList contentLines) {
-		fDeclarations= declarations;
-		fLocalDeclarations= localDeclarations;
-		fContent= content;
-		fDeclarationLines= declarationLines;
-		fLocalDeclarationLines= localDeclarationLines;
-		fContentLines= contentLines;
-	}
-
-	// XXX: In the real world we would need to pass a list of line numbers
-	public void appendDeclaration(String string, int lineNumber)  {
-		fDeclarations.append(string);
-		fDeclarationLines.add(new Integer(lineNumber));
-	}
-
-	// XXX: In the real world we would need to pass a list of line numbers
-	public void appendLocalDeclaration(String string, int lineNumber)  {
-		fLocalDeclarations.append(string);
-		fLocalDeclarationLines.add(new Integer(lineNumber));
-	}
-
-	// XXX: In the real world we would need to pass a list of line numbers
-	public void appendContent(String string, int lineNumber)  {
-		fContent.append(string);
-		fContentLines.add(new Integer(lineNumber));
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchOperation.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchOperation.java
deleted file mode 100644
index 0955b93..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchOperation.java
+++ /dev/null
@@ -1,199 +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.jdt.internal.ui.search2;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jsp.*;
-import org.eclipse.jsp.JspTypeQuery;
-
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchResultCollector;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.ui.JavaUI;
-
-import org.eclipse.jdt.internal.ui.JavaPluginImages;
-import org.eclipse.jdt.internal.ui.search.PrettySignature;
-import org.eclipse.jdt.internal.ui.search.SearchMessages;
-
-
-public class JavaSearchOperation extends WorkspaceModifyOperation {
-	
-	private IWorkspace fWorkspace;
-	private IJavaElement fElementPattern;
-	private int fLimitTo;
-	private String fStringPattern;
-	private boolean fIsCaseSensitive;
-	private int fSearchFor;
-	private IJavaSearchScope fScope;
-	private String fScopeDescription;
-	private JavaSearchResultCollector fCollector;
-	
-	protected JavaSearchOperation(
-				IWorkspace workspace,
-				int limitTo,
-				IJavaSearchScope scope,
-				String scopeDescription,
-				JavaSearchResultCollector collector) {
-		super(null);
-		fWorkspace= workspace;
-		fLimitTo= limitTo;
-		fScope= scope;
-		fScopeDescription= scopeDescription;
-		fCollector= collector;
-		fCollector.setOperation(this);
-	}
-	
-	public JavaSearchOperation(
-				IWorkspace workspace,
-				IJavaElement pattern,
-				int limitTo,
-				IJavaSearchScope scope,
-				String scopeDescription,
-				JavaSearchResultCollector collector) {
-		this(workspace, limitTo, scope, scopeDescription, collector);
-		fElementPattern= pattern;
-	}
-	
-	public JavaSearchOperation(
-				IWorkspace workspace,
-				String pattern,
-				boolean caseSensitive,
-				int searchFor, 
-				int limitTo,
-				IJavaSearchScope scope,
-				String scopeDescription,
-				JavaSearchResultCollector collector) {
-		this(workspace, limitTo, scope, scopeDescription, collector);
-		fStringPattern= pattern;
-		fIsCaseSensitive= caseSensitive;
-		fSearchFor= searchFor;
-	}
-	
-	protected void execute(IProgressMonitor monitor) throws CoreException {
-		fCollector.setProgressMonitor(monitor);
-		
-		// A hack to temporarily disable the aboutToStart and done methods
-		IJavaSearchResultCollector collector= new IJavaSearchResultCollector() {
-			public void aboutToStart() {
-				// empty implementation
-			}
-			public void accept(IResource resource, int start, int end, IJavaElement enclosingElement, int accuracy) throws CoreException {
-				fCollector.accept(resource, start, end, enclosingElement, accuracy);
-			}
-			public void done() {
-				// empty implementation
-			}
-			public IProgressMonitor getProgressMonitor() {
-				return fCollector.getProgressMonitor();
-			}
-		};
-		
-		fCollector.aboutToStart();
-
-		// Also search working copies
-		SearchEngine engine= new SearchEngine(JavaUI.getSharedWorkingCopiesOnClasspath());
-		
-		if (fElementPattern != null)
-			engine.search(fWorkspace, fElementPattern, fLimitTo, fScope, collector);
-		else
-			engine.search(fWorkspace, SearchEngine.createSearchPattern(fStringPattern, fSearchFor, fLimitTo, fIsCaseSensitive), fScope, collector);
-
-		if (fElementPattern instanceof IType)
-			JspSearchEngine.search(collector, new JspTypeQuery((IType)fElementPattern), monitor);
-			
-		fCollector.done();
-	}
-
-	String getSingularLabel() {
-		String desc= null;
-		if (fElementPattern != null) {
-			if (fLimitTo == IJavaSearchConstants.REFERENCES
-			&& fElementPattern.getElementType() == IJavaElement.METHOD)
-				desc= PrettySignature.getUnqualifiedMethodSignature((IMethod)fElementPattern);
-			else
-				desc= fElementPattern.getElementName();
-			if ("".equals(desc) && fElementPattern.getElementType() == IJavaElement.PACKAGE_FRAGMENT) //$NON-NLS-1$
-				desc= SearchMessages.getString("JavaSearchOperation.default_package"); //$NON-NLS-1$
-		}
-		else
-			desc= fStringPattern;
-
-		String[] args= new String[] {desc, fScopeDescription}; //$NON-NLS-1$
-		switch (fLimitTo) {
-			case IJavaSearchConstants.IMPLEMENTORS:
-				return SearchMessages.getFormattedString("JavaSearchOperation.singularImplementorsPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.DECLARATIONS:
-				return SearchMessages.getFormattedString("JavaSearchOperation.singularDeclarationsPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.REFERENCES:
-				return SearchMessages.getFormattedString("JavaSearchOperation.singularReferencesPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.ALL_OCCURRENCES:
-				return SearchMessages.getFormattedString("JavaSearchOperation.singularOccurrencesPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.READ_ACCESSES:
-				return SearchMessages.getFormattedString("JavaSearchOperation.singularReadReferencesPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.WRITE_ACCESSES:
-				return SearchMessages.getFormattedString("JavaSearchOperation.singularWriteReferencesPostfix", args); //$NON-NLS-1$
-			default:
-				return SearchMessages.getFormattedString("JavaSearchOperation.singularOccurrencesPostfix", args); //$NON-NLS-1$;
-		}
-	}
-
-	String getPluralLabelPattern() {
-		String desc= null;
-		if (fElementPattern != null) {
-			if (fLimitTo == IJavaSearchConstants.REFERENCES
-			&& fElementPattern.getElementType() == IJavaElement.METHOD)
-				desc= PrettySignature.getUnqualifiedMethodSignature((IMethod)fElementPattern);
-			else
-				desc= fElementPattern.getElementName();
-			if ("".equals(desc) && fElementPattern.getElementType() == IJavaElement.PACKAGE_FRAGMENT) //$NON-NLS-1$
-				desc= SearchMessages.getString("JavaSearchOperation.default_package"); //$NON-NLS-1$
-		}
-		else
-			desc= fStringPattern;
-
-		String[] args= new String[] {desc, "{0}", fScopeDescription}; //$NON-NLS-1$
-		switch (fLimitTo) {
-			case IJavaSearchConstants.IMPLEMENTORS:
-				return SearchMessages.getFormattedString("JavaSearchOperation.pluralImplementorsPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.DECLARATIONS:
-				return SearchMessages.getFormattedString("JavaSearchOperation.pluralDeclarationsPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.REFERENCES:
-				return SearchMessages.getFormattedString("JavaSearchOperation.pluralReferencesPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.ALL_OCCURRENCES:
-				return SearchMessages.getFormattedString("JavaSearchOperation.pluralOccurrencesPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.READ_ACCESSES:
-				return SearchMessages.getFormattedString("JavaSearchOperation.pluralReadReferencesPostfix", args); //$NON-NLS-1$
-			case IJavaSearchConstants.WRITE_ACCESSES:
-				return SearchMessages.getFormattedString("JavaSearchOperation.pluralWriteReferencesPostfix", args); //$NON-NLS-1$
-			default:
-				return SearchMessages.getFormattedString("JavaSearchOperation.pluralOccurrencesPostfix", args); //$NON-NLS-1$;
-		}
-	}
-	
-	ImageDescriptor getImageDescriptor() {
-		if (fLimitTo == IJavaSearchConstants.IMPLEMENTORS || fLimitTo == IJavaSearchConstants.DECLARATIONS)
-			return JavaPluginImages.DESC_OBJS_SEARCH_DECL;
-		else
-			return JavaPluginImages.DESC_OBJS_SEARCH_REF;
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchPage2.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchPage2.java
deleted file mode 100644
index 86c9550..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchPage2.java
+++ /dev/null
@@ -1,736 +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.jdt.internal.ui.search2;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.runtime.IAdaptable;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.DialogPage;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-import org.eclipse.jface.text.ITextSelection;
-
-import org.eclipse.jsp.JspUIPlugin;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-import org.eclipse.search.ui.ISearchPage;
-import org.eclipse.search.ui.ISearchPageContainer;
-import org.eclipse.search.ui.ISearchResultViewEntry;
-import org.eclipse.search.ui.SearchUI;
-
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-
-import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
-import org.eclipse.jdt.internal.ui.browsing.LogicalPackage;
-import org.eclipse.jdt.internal.ui.search.JavaSearchScopeFactory;
-import org.eclipse.jdt.internal.ui.search.PrettySignature;
-import org.eclipse.jdt.internal.ui.search.SearchMessages;
-import org.eclipse.jdt.internal.ui.search.SearchUtil;
-import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
-import org.eclipse.jdt.internal.ui.util.RowLayouter;
-
-public class JavaSearchPage2 extends DialogPage implements ISearchPage, IJavaSearchConstants {
-
-	public static final String EXTENSION_POINT_ID= "org.eclipse.jdt.ui.JavaSearchPage"; //$NON-NLS-1$
-
-	// Dialog store id constants
-	private final static String PAGE_NAME= "JavaSearchPage"; //$NON-NLS-1$
-	private final static String STORE_CASE_SENSITIVE= PAGE_NAME + "CASE_SENSITIVE"; //$NON-NLS-1$
-
-
-	private static List fgPreviousSearchPatterns= new ArrayList(20);
-
-	private SearchPatternData fInitialData;
-	private IStructuredSelection fStructuredSelection;
-	private IJavaElement fJavaElement;
-	private boolean fFirstTime= true;
-	private IDialogSettings fDialogSettings;
-	private boolean fIsCaseSensitive;
-	
-	private Combo fPattern;
-	private ISearchPageContainer fContainer;
-	private Button fCaseSensitive;
-	
-	private Button[] fSearchFor;
-	private String[] fSearchForText= {
-		SearchMessages.getString("SearchPage.searchFor.type"), //$NON-NLS-1$
-		SearchMessages.getString("SearchPage.searchFor.method"), //$NON-NLS-1$
-		SearchMessages.getString("SearchPage.searchFor.package"), //$NON-NLS-1$
-		SearchMessages.getString("SearchPage.searchFor.constructor"), //$NON-NLS-1$
-		SearchMessages.getString("SearchPage.searchFor.field")}; //$NON-NLS-1$
-
-	private Button[] fLimitTo;
-	private String[] fLimitToText= {
-		SearchMessages.getString("SearchPage.limitTo.declarations"), //$NON-NLS-1$
-		SearchMessages.getString("SearchPage.limitTo.implementors"), //$NON-NLS-1$
-		SearchMessages.getString("SearchPage.limitTo.references"), //$NON-NLS-1$
-		SearchMessages.getString("SearchPage.limitTo.allOccurrences"), //$NON-NLS-1$
-		SearchMessages.getString("SearchPage.limitTo.readReferences"), //$NON-NLS-1$		
-		SearchMessages.getString("SearchPage.limitTo.writeReferences")}; //$NON-NLS-1$
-
-
-	private static class SearchPatternData {
-		int			searchFor;
-		int			limitTo;
-		String			pattern;
-		boolean		isCaseSensitive;
-		IJavaElement	javaElement;
-		int			scope;
-		IWorkingSet[]	 	workingSets;
-		
-		public SearchPatternData(int s, int l, boolean i, String p, IJavaElement element) {
-			this(s, l, p, i, element, ISearchPageContainer.WORKSPACE_SCOPE, null);
-		}
-		
-		public SearchPatternData(int s, int l, String p, boolean i, IJavaElement element, int scope0, IWorkingSet[] workingSets0) {
-			searchFor= s;
-			limitTo= l;
-			pattern= p;
-			isCaseSensitive= i;
-			javaElement= element;
-			this.scope= scope0;
-			this.workingSets= workingSets0;
-		}
-	}
-
-	//---- Action Handling ------------------------------------------------
-	
-	public boolean performAction() {
-		SearchUI.activateSearchResultView();
-
-		SearchPatternData data= getPatternData();
-		IWorkspace workspace= JavaPlugin.getWorkspace();
-
-		// Setup search scope
-		IJavaSearchScope scope= null;
-		String scopeDescription= ""; //$NON-NLS-1$
-		switch (getContainer().getSelectedScope()) {
-			case ISearchPageContainer.WORKSPACE_SCOPE:
-				scopeDescription= SearchMessages.getString("WorkspaceScope"); //$NON-NLS-1$
-				scope= SearchEngine.createWorkspaceScope();
-				break;
-			case ISearchPageContainer.SELECTION_SCOPE:
-				scopeDescription= SearchMessages.getString("SelectionScope"); //$NON-NLS-1$
-				scope= JavaSearchScopeFactory.getInstance().createJavaSearchScope(fStructuredSelection);
-				break;
-			case ISearchPageContainer.WORKING_SET_SCOPE:
-				IWorkingSet[] workingSets= getContainer().getSelectedWorkingSets();
-				// should not happen - just to be sure
-				if (workingSets == null || workingSets.length < 1)
-					return false;
-				scopeDescription= SearchMessages.getFormattedString("WorkingSetScope", SearchUtil.toString(workingSets)); //$NON-NLS-1$
-				scope= JavaSearchScopeFactory.getInstance().createJavaSearchScope(getContainer().getSelectedWorkingSets());
-				SearchUtil.updateLRUWorkingSets(getContainer().getSelectedWorkingSets());
-		}		
-		
-		JavaSearchResultCollector collector= new JavaSearchResultCollector();
-		JavaSearchOperation op= null;
-		if (data.javaElement != null && getPattern().equals(fInitialData.pattern)) {
-			op= new JavaSearchOperation(workspace, data.javaElement, data.limitTo, scope, scopeDescription, collector);
-			if (data.limitTo == IJavaSearchConstants.REFERENCES)
-				SearchUtil.warnIfBinaryConstant(data.javaElement, getShell());
-		} else {
-			data.javaElement= null;
-			op= new JavaSearchOperation(workspace, data.pattern, data.isCaseSensitive, data.searchFor, data.limitTo, scope, scopeDescription, collector);
-		}
-		Shell shell= getControl().getShell();
-		try {
-			getContainer().getRunnableContext().run(true, true, op);
-		} catch (InvocationTargetException ex) {
-			ExceptionHandler.handle(ex, shell, SearchMessages.getString("Search.Error.search.title"), SearchMessages.getString("Search.Error.search.message")); //$NON-NLS-2$ //$NON-NLS-1$
-			return false;
-		} catch (InterruptedException ex) {
-			return false;
-		}
-		return true;
-	}
-	
-	private int getLimitTo() {
-		for (int i= 0; i < fLimitTo.length; i++) {
-			if (fLimitTo[i].getSelection())
-				return i;
-		}
-		return -1;
-	}
-
-	private void setLimitTo(int searchFor) {
-		fLimitTo[DECLARATIONS].setEnabled(true);
-		fLimitTo[IMPLEMENTORS].setEnabled(false);
-		fLimitTo[REFERENCES].setEnabled(true);			
-		fLimitTo[ALL_OCCURRENCES].setEnabled(true);
-		fLimitTo[READ_ACCESSES].setEnabled(false);
-		fLimitTo[WRITE_ACCESSES].setEnabled(false);
-		
-		if (!(searchFor == TYPE || searchFor == INTERFACE) && fLimitTo[IMPLEMENTORS].getSelection()) {
-			fLimitTo[IMPLEMENTORS].setSelection(false);
-			fLimitTo[REFERENCES].setSelection(true);
-		}
-
-		if (!(searchFor == FIELD) && (getLimitTo() == READ_ACCESSES || getLimitTo() == WRITE_ACCESSES)) {
-			fLimitTo[getLimitTo()].setSelection(false);
-			fLimitTo[REFERENCES].setSelection(true);
-		}
-
-		switch (searchFor) {
-			case TYPE:
-			case INTERFACE:
-				fLimitTo[IMPLEMENTORS].setEnabled(true);
-				break;
-			case FIELD:
-				fLimitTo[READ_ACCESSES].setEnabled(true);
-				fLimitTo[WRITE_ACCESSES].setEnabled(true);
-				break;
-			default :
-				break;
-		}
-	}
-
-	private String[] getPreviousSearchPatterns() {
-		// Search results are not persistent
-		int patternCount= fgPreviousSearchPatterns.size();
-		String [] patterns= new String[patternCount];
-		for (int i= 0; i < patternCount; i++)
-			patterns[i]= ((SearchPatternData) fgPreviousSearchPatterns.get(patternCount - 1 - i)).pattern;
-		return patterns;
-	}
-	
-	private int getSearchFor() {
-		for (int i= 0; i < fSearchFor.length; i++) {
-			if (fSearchFor[i].getSelection())
-				return i;
-		}
-		Assert.isTrue(false, "shouldNeverHappen"); //$NON-NLS-1$
-		return -1;
-	}
-	
-	private String getPattern() {
-		return fPattern.getText();
-	}
-
-	/**
-	 * Return search pattern data and update previous searches.
-	 * An existing entry will be updated.
-	 */
-	private SearchPatternData getPatternData() {
-		String pattern= getPattern();
-		SearchPatternData match= null;
-		int i= 0;
-		int size= fgPreviousSearchPatterns.size();
-		while (match == null && i < size) {
-			match= (SearchPatternData) fgPreviousSearchPatterns.get(i);
-			i++;
-			if (!pattern.equals(match.pattern))
-				match= null;
-		}
-		if (match == null) {
-			match= new SearchPatternData(
-							getSearchFor(),
-							getLimitTo(),
-							pattern,
-							fCaseSensitive.getSelection(),
-							fJavaElement,
-							getContainer().getSelectedScope(),
-							getContainer().getSelectedWorkingSets());
-			fgPreviousSearchPatterns.add(match);
-		}
-		else {
-			match.searchFor= getSearchFor();
-			match.limitTo= getLimitTo();
-			match.isCaseSensitive= fCaseSensitive.getSelection();
-			match.javaElement= fJavaElement;
-			match.scope= getContainer().getSelectedScope();
-			match.workingSets= getContainer().getSelectedWorkingSets();
-		}
-		return match;
-	}
-
-	/*
-	 * Implements method from IDialogPage
-	 */
-	public void setVisible(boolean visible) {
-		if (visible && fPattern != null) {
-			if (fFirstTime) {
-				fFirstTime= false;
-				// Set item and text here to prevent page from resizing
-				fPattern.setItems(getPreviousSearchPatterns());
-				initSelections();
-			}
-			fPattern.setFocus();
-			getContainer().setPerformActionEnabled(fPattern.getText().length() > 0);
-		}
-		super.setVisible(visible);
-	}
-	
-	public boolean isValid() {
-		return true;
-	}
-
-	//---- Widget creation ------------------------------------------------
-
-	/**
-	 * Creates the page's content.
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-		readConfiguration();
-		
-		GridData gd;
-		Composite result= new Composite(parent, SWT.NONE);
-		GridLayout layout= new GridLayout(2, false);
-		layout.horizontalSpacing= 10;
-		result.setLayout(layout);
-		result.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		RowLayouter layouter= new RowLayouter(layout.numColumns);
-		gd= new GridData();
-		gd.horizontalAlignment= GridData.FILL;
-		gd.verticalAlignment= GridData.VERTICAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_FILL;
-	
-		layouter.setDefaultGridData(gd, 0);
-		layouter.setDefaultGridData(gd, 1);
-		layouter.setDefaultSpan();
-
-		layouter.perform(createExpression(result));
-		layouter.perform(createSearchFor(result), createLimitTo(result), -1);
-		
-		SelectionAdapter javaElementInitializer= new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				if (getSearchFor() == fInitialData.searchFor)
-					fJavaElement= fInitialData.javaElement;
-				else
-					fJavaElement= null;
-				setLimitTo(getSearchFor());
-				updateCaseSensitiveCheckbox();
-			}
-		};
-
-		fSearchFor[TYPE].addSelectionListener(javaElementInitializer);
-		fSearchFor[METHOD].addSelectionListener(javaElementInitializer);
-		fSearchFor[FIELD].addSelectionListener(javaElementInitializer);
-		fSearchFor[CONSTRUCTOR].addSelectionListener(javaElementInitializer);
-		fSearchFor[PACKAGE].addSelectionListener(javaElementInitializer);
-
-		setControl(result);
-
-		Dialog.applyDialogFont(result);
-		WorkbenchHelp.setHelp(result, IJavaHelpContextIds.JAVA_SEARCH_PAGE);	
-	}
-
-	private Control createExpression(Composite parent) {
-		Composite result= new Composite(parent, SWT.NONE);
-		GridLayout layout= new GridLayout(2, false);
-		result.setLayout(layout);
-		GridData gd= new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
-		gd.horizontalSpan= 2;
-		gd.horizontalIndent= 0;
-		result.setLayoutData(gd);
-
-		// Pattern text + info
-		Label label= new Label(result, SWT.LEFT);
-		label.setText(SearchMessages.getString("SearchPage.expression.label")); //$NON-NLS-1$
-		gd= new GridData(GridData.BEGINNING);
-		gd.horizontalSpan= 2;
-//		gd.horizontalIndent= -gd.horizontalIndent;
-		label.setLayoutData(gd);
-
-		// Pattern combo
-		fPattern= new Combo(result, SWT.SINGLE | SWT.BORDER);
-		fPattern.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				handlePatternSelected();
-			}
-		});
-		fPattern.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				getContainer().setPerformActionEnabled(getPattern().length() > 0);
-				updateCaseSensitiveCheckbox();
-			}
-		});
-		gd= new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
-		gd.horizontalIndent= -gd.horizontalIndent;
-		fPattern.setLayoutData(gd);
-
-
-		// Ignore case checkbox		
-		fCaseSensitive= new Button(result, SWT.CHECK);
-		fCaseSensitive.setText(SearchMessages.getString("SearchPage.expression.caseSensitive")); //$NON-NLS-1$
-		gd= new GridData();
-		fCaseSensitive.setLayoutData(gd);
-		fCaseSensitive.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				fIsCaseSensitive= fCaseSensitive.getSelection();
-				writeConfiguration();
-			}
-		});
-		
-		return result;
-	}
-
-	private void updateCaseSensitiveCheckbox() {
-		if (fInitialData != null && getPattern().equals(fInitialData.pattern) && fJavaElement != null) {
-			fCaseSensitive.setEnabled(false);
-			fCaseSensitive.setSelection(true);
-		}
-		else {
-			fCaseSensitive.setEnabled(true);
-			fCaseSensitive.setSelection(fIsCaseSensitive);
-		}
-	}
-
-	private void handlePatternSelected() {
-		if (fPattern.getSelectionIndex() < 0)
-			return;
-		int index= fgPreviousSearchPatterns.size() - 1 - fPattern.getSelectionIndex();
-		fInitialData= (SearchPatternData) fgPreviousSearchPatterns.get(index);
-		for (int i= 0; i < fSearchFor.length; i++)
-			fSearchFor[i].setSelection(false);
-		for (int i= 0; i < fLimitTo.length; i++)
-			fLimitTo[i].setSelection(false);
-		fSearchFor[fInitialData.searchFor].setSelection(true);
-		setLimitTo(fInitialData.searchFor);
-		fLimitTo[fInitialData.limitTo].setSelection(true);
-
-		fPattern.setText(fInitialData.pattern);
-		fIsCaseSensitive= fInitialData.isCaseSensitive;
-		fJavaElement= fInitialData.javaElement;
-		fCaseSensitive.setEnabled(fJavaElement == null);
-		fCaseSensitive.setSelection(fInitialData.isCaseSensitive);
-
-		if (fInitialData.workingSets != null)
-			getContainer().setSelectedWorkingSets(fInitialData.workingSets);
-		else
-			getContainer().setSelectedScope(fInitialData.scope);
-	}
-
-	private Control createSearchFor(Composite parent) {
-		Group result= new Group(parent, SWT.NONE);
-		result.setText(SearchMessages.getString("SearchPage.searchFor.label")); //$NON-NLS-1$
-		GridLayout layout= new GridLayout();
-		layout.numColumns= 3;
-		result.setLayout(layout);
-
-		fSearchFor= new Button[fSearchForText.length];
-		for (int i= 0; i < fSearchForText.length; i++) {
-			Button button= new Button(result, SWT.RADIO);
-			button.setText(fSearchForText[i]);
-			fSearchFor[i]= button;
-		}
-
-		// Fill with dummy radio buttons
-		Button filler= new Button(result, SWT.RADIO);
-		filler.setVisible(false);
-		filler= new Button(result, SWT.RADIO);
-		filler.setVisible(false);
-
-		return result;		
-	}
-	
-	private Control createLimitTo(Composite parent) {
-		Group result= new Group(parent, SWT.NONE);
-		result.setText(SearchMessages.getString("SearchPage.limitTo.label")); //$NON-NLS-1$
-		GridLayout layout= new GridLayout();
-		layout.numColumns= 2;
-		result.setLayout(layout);
-
-		fLimitTo= new Button[fLimitToText.length];
-		for (int i= 0; i < fLimitToText.length; i++) {
-			Button button= new Button(result, SWT.RADIO);
-			button.setText(fLimitToText[i]);
-			fLimitTo[i]= button;
-		}
-		return result;		
-	}	
-	
-	private void initSelections() {
-		fStructuredSelection= asStructuredSelection();
-		fInitialData= tryStructuredSelection(fStructuredSelection);
-		if (fInitialData == null)
-			fInitialData= trySimpleTextSelection(getContainer().getSelection());
-		if (fInitialData == null)
-			fInitialData= getDefaultInitValues();
-
-		fJavaElement= fInitialData.javaElement;
-		fCaseSensitive.setSelection(fInitialData.isCaseSensitive);
-		fCaseSensitive.setEnabled(fInitialData.javaElement == null);
-		fSearchFor[fInitialData.searchFor].setSelection(true);
-		setLimitTo(fInitialData.searchFor);
-		fLimitTo[fInitialData.limitTo].setSelection(true);		
-		fPattern.setText(fInitialData.pattern);
-	}
-
-	private SearchPatternData tryStructuredSelection(IStructuredSelection selection) {
-		if (selection == null || selection.size() > 1)
-			return null;
-
-		Object o= selection.getFirstElement();
-		if (o instanceof IJavaElement) {
-			return determineInitValuesFrom((IJavaElement)o);
-		} else if (o instanceof ISearchResultViewEntry) {
-			IJavaElement element= SearchUtil.getJavaElement(((ISearchResultViewEntry)o).getSelectedMarker());
-			return determineInitValuesFrom(element);
-		} else if (o instanceof LogicalPackage) {
-			LogicalPackage lp= (LogicalPackage)o;
-			return new SearchPatternData(PACKAGE, REFERENCES, fIsCaseSensitive, lp.getElementName(), null);
-		} else if (o instanceof IAdaptable) {
-			IJavaElement element= (IJavaElement)((IAdaptable)o).getAdapter(IJavaElement.class);
-			if (element != null) {
-				return determineInitValuesFrom(element);
-			} else {
-				IWorkbenchAdapter adapter= (IWorkbenchAdapter)((IAdaptable)o).getAdapter(IWorkbenchAdapter.class);
-				if (adapter != null)
-					return new SearchPatternData(TYPE, REFERENCES, fIsCaseSensitive, adapter.getLabel(o), null);
-			}
-		}
-		return null;
-	}
-
-	private SearchPatternData determineInitValuesFrom(IJavaElement element) {
-		if (element == null)
-			return null;
-		int searchFor= UNKNOWN;
-		int limitTo= UNKNOWN;
-		String pattern= null; 
-		switch (element.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT:
-				searchFor= PACKAGE;
-				limitTo= REFERENCES;
-				pattern= element.getElementName();
-				break;
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				searchFor= PACKAGE;
-				limitTo= REFERENCES;
-				pattern= element.getElementName();
-				break;
-			case IJavaElement.PACKAGE_DECLARATION:
-				searchFor= PACKAGE;
-				limitTo= REFERENCES;
-				pattern= element.getElementName();
-				break;
-			case IJavaElement.IMPORT_DECLARATION:
-				pattern= element.getElementName();
-				IImportDeclaration declaration= (IImportDeclaration)element;
-				if (declaration.isOnDemand()) {
-					searchFor= PACKAGE;
-					int index= pattern.lastIndexOf('.');
-					pattern= pattern.substring(0, index);
-				} else {
-					searchFor= TYPE;
-				}
-				limitTo= DECLARATIONS;
-				break;
-			case IJavaElement.TYPE:
-				searchFor= TYPE;
-				limitTo= REFERENCES;
-				pattern= JavaModelUtil.getFullyQualifiedName((IType)element);
-				break;
-			case IJavaElement.COMPILATION_UNIT:
-				ICompilationUnit cu= (ICompilationUnit)element;
-				String mainTypeName= element.getElementName().substring(0, element.getElementName().indexOf(".")); //$NON-NLS-1$
-				IType mainType= cu.getType(mainTypeName);
-				mainTypeName= JavaModelUtil.getTypeQualifiedName(mainType);
-				try {					
-					mainType= JavaModelUtil.findTypeInCompilationUnit(cu, mainTypeName);
-					if (mainType == null) {
-						// fetch type which is declared first in the file
-						IType[] types= cu.getTypes();
-						if (types.length > 0)
-							mainType= types[0];
-						else
-							break;
-					}
-				} catch (JavaModelException ex) {
-					ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.javaElementAccess.title"), SearchMessages.getString("Search.Error.javaElementAccess.message")); //$NON-NLS-2$ //$NON-NLS-1$
-					break;
-				}
-				searchFor= TYPE;
-				element= mainType;
-				limitTo= REFERENCES;
-				pattern= JavaModelUtil.getFullyQualifiedName(mainType);
-				break;
-			case IJavaElement.CLASS_FILE:
-				IClassFile cf= (IClassFile)element;
-				try {					
-					mainType= cf.getType();
-				} catch (JavaModelException ex) {
-					ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.javaElementAccess.title"), SearchMessages.getString("Search.Error.javaElementAccess.message")); //$NON-NLS-2$ //$NON-NLS-1$
-					break;
-				}
-				if (mainType == null)
-					break;
-				element= mainType;
-				searchFor= TYPE;
-				limitTo= REFERENCES;
-				pattern= JavaModelUtil.getFullyQualifiedName(mainType);
-				break;
-			case IJavaElement.FIELD:
-				searchFor= FIELD;
-				limitTo= REFERENCES;
-				IType type= ((IField)element).getDeclaringType();
-				StringBuffer buffer= new StringBuffer();
-				buffer.append(JavaModelUtil.getFullyQualifiedName(type));
-				buffer.append('.');
-				buffer.append(element.getElementName());
-				pattern= buffer.toString();
-				break;
-			case IJavaElement.METHOD:
-				searchFor= METHOD;
-				try {
-					IMethod method= (IMethod)element;
-					if (method.isConstructor())
-						searchFor= CONSTRUCTOR;
-				} catch (JavaModelException ex) {
-					ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.javaElementAccess.title"), SearchMessages.getString("Search.Error.javaElementAccess.message")); //$NON-NLS-2$ //$NON-NLS-1$
-					break;
-				}		
-				limitTo= REFERENCES;
-				pattern= PrettySignature.getMethodSignature((IMethod)element);
-				break;
-		}
-		if (searchFor != UNKNOWN && limitTo != UNKNOWN && pattern != null)
-			return new SearchPatternData(searchFor, limitTo, true, pattern, element);
-			
-		return null;	
-	}
-	
-	private SearchPatternData trySimpleTextSelection(ISelection selection) {
-		SearchPatternData result= null;
-		if (selection instanceof ITextSelection) {
-			BufferedReader reader= new BufferedReader(new StringReader(((ITextSelection)selection).getText()));
-			String text;
-			try {
-				text= reader.readLine();
-				if (text == null)
-					text= ""; //$NON-NLS-1$
-			} catch (IOException ex) {
-				text= ""; //$NON-NLS-1$
-			}
-			result= new SearchPatternData(TYPE, REFERENCES, fIsCaseSensitive, text, null);
-		}
-		return result;
-	}
-	
-	private SearchPatternData getDefaultInitValues() {
-		return new SearchPatternData(TYPE, REFERENCES, fIsCaseSensitive, "", null); //$NON-NLS-1$
-	}	
-
-	/*
-	 * Implements method from ISearchPage
-	 */
-	public void setContainer(ISearchPageContainer container) {
-		fContainer= container;
-	}
-	
-	/**
-	 * Returns the search page's container.
-	 */
-	private ISearchPageContainer getContainer() {
-		return fContainer;
-	}
-	
-	/**
-	 * Returns the structured selection from the selection.
-	 */
-	private IStructuredSelection asStructuredSelection() {
-		IWorkbenchWindow wbWindow= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		if (wbWindow != null) {
-			IWorkbenchPage page= wbWindow.getActivePage();
-			if (page != null) {
-				IWorkbenchPart part= page.getActivePart();
-				if (part != null)
-					try {
-						return SelectionConverter.getStructuredSelection(part);
-					} catch (JavaModelException ex) {
-						JspUIPlugin.log("internal error", ex); //$NON-NLS-1$
-					}
-			}
-		}
-		return StructuredSelection.EMPTY;
-	}
-	
-	//--------------- Configuration handling --------------
-	
-	/**
-	 * Returns the page settings for this Java search page.
-	 * 
-	 * @return the page settings to be used
-	 */
-	private IDialogSettings getDialogSettings() {
-		IDialogSettings settings= JavaPlugin.getDefault().getDialogSettings();
-		fDialogSettings= settings.getSection(PAGE_NAME);
-		if (fDialogSettings == null)
-			fDialogSettings= settings.addNewSection(PAGE_NAME);
-		return fDialogSettings;
-	}
-	
-	/**
-	 * Initializes itself from the stored page settings.
-	 */
-	private void readConfiguration() {
-		IDialogSettings s= getDialogSettings();
-		fIsCaseSensitive= s.getBoolean(STORE_CASE_SENSITIVE);
-	}
-	
-	/**
-	 * Stores it current configuration in the dialog store.
-	 */
-	private void writeConfiguration() {
-		IDialogSettings s= getDialogSettings();
-		s.put(STORE_CASE_SENSITIVE, fIsCaseSensitive);
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchResultCollector.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchResultCollector.java
deleted file mode 100644
index aa1bbc5..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/JavaSearchResultCollector.java
+++ /dev/null
@@ -1,234 +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.jdt.internal.ui.search2;
-
-import java.text.MessageFormat;
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.actions.ActionGroup;
-
-import org.eclipse.search.ui.IActionGroupFactory;
-import org.eclipse.search.ui.ISearchResultView;
-import org.eclipse.search.ui.SearchUI;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.search.IJavaSearchResultCollector;
-
-import org.eclipse.jdt.ui.JavaUI;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-
-import org.eclipse.jdt.internal.ui.dialogs.OptionalMessageDialog;
-import org.eclipse.jdt.internal.ui.search.GotoMarkerAction;
-import org.eclipse.jdt.internal.ui.search.GroupByKeyComputer;
-import org.eclipse.jdt.internal.ui.search.IJavaSearchUIConstants;
-import org.eclipse.jdt.internal.ui.search.JavaSearchResultLabelProvider;
-import org.eclipse.jdt.internal.ui.search.SearchMessages;
-
-
-public class JavaSearchResultCollector implements IJavaSearchResultCollector {
-
-	private static final String MATCH= SearchMessages.getString("SearchResultCollector.match"); //$NON-NLS-1$
-	private static final String MATCHES= SearchMessages.getString("SearchResultCollector.matches"); //$NON-NLS-1$
-	private static final String DONE= SearchMessages.getString("SearchResultCollector.done"); //$NON-NLS-1$
-	private static final String SEARCHING= SearchMessages.getString("SearchResultCollector.searching"); //$NON-NLS-1$
-	private static final Boolean POTENTIAL_MATCH_VALUE= new Boolean(true);
-	private static final String POTENTIAL_MATCH_DIALOG_ID= "Search.PotentialMatchDialog"; //$NON-NLS-1$
-	
-	private IProgressMonitor fMonitor;
-	private ISearchResultView fView;
-	private JavaSearchOperation fOperation;
-	private int fMatchCount= 0;
-	private int fPotentialMatchCount= 0;
-	private long fLastUpdateTime;
-	private Integer[] fMessageFormatArgs= new Integer[1];
-	
-	private class ActionGroupFactory implements IActionGroupFactory {
-		public ActionGroup createActionGroup(ISearchResultView part) {
-			return new SearchViewActionGroup(part);
-		}
-	}
-	
-	public JavaSearchResultCollector() {
-		// This ensures that the image class is loaded correctly
-		JavaPlugin.getDefault().getImageRegistry();
-	}
-
-	/**
-	 * @see IJavaSearchResultCollector#aboutToStart().
-	 */
-	public void aboutToStart() {
-		fPotentialMatchCount= 0;
-		fView= SearchUI.getSearchResultView();
-		fMatchCount= 0;
-		fLastUpdateTime= 0;
-		if (fView != null) {
-			fView.searchStarted(
-				new ActionGroupFactory(),
-				fOperation.getSingularLabel(),
-				fOperation.getPluralLabelPattern(),
-				fOperation.getImageDescriptor(),
-				JavaSearchPage2.EXTENSION_POINT_ID,
-				new JavaSearchResultLabelProvider(),
-				new GotoMarkerAction(),
-				new GroupByKeyComputer(),
-				fOperation);
-		}
-		if (!getProgressMonitor().isCanceled())
-			getProgressMonitor().subTask(SEARCHING);
-	}
-	
-	/**
-	 * @see IJavaSearchResultCollector#accept
-	 */
-	public void accept(IResource resource, int start, int end, IJavaElement enclosingElement, int accuracy) throws CoreException {
-
-		if (enclosingElement == null) {	// non-Java match
-			IMarker marker= resource.createMarker(SearchUI.SEARCH_MARKER);
-			
-			String description= resource.getFullPath().lastSegment();
-			if (description == null)
-				description= "";  //$NON-NLS-1$
-			
-			HashMap attributes= new HashMap(3);
-			attributes.put(IMarker.CHAR_START, new Integer(Math.max(start, 0)));
-			attributes.put(IMarker.CHAR_END, new Integer(Math.max(end, 0)));
-			marker.setAttributes(attributes);
-			
-			fView.addMatch(description, resource, resource, marker);
-			fMatchCount++;
-			
-			if (!getProgressMonitor().isCanceled() && System.currentTimeMillis() - fLastUpdateTime > 1000) {
-				getProgressMonitor().subTask(getFormattedMatchesString(fMatchCount));
-				fLastUpdateTime= System.currentTimeMillis();
-			}
-			
-			return;
-		}
-
-		if (accuracy == POTENTIAL_MATCH && SearchUI.arePotentialMatchesIgnored())
-			return;
-		
-		IMarker marker= resource.createMarker(SearchUI.SEARCH_MARKER);
-		HashMap attributes;
-		Object groupKey= enclosingElement;
-		attributes= new HashMap(7);
-		if (accuracy == POTENTIAL_MATCH) {
-			fPotentialMatchCount++;
-			attributes.put(SearchUI.POTENTIAL_MATCH, POTENTIAL_MATCH_VALUE);
-			if (groupKey == null)
-				groupKey= "?:null"; //$NON-NLS-1$
-			else
-				groupKey= "?:" + enclosingElement.getHandleIdentifier(); //$NON-NLS-1$
-		}			
-		ICompilationUnit cu= SearchUtil.findCompilationUnit(enclosingElement);
-		if (cu != null && cu.isWorkingCopy())
-			attributes.put(IJavaSearchUIConstants.ATT_IS_WORKING_COPY, new Boolean(true)); //$NON-NLS-1$
-			
-		JavaCore.addJavaElementMarkerAttributes(attributes, enclosingElement);
-		attributes.put(IJavaSearchUIConstants.ATT_JE_HANDLE_ID, enclosingElement.getHandleIdentifier());
-		attributes.put(IMarker.CHAR_START, new Integer(Math.max(start, 0)));
-		attributes.put(IMarker.CHAR_END, new Integer(Math.max(end, 0)));
-		if (enclosingElement instanceof IMember && ((IMember)enclosingElement).isBinary())
-			attributes.put(IWorkbenchPage.EDITOR_ID_ATTR, JavaUI.ID_CF_EDITOR);
-		else
-			attributes.put(IWorkbenchPage.EDITOR_ID_ATTR, JavaUI.ID_CU_EDITOR);
-		marker.setAttributes(attributes);
-
-		fView.addMatch(enclosingElement.getElementName(), groupKey, resource, marker);
-		fMatchCount++;
-		if (!getProgressMonitor().isCanceled() && System.currentTimeMillis() - fLastUpdateTime > 1000) {
-			getProgressMonitor().subTask(getFormattedMatchesString(fMatchCount));
-			fLastUpdateTime= System.currentTimeMillis();
-		}
-	}
-	
-	/**
-	 * @see IJavaSearchResultCollector#done().
-	 */
-	public void done() {
-		if (!getProgressMonitor().isCanceled()) {
-			String matchesString= getFormattedMatchesString(fMatchCount);
-			getProgressMonitor().setTaskName(MessageFormat.format(DONE, new String[]{matchesString}));
-		}
-
-		if (fView != null) {
-			if (fPotentialMatchCount > 0)
-				explainPotentialMatch(fPotentialMatchCount);
-			fView.searchFinished();
-		}
-
-		// Cut no longer unused references because the collector might be re-used
-		fView= null;
-		fMonitor= null;
-	}
-
-	private void explainPotentialMatch(final int potentialMatchCount) {
-		// Make sure we are doing it in the right thread.
-		final Shell shell= fView.getSite().getShell();
-		final String title;
-		if (potentialMatchCount == 1)
-			title= new String(SearchMessages.getString("Search.potentialMatchDialog.title.foundPotentialMatch")); //$NON-NLS-1$
-		else
-			title= new String(SearchMessages.getFormattedString("Search.potentialMatchDialog.title.foundPotentialMatches", "" + potentialMatchCount)); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		shell.getDisplay().syncExec(new Runnable() {
-			public void run() {
-				OptionalMessageDialog.open(
-					POTENTIAL_MATCH_DIALOG_ID, //$NON-NLS-1$,
-					shell,
-					title,
-					null,
-					SearchMessages.getString("Search.potentialMatchDialog.message"), //$NON-NLS-1$,
-					MessageDialog.INFORMATION,
-					new String[] { IDialogConstants.OK_LABEL },
-					0);
-			}
-		});
-	}
-	
-	/*
-	 * @see IJavaSearchResultCollector#getProgressMonitor().
-	 */
-	public IProgressMonitor getProgressMonitor() {
-		return fMonitor;
-	}
-	
-	void setProgressMonitor(IProgressMonitor pm) {
-		fMonitor= pm;
-	}	
-	
-	void setOperation(JavaSearchOperation operation) {
-		fOperation= operation;
-	}
-	
-	private String getFormattedMatchesString(int count) {
-		if (fMatchCount == 1)
-			return MATCH;
-		fMessageFormatArgs[0]= new Integer(count);
-		return MessageFormat.format(MATCHES, fMessageFormatArgs);
-
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchMessages.properties b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchMessages.properties
deleted file mode 100644
index 8f5d952..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchMessages.properties
+++ /dev/null
@@ -1,162 +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
-###############################################################################
-
-group.search=S&earch
-group.declarations= Dec&larations
-group.references= Re&ferences
-group.readReferences= &Read Access
-group.writeReferences= &Write Access
-group.implementors= &Implementors
-
-Search.Error.search.title=Search Error
-Search.Error.search.message=An error occurred during the search operation
-
-Search.Error.javaElementAccess.title=Search Error
-Search.Error.javaElementAccess.message=An error occurred while accessing a Java element
-
-Search.Error.markerAttributeAccess.title=Search Error
-Search.Error.markerAttributeAccess.message=An error occurred while accessing a marker attribute
-
-Search.Error.createJavaElement.title=Search Error
-Search.Error.createJavaElement.message=An error occurred while creating a Java element
-
-Search.Error.openEditor.title=Search Error
-Search.Error.openEditor.message=Could not open the editor
-
-Search.Error.codeResolve= Code resolve error
-
-Search.Error.setDescription.title=Search Error
-Search.Error.setDescription.message=Cannot save workspace description
-
-SearchElementSelectionDialog.title=Search
-SearchElementSelectionDialog.message=Select the element to search for.
-
-SearchResultCollector.match= 1 match
-SearchResultCollector.matches= {0} matches
-SearchResultCollector.done= Search done: {0}.
-SearchResultCollector.searching= Searching...
-
-Search.potentialMatchDialog.title.foundPotentialMatch= Search: Found 1 Inexact Match
-Search.potentialMatchDialog.title.foundPotentialMatches= Search: Found {0} Inexact Matches
-Search.potentialMatchDialog.message= Inexact matches were found and will be displayed with a different\nforeground color. This can be configured on the Search preference page.
-
-SearchPage.searchFor.label= Search For
-SearchPage.searchFor.type= &Type
-SearchPage.searchFor.method= &Method
-SearchPage.searchFor.field= &Field
-SearchPage.searchFor.package= &Package
-SearchPage.searchFor.constructor= Co&nstructor
-
-SearchPage.limitTo.label= Limit To
-SearchPage.limitTo.declarations= Dec&larations
-SearchPage.limitTo.implementors= &Implementors
-SearchPage.limitTo.references= &References
-SearchPage.limitTo.allOccurrences= All &Occurrences
-SearchPage.limitTo.readReferences= Read A&ccess
-SearchPage.limitTo.writeReferences= Writ&e Access
-
-SearchPage.expression.label= Se&arch string (* = any string, ? = any character):
-SearchPage.expression.caseSensitive= Case sens&itive
-
-# Concatenate two working set names e.g. "Source, Lib"
-SearchUtil.workingSetConcatenation= {0}, {1}
-
-Search.FindDeclarationAction.label= &Workspace
-Search.FindDeclarationAction.tooltip= Search for Declarations of the Selected Element in the Workspace
-
-Search.FindDeclarationsInWorkingSetAction.label= Working &Set...
-Search.FindDeclarationsInWorkingSetAction.tooltip= Search for Declarations of the Selected Element in a Working Set
-
-Search.FindHierarchyDeclarationsAction.label= &Hierarchy
-Search.FindHierarchyDeclarationsAction.tooltip= Search for Declarations of the Selected Element in its Hierarchy
-
-Search.FindImplementorsAction.label= &Workspace
-Search.FindImplementorsAction.tooltip= Search for Implementors of the Selected Interface
-
-Search.FindImplementorsInWorkingSetAction.label= Working &Set...
-Search.FindImplementorsInWorkingSetAction.tooltip= Search for Implementors of the Selected Interface in a Working Set
-
-Search.FindReferencesAction.label= &Workspace
-Search.FindReferencesAction.tooltip= Search for References to the Selected Element in the Workspace
-
-Search.FindReferencesAction.BinPrimConstWarnDialog.title= Search for References to a Binary Constant
-Search.FindReferencesAction.BinPrimConstWarnDialog.message= Matches to this constant will only be discovered in source files and binary files where the constant value is not inlined.
-
-Search.FindReferencesInWorkingSetAction.label= Working &Set...
-Search.FindReferencesInWorkingSetAction.tooltip= Search for References to the Selected Element in a Working Set
-
-Search.FindHierarchyReferencesAction.label= &Hierarchy
-Search.FindHierarchyReferencesAction.tooltip= Search for References of the Selected Element in its Hierarchy
-
-Search.FindReadReferencesAction.label= &Workspace
-Search.FindReadReferencesAction.tooltip= Search for Read References to the Selected Element in the Workspace
-
-Search.FindReadReferencesInWorkingSetAction.label= Working &Set...
-Search.FindReadReferencesInWorkingSetAction.tooltip= Search for Read References to the Selected Element in a Working Set
-
-Search.FindReadReferencesInHierarchyAction.label= &Hierarchy
-Search.FindReadReferencesInHierarchyAction.tooltip= Search for Read References of the Selected Element in its Hierarchy
-
-Search.FindWriteReferencesAction.label= &Workspace
-Search.FindWriteReferencesAction.tooltip= Search for Write References to the Selected Element in the Workspace
-
-Search.FindWriteReferencesInWorkingSetAction.label= Working &Set...
-Search.FindWriteReferencesInWorkingSetAction.tooltip= Search for Write References to the Selected Element in a Working Set
-
-Search.FindWriteReferencesInHierarchyAction.label= &Hierarchy
-Search.FindWriteReferencesInHierarchyAction.tooltip= Search for Write References of the Selected Element in its Hierarchy
-
-Search.FindOccurrencesInFile.label= Occurre&nces in File
-Search.FindOccurrencesInFile.tooltip= Find occurrences of selected element in the editor
-
-FindOccurrencesEngine.noSource.text= No source available. To perform this operation you need to attach source.
-FindOccurrencesEngine.noJavaElement.text= Cannot search for the current selection. Please select a valid Java element name.
-FindOccurrencesEngine.cannotParse.text= Cannot analyze the compilation unit or class file. 
-
-
-JavaSearchOperation.default_package=(default package)
-
-# The first argument will be replaced by the pattern and the second by the scope
-JavaSearchOperation.singularDeclarationsPostfix={0} - 1 Declaration in {1}
-JavaSearchOperation.singularReferencesPostfix={0} - 1 Reference in {1}
-JavaSearchOperation.singularReadReferencesPostfix={0} - 1 Read Reference in {1}
-JavaSearchOperation.singularWriteReferencesPostfix={0} - 1 Write Reference in {1}
-JavaSearchOperation.singularImplementorsPostfix={0} - 1 Implementor in {1}
-JavaSearchOperation.singularOccurrencesPostfix={0} - 1 Occurrence in {1}
-
-# The first argument will be replaced by the pattern, the second by the count and the last by the scope
-JavaSearchOperation.pluralDeclarationsPostfix={0} - {1} Declarations in {2}
-JavaSearchOperation.pluralReferencesPostfix={0} - {1} References in {2}
-JavaSearchOperation.pluralReadReferencesPostfix={0} - {1} Read References in {2}
-JavaSearchOperation.pluralWriteReferencesPostfix={0} - {1} Write References in {2}
-JavaSearchOperation.pluralImplementorsPostfix={0} - {1} Implementors in {2}
-JavaSearchOperation.pluralOccurrencesPostfix={0} - {1} Occurrences in {2}
-
-# The first argument will be replaced by the element name and the second one by the file name
-JavaSearchInFile.singularPostfix={0} - 1 Occurrence in {1}
-# The first argument will be replaced by the element name, the second by the count and the last by the file name
-JavaSearchInFile.pluralPostfix={0} - {1} Occurrences in {2}
-
-JavaElementAction.typeSelectionDialog.title=Search
-JavaElementAction.typeSelectionDialog.message=&Select the type to search:
-JavaElementAction.error.open.message=An exception occurred while opening the type.
-
-JavaElementAction.operationUnavailable.title= Operation Unavailable
-JavaElementAction.operationUnavailable.generic= The operation is unavailable on the current selection. Please select a valid Java element name.
-JavaElementAction.operationUnavailable.field= The operation is unavailable on the current selection. Please select the name of a field.
-JavaElementAction.operationUnavailable.interface= The operation is unavailable on the current selection. Please select the name of an interface.
-
-JavaSearchResultLabelProvider.potentialMatch= \ (inexact)
-
-WorkspaceScope= Workspace
-WorkingSetScope= Working Set - {0}
-SelectionScope= Selection
-HierarchyScope= Hierarchy - {0}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchUtil.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchUtil.java
deleted file mode 100644
index 53104ac..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchUtil.java
+++ /dev/null
@@ -1,401 +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.jdt.internal.ui.search2;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Platform;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.search.ui.ISearchResultViewEntry;
-
-import org.eclipse.jdt.core.Flags;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.Signature;
-
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.dialogs.OptionalMessageDialog;
-import org.eclipse.jdt.internal.ui.search.IJavaSearchUIConstants;
-import org.eclipse.jdt.internal.ui.search.LRUWorkingSetsList;
-import org.eclipse.jdt.internal.ui.search.SearchMessages;
-import org.eclipse.jdt.internal.ui.search.WorkingSetComparator;
-import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
-
-/**
- * This class contains some utility methods for J Search.
- */
-/**
- * This class contains some utility methods for J Search.
- */
-public class SearchUtil {
-
-	// LRU working sets
-	public static int LRU_WORKINGSET_LIST_SIZE= 3;
-	private static LRUWorkingSetsList fgLRUWorkingSets;
-
-	// Settings store
-	private static final String DIALOG_SETTINGS_KEY= "JavaElementSearchActions"; //$NON-NLS-1$
-	private static final String STORE_LRU_WORKING_SET_NAMES= "lastUsedWorkingSetNames"; //$NON-NLS-1$
-	
-	private static IDialogSettings fgSettingsStore;
-
-	private static final String BIN_PRIM_CONST_WARN_DIALOG_ID= "BinaryPrimitiveConstantWarningDialog"; //$NON-NLS-1$
-
-
-	public static IJavaElement getJavaElement(IMarker marker) {
-		if (marker == null || !marker.exists())
-			return null;
-		try {
-			String handleId= (String)marker.getAttribute(IJavaSearchUIConstants.ATT_JE_HANDLE_ID);
-			IJavaElement je= JavaCore.create(handleId);
-			if (je == null)
-				return null;
-
-			if (!marker.getAttribute(IJavaSearchUIConstants.ATT_IS_WORKING_COPY, false)) {
-				if (je.exists())
-					return je;
-			}
-			
-			ICompilationUnit cu= (ICompilationUnit) je.getAncestor(IJavaElement.COMPILATION_UNIT);
-			if (cu == null) {
-				return je;
-			}
-			if (!cu.exists()) {
-				IResource res= marker.getResource();
-				if (res instanceof IFile) {
-					cu= JavaCore.createCompilationUnitFrom((IFile) res);
-					if (cu == null) {
-						return je;
-					}
-					
-				}
-			}
-			
-			if (!JavaPlugin.USE_WORKING_COPY_OWNERS) {
-				IJavaElement wcElem= JavaModelUtil.toWorkingCopy(je);
-				if (wcElem.exists()) {
-					return wcElem;
-				}
-			}
-
-			if (!je.exists()) {
-				IJavaElement[] jElements= cu.findElements(je);
-				if (jElements == null || jElements.length == 0)
-					je= cu.getElementAt(marker.getAttribute(IMarker.CHAR_START, 0));
-				else
-					je= jElements[0];
-			}
-			return je;
-		} catch (JavaModelException ex) {
-			if (!ex.isDoesNotExist())
-				ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.createJavaElement.title"), SearchMessages.getString("Search.Error.createJavaElement.message")); //$NON-NLS-2$ //$NON-NLS-1$
-			return null;
-		} catch (CoreException ex) {
-			ExceptionHandler.handle(ex, SearchMessages.getString("Search.Error.createJavaElement.title"), SearchMessages.getString("Search.Error.createJavaElement.message")); //$NON-NLS-2$ //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	public static IJavaElement getJavaElement(Object entry) {
-		if (entry != null && isISearchResultViewEntry(entry))
-			return getJavaElement((ISearchResultViewEntry)entry);
-		return null;
-	}
-
-	public static IResource getResource(Object entry) {
-		if (entry != null && isISearchResultViewEntry(entry))
-			return ((ISearchResultViewEntry)entry).getResource();
-		return null;
-	}
-
-	public static IJavaElement getJavaElement(ISearchResultViewEntry entry) {
-		if (entry != null)
-			return getJavaElement(entry.getSelectedMarker());
-		return null;
-	}
-
-	public static boolean isSearchPlugInActivated() {
-		return Platform.getPluginRegistry().getPluginDescriptor("org.eclipse.search").isPluginActivated(); //$NON-NLS-1$
-	}
-
-	public static boolean isISearchResultViewEntry(Object object) {
-		return object != null && isSearchPlugInActivated() && (object instanceof ISearchResultViewEntry);
-	}
-	
-	/**
-	 * Returns the compilation unit for the given java element.
-	 * 
-	 * @param	element the java element whose compilation unit is searched for
-	 * @return	the compilation unit of the given java element
-	 */
-	static ICompilationUnit findCompilationUnit(IJavaElement element) {
-		if (element == null)
-			return null;
-		return (ICompilationUnit) element.getAncestor(IJavaElement.COMPILATION_UNIT);
-	}
-
-	/*
-	 * Copied from JavaModelUtil and patched to allow members which do not exist.
-	 * The only case where this is a problem is for methods which have same name and
-	 * paramters as a constructor. The constructor will win in such a situation.
-	 * 
-	 * @see JavaModelUtil#findMemberInCompilationUnit(ICompilationUnit, IMember)
-	 */		
-	public static IMember findInCompilationUnit(ICompilationUnit cu, IMember member) throws JavaModelException {
-		if (member.getElementType() == IJavaElement.TYPE) {
-			return JavaModelUtil.findTypeInCompilationUnit(cu, JavaModelUtil.getTypeQualifiedName((IType)member));
-		} else {
-			IType declaringType= JavaModelUtil.findTypeInCompilationUnit(cu, JavaModelUtil.getTypeQualifiedName(member.getDeclaringType()));
-			if (declaringType != null) {
-				IMember result= null;
-				switch (member.getElementType()) {
-				case IJavaElement.FIELD:
-					result= declaringType.getField(member.getElementName());
-					break;
-				case IJavaElement.METHOD:
-					IMethod meth= (IMethod) member;
-					// XXX: Begin patch ---------------------
-					boolean isConstructor;
-					if (meth.exists())
-						isConstructor= meth.isConstructor();
-					else
-						isConstructor= declaringType.getElementName().equals(meth.getElementName());
-					// XXX: End patch -----------------------
-					result= JavaModelUtil.findMethod(meth.getElementName(), meth.getParameterTypes(), isConstructor, declaringType);
-					break;
-				case IJavaElement.INITIALIZER:
-					result= declaringType.getInitializer(1);
-					break;					
-				}
-				if (result != null && result.exists()) {
-					return result;
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * XXX: Unchanged copy from JavaModelUtil
-	 */
-	public static IJavaElement findInCompilationUnit(ICompilationUnit cu, IJavaElement element) throws JavaModelException {
-		
-		if (element instanceof IMember)
-			return findInCompilationUnit(cu, (IMember)element);
-		
-		int type= element.getElementType();
-		switch (type) {
-			case IJavaElement.IMPORT_CONTAINER:
-				return cu.getImportContainer();
-			
-			case IJavaElement.PACKAGE_DECLARATION:
-				return find(cu.getPackageDeclarations(), element.getElementName());
-			
-			case IJavaElement.IMPORT_DECLARATION:
-				return find(cu.getImports(), element.getElementName());
-			
-			case IJavaElement.COMPILATION_UNIT:
-				return cu;
-		}
-		
-		return null;
-	}
-	
-	/*
-	 * XXX: Unchanged copy from JavaModelUtil
-	 */
-	private static IJavaElement find(IJavaElement[] elements, String name) {
-		if (elements == null || name == null)
-			return null;
-			
-		for (int i= 0; i < elements.length; i++) {
-			if (name.equals(elements[i].getElementName()))
-				return elements[i];
-		}
-		
-		return null;
-	}
-
-	public static String toString(IWorkingSet[] workingSets) {
-		Arrays.sort(workingSets, new WorkingSetComparator());
-		String result= ""; //$NON-NLS-1$
-		if (workingSets != null && workingSets.length > 0) {
-			boolean firstFound= false;
-			for (int i= 0; i < workingSets.length; i++) {
-				String workingSetName= workingSets[i].getName();
-				if (firstFound)
-					result= SearchMessages.getFormattedString("SearchUtil.workingSetConcatenation", new String[] {result, workingSetName}); //$NON-NLS-1$
-				else {
-					result= workingSetName;
-					firstFound= true;
-				}
-			}
-		}
-		return result;
-	}
-
-	// ---------- LRU working set handling ----------
-
-	/**
-	 * Updates the LRU list of working sets.
-	 * 
-	 * @param workingSets	the workings sets to be added to the LRU list
-	 */
-	public static void updateLRUWorkingSets(IWorkingSet[] workingSets) {
-		if (workingSets == null || workingSets.length < 1)
-			return;
-		
-		getLRUWorkingSets().add(workingSets);
-		saveState();
-	}
-
-	private static void saveState() {
-		IWorkingSet[] workingSets;
-		Iterator iter= fgLRUWorkingSets.iterator();
-		int i= 0;
-		while (iter.hasNext()) {
-			workingSets= (IWorkingSet[])iter.next();
-			String[] names= new String[workingSets.length];
-			for (int j= 0; j < workingSets.length; j++)
-				names[j]= workingSets[j].getName();
-			fgSettingsStore.put(STORE_LRU_WORKING_SET_NAMES + i, names);
-			i++;
-		}
-	}
-
-	public static LRUWorkingSetsList getLRUWorkingSets() {
-		if (fgLRUWorkingSets == null) {
-			restoreState();
-		}
-		return fgLRUWorkingSets;
-	}
-
-	static void restoreState() {
-		fgLRUWorkingSets= new LRUWorkingSetsList(LRU_WORKINGSET_LIST_SIZE);
-		fgSettingsStore= JavaPlugin.getDefault().getDialogSettings().getSection(DIALOG_SETTINGS_KEY);
-		if (fgSettingsStore == null)
-			fgSettingsStore= JavaPlugin.getDefault().getDialogSettings().addNewSection(DIALOG_SETTINGS_KEY);
-		
-		boolean foundLRU= false;
-		for (int i= LRU_WORKINGSET_LIST_SIZE - 1; i >= 0; i--) {
-			String[] lruWorkingSetNames= fgSettingsStore.getArray(STORE_LRU_WORKING_SET_NAMES + i);
-			if (lruWorkingSetNames != null) {
-				Set workingSets= new HashSet(2);
-				for (int j= 0; j < lruWorkingSetNames.length; j++) {
-					IWorkingSet workingSet= PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(lruWorkingSetNames[j]);
-					if (workingSet != null) {
-						workingSets.add(workingSet);
-					}
-				}
-				foundLRU= true;
-				if (!workingSets.isEmpty())
-					fgLRUWorkingSets.add((IWorkingSet[])workingSets.toArray(new IWorkingSet[workingSets.size()]));
-			}
-		}
-		if (!foundLRU)
-			// try old preference format
-			restoreFromOldFormat();
-	}
-
-	private static void restoreFromOldFormat() {
-		fgLRUWorkingSets= new LRUWorkingSetsList(LRU_WORKINGSET_LIST_SIZE);
-		fgSettingsStore= JavaPlugin.getDefault().getDialogSettings().getSection(DIALOG_SETTINGS_KEY);
-		if (fgSettingsStore == null)
-			fgSettingsStore= JavaPlugin.getDefault().getDialogSettings().addNewSection(DIALOG_SETTINGS_KEY);
-
-		boolean foundLRU= false;
-		String[] lruWorkingSetNames= fgSettingsStore.getArray(STORE_LRU_WORKING_SET_NAMES);
-		if (lruWorkingSetNames != null) {
-			for (int i= lruWorkingSetNames.length - 1; i >= 0; i--) {
-				IWorkingSet workingSet= PlatformUI.getWorkbench().getWorkingSetManager().getWorkingSet(lruWorkingSetNames[i]);
-				if (workingSet != null) {
-					foundLRU= true;
-					fgLRUWorkingSets.add(new IWorkingSet[]{workingSet});
-				}
-			}
-		}
-		if (foundLRU)
-			// save in new format
-			saveState();
-	}
-
-	public static void warnIfBinaryConstant(IJavaElement element, Shell shell) {
-		if (isBinaryPrimitveConstantOrString(element))
-			OptionalMessageDialog.open(
-				BIN_PRIM_CONST_WARN_DIALOG_ID,
-				shell,
-				SearchMessages.getString("Search.FindReferencesAction.BinPrimConstWarnDialog.title"), //$NON-NLS-1$
-				null,
-				SearchMessages.getString("Search.FindReferencesAction.BinPrimConstWarnDialog.message"), //$NON-NLS-1$
-				MessageDialog.INFORMATION,
-				new String[] { IDialogConstants.OK_LABEL },
-				0);
-	}
-	
-	private static boolean isBinaryPrimitveConstantOrString(IJavaElement element) {
-		if (element != null && element.getElementType() == IJavaElement.FIELD) {
-			IField field= (IField)element;
-			int flags;
-			try {
-				flags= field.getFlags();
-			} catch (JavaModelException ex) {
-				return false;
-			}
-			return field.isBinary() && Flags.isStatic(flags) && Flags.isFinal(flags) && isPrimitiveOrString(field);
-		}
-		return false;
-	}
-
-	private static boolean isPrimitiveOrString(IField field) {
-		String fieldType;
-		try {
-			fieldType= field.getTypeSignature();
-		} catch (JavaModelException ex) {
-			return false;
-		}
-		char first= fieldType.charAt(0);
-		return (first != Signature.C_RESOLVED && first != Signature.C_UNRESOLVED && first != Signature.C_ARRAY)
-			|| (first == Signature.C_RESOLVED && fieldType.substring(1, fieldType.length() - 1).equals(String.class.getName()));
-	}
-	
-	public static String getProjectScopeDescription(IType type) {
-		IJavaProject project= type.getJavaProject();
-		if (project != null)
-			return SearchMessages.getFormattedString("ProjectScope", project.getElementName()); //$NON-NLS-1$
-		else 
-			return SearchMessages.getFormattedString("ProjectScope", ""); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewActionGroup.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewActionGroup.java
deleted file mode 100644
index 82ace6c..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewActionGroup.java
+++ /dev/null
@@ -1,32 +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.jdt.internal.ui.search2;
-
-import org.eclipse.jface.util.Assert;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.actions.ActionGroup;
-
-import org.eclipse.jdt.ui.actions.JavaSearchActionGroup;
-import org.eclipse.jdt.ui.actions.NavigateActionGroup;
-
-import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
-
-class SearchViewActionGroup extends CompositeActionGroup {
-
-	public SearchViewActionGroup(IViewPart part) {
-		Assert.isNotNull(part);
-		setGroups(new ActionGroup[] {
-			new JavaSearchActionGroup(part),
-			new NavigateActionGroup(new SearchViewAdapter(new SearchViewSiteAdapter(part.getSite())))});
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewAdapter.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewAdapter.java
deleted file mode 100644
index 3777971..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewAdapter.java
+++ /dev/null
@@ -1,139 +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.jdt.internal.ui.search2;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.PartInitException;
-
-/**
- * This class adapts a Search view to return an adapted Search view site.
- * 
- * @see org.eclipse.jdt.internal.ui.search.SearchViewSiteAdapter
- * @since 2.1
- */
-class SearchViewAdapter implements IViewPart {
-	
-	private IWorkbenchPartSite fSite;
-
-	/**
-	 * Constructor for SearchViewAdapter.
-	 */
-	public SearchViewAdapter(IWorkbenchPartSite site) {
-		fSite= site;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchPart#getSite()
-	 */
-	public IWorkbenchPartSite getSite() {
-		return fSite;
-	}
-
-	// --------- only empty stubs below ---------
-
-	/*
-	 * @see org.eclipse.ui.IViewPart#getViewSite()
-	 */
-	public IViewSite getViewSite() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IViewPart#init(IViewSite)
-	 */
-	public void init(IViewSite site) throws PartInitException {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.ui.IViewPart#init(IViewSite, IMemento)
-	 */
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.ui.IViewPart#saveState(IMemento)
-	 */
-	public void saveState(IMemento memento) {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#addPropertyListener(IPropertyListener)
-	 */
-	public void addPropertyListener(IPropertyListener listener) {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(Composite)
-	 */
-	public void createPartControl(Composite parent) {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#dispose()
-	 */
-	public void dispose() {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#getTitle()
-	 */
-	public String getTitle() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#getTitleImage()
-	 */
-	public Image getTitleImage() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#getTitleToolTip()
-	 */
-	public String getTitleToolTip() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#removePropertyListener(IPropertyListener)
-	 */
-	public void removePropertyListener(IPropertyListener listener) {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewSiteAdapter.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewSiteAdapter.java
deleted file mode 100644
index 9ae3195..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jdt/internal/ui/search2/SearchViewSiteAdapter.java
+++ /dev/null
@@ -1,163 +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.jdt.internal.ui.search2;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.PlatformObject;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.util.Assert;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.IWorkbenchWindow;
-
-import org.eclipse.search.ui.ISearchResultViewEntry;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.search.IJavaSearchUIConstants;
-import org.eclipse.jdt.internal.ui.search.SearchMessages;
-import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
-import org.eclipse.jdt.internal.ui.util.SelectionUtil;
-
-/**
- * This class adapts a Search view site.
- * It converts selection of Search view entries to
- * be a selection of Java elements.
- * 
- * @since 2.0
- */
-class SearchViewSiteAdapter extends PlatformObject implements IWorkbenchPartSite {
-	
-	private ISelectionProvider fProvider;
-	private IWorkbenchSite fSite;
-	
-	private ISelectionChangedListener fListener;
-
-	public SearchViewSiteAdapter(IWorkbenchSite site){
-		fSite= site;
-		setSelectionProvider(site.getSelectionProvider());
-	}
-	
-	public IWorkbenchPage getPage() {
-		return fSite.getPage();
-	}
-
-	public ISelectionProvider getSelectionProvider() {
-		return fProvider;
-	}
-
-	public Shell getShell() {
-		return JavaPlugin.getActiveWorkbenchShell();
-	}
-
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return fSite.getWorkbenchWindow();
-	}
-	
-	public void setSelectionProvider(final ISelectionProvider provider) {
-		Assert.isNotNull(provider);
-		fProvider= 
-			new ISelectionProvider() {
-				public void addSelectionChangedListener(final ISelectionChangedListener listener) {
-					fListener=
-						new ISelectionChangedListener() {
-							public void selectionChanged(SelectionChangedEvent event) {
-								listener.selectionChanged(new SelectionChangedEvent(fProvider, convertSelection(event.getSelection())));
-							}
-						};
-					provider.addSelectionChangedListener(fListener);
-				}
-				public ISelection getSelection() {
-					return convertSelection(provider.getSelection());
-				}
-				public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-					provider.removeSelectionChangedListener(fListener);
-				}
-				public void setSelection(ISelection selection) {
-					// empty implementation
-				}
-			};
-	}
-
-	private ISelection convertSelection(ISelection selection) {
-		Object element= SelectionUtil.getSingleElement(selection);
-		if (element instanceof ISearchResultViewEntry) {
-			IMarker marker= ((ISearchResultViewEntry)element).getSelectedMarker();
-			if (marker != null && marker.exists())
-				try {
-					IJavaElement je= JavaCore.create((String) marker.getAttribute(IJavaSearchUIConstants.ATT_JE_HANDLE_ID));
-					if (je != null)
-						return new StructuredSelection(je);
-				} catch (CoreException ex) {
-					ExceptionHandler.log(ex, SearchMessages.getString("Search.Error.createJavaElement.message")); //$NON-NLS-1$
-				}
-		}
-		return StructuredSelection.EMPTY;		
-	}
-	
-	// --------- only empty stubs below ---------
-		
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPartSite#getId()
-	 */
-	public String getId() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPartSite#getKeyBindingService()
-	 */
-	public IKeyBindingService getKeyBindingService() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPartSite#getPluginId()
-	 */
-	public String getPluginId() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPartSite#getRegisteredName()
-	 */
-	public String getRegisteredName() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPartSite#registerContextMenu(MenuManager, ISelectionProvider)
-	 */
-	public void registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider) {
-		// empty implementation
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPartSite#registerContextMenu(String, MenuManager, ISelectionProvider)
-	 */
-	public void registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) {
-		// empty implementation
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/AbstractJspParser.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/AbstractJspParser.java
deleted file mode 100644
index 834f57e..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/AbstractJspParser.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import java.io.IOException;
-import java.io.Reader;
-
-public abstract class AbstractJspParser { 
-	
-	private Reader fReader;
-	private boolean fHasUnread;
-	private int fUnread;
-	private int fPos;
-	protected int fLines= 1;
-	
-	AbstractJspParser() {
-		super();
-	}
-	
-	private int getc() throws IOException {
-		fPos++;
-		if (fHasUnread) {
-			fHasUnread= false;
-			return fUnread;
-		}
-
-		int ch= fReader.read();
-
-		if (ch == '\n') // LF
-			fLines++;
-		else if (ch == '\r')  { // CR
-			int nextCh= getc();
-			if (nextCh != '\n')
-				fLines++;
-			return nextCh;
-		}
-		return ch;
-	}
-	
-	private void ungetc(int c) {
-		fHasUnread= true;
-		fUnread= c;
-		fPos--;
-	}
-	
-	private void parseDirective() throws IOException {
-		StringBuffer sb= new StringBuffer();
-		int pos= fPos;
-		while (true) {
-			int c = getc();
-			if (c == '%') {
-				c= getc();
-				if (c == '>') {
-					// get attributes
-					parseAttributes(pos, sb.toString());
-					return;
-				}
-			}
-			sb.append((char)c);
-		}
-	}
-	
-	private void parseTag(boolean endTag) throws IOException {
-		StringBuffer sb= new StringBuffer();
-		int pos= fPos;
-		while (true) {
-			int c= getc();
-			if (c == '/') {
-				c= getc();
-				if (c == '>') {
-					// get attributes
-					parseAttributes(pos, sb.toString());
-					return;
-				} else {
-					ungetc(c);
-				}
-			} else if (c == '>') {
-				// get attributes
-				parseAttributes(pos, sb.toString());
-				return;
-			}
-			sb.append((char)c);
-		}
-	}
-	
-	private void parseComment() throws IOException {
-		while (true) {
-			int c = getc();
-			if (c == '-') {
-				c= getc();
-				if (c == '-') {
-					c= getc();
-					if (c == '%') {
-						c= getc();
-						if (c == '>') {
-							return;
-						}
-					}
-				}
-			}
-		}
-	}
-
-	private void parseJava(char type) throws IOException {
-		StringBuffer sb= new StringBuffer();
-		int line= fLines;
-		while (true) {
-			int c = getc();
-			if (c == '%') {
-				c= getc();
-				if (c == '>') {
-					java(type, sb.toString(), line);
-					return;
-				}
-			}
-			sb.append((char)c);
-		}
-	}
-	
-	protected void java(char tagType, String contents, int line) {
-		// empty implementation
-	}
-
-	private void parseAttributes(int pos, String s) {
-		
-		boolean hasValue= false;
-		StringBuffer name= new StringBuffer();
-		StringBuffer value= new StringBuffer();
-		String startTag= ""; //$NON-NLS-1$
-		int i= 0;
-		int ix= 0;
-		int startName= 0;
-		int startValue= 0;
-		char c= s.charAt(i++);
-		
-		try {
-			while (true) {
-				
-				// whitespace		
-				while (Character.isWhitespace(c))
-					c= s.charAt(i++);
-					
-				startName= i;
-				while (Character.isLetterOrDigit(c) || c == ':') {
-					name.append(c);
-					c= s.charAt(i++);
-				}
-				
-				// whitespace		
-				while (Character.isWhitespace(c))
-					c= s.charAt(i++);
-					
-				hasValue= false;
-				if (c == '=') {
-					c= s.charAt(i++);
-					
-					// value
-					while (Character.isWhitespace(c))
-						c= s.charAt(i++);
-						
-					startValue= i;
-
-					// Special handling for this taglib tag
-					if (startTag.equals("c:out"))  { //$NON-NLS-1$
-						value= value.append(s.substring(startValue, Math.max(startValue, s.length() - 2)));
-						name.setLength(0);
-						tagAttribute(name.toString(), value.toString(), startName+pos, startValue+pos);
-						break;
-					} else if (c == '"') {
-						c= s.charAt(i++);
-						while (c != '"') {
-							value.append(c);
-							c= s.charAt(i++);
-						}
-						c= s.charAt(i++);
-
-					} else {
-						while (Character.isLetterOrDigit(c)) {
-							value.append(c);
-							c= s.charAt(i++);
-						}
-					}
-					hasValue= true;
-				}
-					
-				if (ix == 0)  {
-					startTag= name.toString();
-					startTag(false, startTag, startName+pos);
-				} else 
-					tagAttribute(name.toString(), hasValue ? value.toString() : null, startName+pos, startValue+pos);
-				ix++;
-				
-				name.setLength(0);
-				value.setLength(0);
-			}
-		} catch (StringIndexOutOfBoundsException e) {
-			// we don't log this exception because it is used
-			// as one way to exit the scanning loop
-		}
-		
-		if (name.length() > 0) {
-			if (ix == 0)
-				startTag(false, name.toString(), startName+pos);
-			else 
-				tagAttribute(name.toString(), hasValue ? value.toString() : null, startName+pos, startValue+pos);
-		}
-		
-		endTag(false);
-	}
-	
-	protected void startTag(boolean endTag, String name, int startName) {
-		// empty implementation
-	}
-	
-	protected void tagAttribute(String attrName, String value, int startName, int startValue) {
-		// empty implementation
-	}
-	
-	protected void endTag(boolean end) {
-		// empty implementation
-	}
-	
-	protected void text(String t, int line) {
-		// empty implementation
-	}
-	
-	void parse(Reader reader) throws IOException {
-		int c;
-		StringBuffer buffer= new StringBuffer();
-		fPos= 0;
-		fLines= 1;
-		int line= fLines;
-		fReader= reader;	
-
-		while (true) {
-			c= getc();
-			switch (c) {
-			case -1:
-				if (buffer.length() > 0)
-					text(buffer.toString(), line);
-				return;
-			case '<':
-				c= getc();
-				if (c == '%') {
-					// flush buffer
-					if (buffer.length() > 0) {
-						text(buffer.toString(), line);
-						buffer.setLength(0);
-						line= fLines;
-					}
-					c= getc();
-					switch (c) {
-					case '-':
-						c= getc();
-						if (c == '-') {
-							parseComment();
-						} else {
-							ungetc(c);
-							continue;
-						}	
-						break;
-					case '@':
-						parseDirective();
-						break;
-					case ' ':
-					case '!':
-					case '=':
-						parseJava((char)c);
-						break;
-					default:
-						parseComment();
-						break;
-					}
-				} else if (c == '/') {
-					parseTag(true);
-				} else {
-					ungetc(c);
-					parseTag(false);
-				}
-				break;
-			default:
-				buffer.append((char)c);
-				break;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JavaFamilyExamplePreferencePage.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JavaFamilyExamplePreferencePage.java
deleted file mode 100644
index 0bdabcc..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JavaFamilyExamplePreferencePage.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-
-public class JavaFamilyExamplePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite c= new Composite(parent, SWT.NULL);
-		//c.setLayout(new FillLayout());
-		
-		final Button b= new Button(c, SWT.NULL);
-		b.setText(getButtonLabel());
-		b.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				JspUIPlugin.getDefault().controlJSPIndexing(!JspUIPlugin.getDefault().isJSPIndexingOn());
-				b.setText(getButtonLabel());
-			}
-		});
-		b.pack();
-		
-		return c;
-	}
-	
-	private String getButtonLabel() {
-		if (JspUIPlugin.getDefault().isJSPIndexingOn())
-			return "Stop JSP Indexing"; //$NON-NLS-1$
-		return "Start JSP Indexing"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {
-		// empty implementation
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspIndexParser.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspIndexParser.java
deleted file mode 100644
index 0dd5f28..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspIndexParser.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import java.io.*;
-import java.io.Reader;
-
-import org.eclipse.core.indexsearch.*;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-
-/**
- * @author weinand
- */
-public class JspIndexParser extends AbstractJspParser implements IIndexer {
-	
-	public static final String JSP_TYPE_REF= "jsp_typeRef";	//$NON-NLS-1$
-	
-	IFile fFile;
-	String fFilePath;
-	boolean fInUseBean;
-	String fId;
-	String fClass;
-	IIndex fOutput;
-	
-
-	JspIndexParser(IFile resource) {
-		fFile= resource;
-	}
-	
-	protected void startTag(boolean endTag, String name, int startName) {
-		fInUseBean= "jsp:useBean".equals(name); //$NON-NLS-1$
-	}
-	
-	protected void tagAttribute(String attrName, String value, int startName, int startValue) {
-		if (fInUseBean) {
-			if ("id".equals(attrName)) //$NON-NLS-1$
-				fId= value;
-			else if ("class".equals(attrName)) //$NON-NLS-1$
-				fClass= value;
-		}
-	}
-	
-	protected void endTag(boolean end) {
-		if (fInUseBean) {
-			if (fId != null && fClass != null) {
-
-				String s= JSP_TYPE_REF + "/" + fClass; //$NON-NLS-1$
-				System.out.println("  " + s); //$NON-NLS-1$
-				fOutput.addRef(s, fFilePath);				
-
-				fId= fClass= null;
-			}
-			fInUseBean= false;
-		}
-	}
-	
-	public void index(IIndex indexerOutput) throws IOException {
-		
-		String type= fFile.getFileExtension();
-		if (type != null && JspUIPlugin.JSP_TYPE.equalsIgnoreCase(type)) {
-			
-			// Add the name of the file to the index
-			String path= fFile.getFullPath().toString();
-			
-			String encoding= null;
-			/*
-			 try {
-				encoding= fFile.getCharset();
-			} catch (CoreException e1) {
-			}
-			*/
-			if (encoding == null)
-				encoding= ResourcesPlugin.getEncoding();
-			
-			String s= null;
-			IPath location= fFile.getLocation();
-			if (location == null)
-				s= "";
-			else
-				s= new String(Util.getFileCharContent(location.toFile(), encoding));
-			
-			try {
-				Reader reader= new StringReader(s);
-				fOutput= indexerOutput;
-				fFilePath= path;			
-				parse(reader);
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspMatchLocatorParser.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspMatchLocatorParser.java
deleted file mode 100644
index d7a8995..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspMatchLocatorParser.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.indexsearch.*;
-
-
-public class JspMatchLocatorParser extends AbstractJspParser {
-
-	IFile fResource;
-	String fMatchString;
-	ISearchResultCollector fCollector;
-
-	boolean fInUseBean;
-	String fId;
-	String fClass;
-
-	public JspMatchLocatorParser() {
-		super();
-	}
-
-	protected void startTag(boolean endTag, String name, int startName) {
-		fInUseBean= "jsp:useBean".equals(name); //$NON-NLS-1$
-	}
-
-	protected void tagAttribute(String attrName, String value, int startName, int startValue) {
-		if (fInUseBean && "class".equals(attrName) && fMatchString.equals(value)) { //$NON-NLS-1$
-			try {
-				fCollector.accept(fResource, startValue, value.length());
-			} catch (CoreException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	public void match(IFile resource, String matchString, ISearchResultCollector collector) {
-		
-		fResource= resource;
-		fMatchString= matchString;
-		fCollector= collector;
-		Reader reader= null;
-		
-		try {
-			reader= new InputStreamReader(fResource.getContents());
-		} catch (CoreException e1) {
-			e1.printStackTrace();
-		}
-				
-		try {
-			parse(reader);
-		} catch (IOException e2) {
-			e2.printStackTrace();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspPluginImages.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspPluginImages.java
deleted file mode 100644
index 9a74eec..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspPluginImages.java
+++ /dev/null
@@ -1,163 +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.jsp;
-
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * The images provided by the debug plugin.
- */
-public class JspPluginImages {
-
-	/** 
-	 * The image registry containing <code>Image</code>s.
-	 */
-	private static ImageRegistry imageRegistry;
-	
-	/**
-	 * A table of all the <code>ImageDescriptor</code>s.
-	 */
-	private static HashMap imageDescriptors;
-	
-	/* Declare Common paths */
-	private static URL ICON_BASE_URL= null;
-
-	static {
-		String pathSuffix = "icons/full/"; //$NON-NLS-1$
-			
-		try {
-			ICON_BASE_URL= new URL(JspUIPlugin.getDefault().getDescriptor().getInstallURL(), pathSuffix);
-		} catch (MalformedURLException e) {
-			// do nothing
-		}
-	}
-
-	// Use IPath and toOSString to build the names to ensure they have the slashes correct
-	//private final static String CTOOL= "ctool16/"; //basic colors - size 16x16 //$NON-NLS-1$
-	//private final static String LOCALTOOL= "clcl16/"; //basic colors - size 16x16 //$NON-NLS-1$
-	//private final static String DLCL= "dlcl16/"; //disabled - size 16x16 //$NON-NLS-1$
-	//private final static String ELCL= "elcl16/"; //enabled - size 16x16 //$NON-NLS-1$
-	private final static String OBJECT= "obj16/"; //basic colors - size 16x16 //$NON-NLS-1$
-	//private final static String WIZBAN= "wizban/"; //basic colors - size 16x16 //$NON-NLS-1$
-	//private final static String OVR= "ovr16/"; //basic colors - size 7x8 //$NON-NLS-1$
-	//private final static String VIEW= "cview16/"; // views //$NON-NLS-1$
-	
-	public final static String IMG_OBJ_TOMCAT = "IMG_TOMCAT"; //$NON-NLS-1$
-	public final static String IMG_OBJ_JSP = "IMG_OBJ_JSP"; //$NON-NLS-1$
-	
-	/**
-	 * Declare all images
-	 */
-	private static void declareImages() {
-
-		declareRegistryImage(IMG_OBJ_TOMCAT, OBJECT + "tomcat_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(IMG_OBJ_JSP, OBJECT + "jsp_obj.gif"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Declare an Image in the registry table.
-	 * @param key 	The key to use when registering the image
-	 * @param path	The path where the image can be found. This path is relative to where
-	 *				this plugin class is found (i.e. typically the packages directory)
-	 */
-	private final static void declareRegistryImage(String key, String path) {
-		ImageDescriptor desc= ImageDescriptor.getMissingImageDescriptor();
-		try {
-			desc= ImageDescriptor.createFromURL(makeIconFileURL(path));
-		} catch (MalformedURLException me) {
-			DebugPlugin.log(me);
-		}
-		imageRegistry.put(key, desc);
-		imageDescriptors.put(key, desc);
-	}
-	
-	/**
-	 * Returns the ImageRegistry.
-	 */
-	public static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			initializeImageRegistry();
-		}
-		return imageRegistry;
-	}
-
-	/**
-	 *	Initialize the image registry by declaring all of the required
-	 *	graphics. This involves creating JFace image descriptors describing
-	 *	how to create/find the image should it be needed.
-	 *	The image is not actually allocated until requested.
-	 *
-	 * 	Prefix conventions
-	 *		Wizard Banners			WIZBAN_
-	 *		Preference Banners		PREF_BAN_
-	 *		Property Page Banners	PROPBAN_
-	 *		Color toolbar			CTOOL_
-	 *		Enable toolbar			ETOOL_
-	 *		Disable toolbar			DTOOL_
-	 *		Local enabled toolbar	ELCL_
-	 *		Local Disable toolbar	DLCL_
-	 *		Object large			OBJL_
-	 *		Object small			OBJS_
-	 *		View 					VIEW_
-	 *		Product images			PROD_
-	 *		Misc images				MISC_
-	 *
-	 *	Where are the images?
-	 *		The images (typically gifs) are found in the same location as this plugin class.
-	 *		This may mean the same package directory as the package holding this class.
-	 *		The images are declared using this.getClass() to ensure they are looked up via
-	 *		this plugin class.
-	 *	@see JFace's ImageRegistry
-	 */
-	public static ImageRegistry initializeImageRegistry() {
-		imageRegistry= new ImageRegistry(JspUIPlugin.getStandardDisplay());
-		imageDescriptors = new HashMap(30);
-		declareImages();
-		return imageRegistry;
-	}
-
-	/**
-	 * Returns the <code>Image<code> identified by the given key,
-	 * or <code>null</code> if it does not exist.
-	 */
-	public static Image getImage(String key) {
-		return getImageRegistry().get(key);
-	}
-	
-	/**
-	 * Returns the <code>ImageDescriptor<code> identified by the given key,
-	 * or <code>null</code> if it does not exist.
-	 */
-	public static ImageDescriptor getImageDescriptor(String key) {
-		if (imageDescriptors == null) {
-			initializeImageRegistry();
-		}
-		return (ImageDescriptor)imageDescriptors.get(key);
-	}
-	
-	private static URL makeIconFileURL(String iconPath) throws MalformedURLException {
-		if (ICON_BASE_URL == null) {
-			throw new MalformedURLException();
-		}
-			
-		return new URL(ICON_BASE_URL, iconPath);
-	}
-}
-
-
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspSearchEngine.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspSearchEngine.java
deleted file mode 100644
index c9bc908..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspSearchEngine.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import org.eclipse.core.indexsearch.IIndexQuery;
-import org.eclipse.core.indexsearch.ISearchResultCollector;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.search.IJavaSearchResultCollector;
-
-
-public class JspSearchEngine {
-
-	public static void search(final IJavaSearchResultCollector collector, final IIndexQuery query, IProgressMonitor pm) {
-		
-		System.out.println("JspSearchEngine.search: " + query); //$NON-NLS-1$
-									
-		JspUIPlugin.getDefault().search(
-			query,
-			new ISearchResultCollector() {
-				public void accept(IResource resource, int start, int length) throws CoreException {
-					System.out.println("  accept: " + resource); //$NON-NLS-1$
-					collector.accept(resource, start, start+length, null, 999);
-				}
-			},
-			pm
-		);
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspTranslator.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspTranslator.java
deleted file mode 100644
index 3bab3ac..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspTranslator.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.util.ArrayList;
-
-import org.eclipse.jface.text.source.ITagHandler;
-import org.eclipse.jface.text.source.ITagHandlerFactory;
-import org.eclipse.jface.text.source.ITranslator;
-
-import org.eclipse.jdt.internal.ui.examples.jspeditor.JspTranslatorResultCollector;
-
-
-public class JspTranslator extends AbstractJspParser implements ITranslator {
-	
-	private StringBuffer fDeclarations= new StringBuffer();
-	private StringBuffer fContent= new StringBuffer();
-	private StringBuffer fLocalDeclarations= new StringBuffer();
-	
-	private ArrayList fContentLines= new ArrayList();
-	private ArrayList fDeclarationLines= new ArrayList();
-	private ArrayList fLocalDeclarationLines= new ArrayList();
-	private int[] fSmap;
-	
-	private ITagHandlerFactory fTagHandlerFactor;
-	private ITagHandler fCurrentTagHandler;
-
-	private JspTranslatorResultCollector fResultCollector;
-	
-	
-	public JspTranslator() {
-		
-		// Links for passing parameters to the tag handlers 
-		fResultCollector= new JspTranslatorResultCollector(fDeclarations, fLocalDeclarations, fContent, fDeclarationLines, fLocalDeclarationLines, fContentLines);
-	}
-		
-	protected void startTag(boolean endTag, String name, int startName) {
-
-		fCurrentTagHandler= fTagHandlerFactor.getHandler(name);
-	}
-	
-	protected void tagAttribute(String attrName, String value, int startName, int startValue) {
-
-		if (fCurrentTagHandler != null)
-			fCurrentTagHandler.addAttribute(attrName, value, fLines);
-	}
-	
-	protected void endTag(boolean end) {
-
-		if (fCurrentTagHandler != null)
-			try  {
-				fCurrentTagHandler.processEndTag(fResultCollector, fLines);
-			} catch (IOException ex)  {
-				ex.printStackTrace();
-			}
-	}
-	
-	protected void java(char ch, String java, int line) {
-
-		if (ch == '!')
-			fCurrentTagHandler= fTagHandlerFactor.getHandler("<%!"); //$NON-NLS-1$
-		else
-			fCurrentTagHandler= fTagHandlerFactor.getHandler("<%"); //$NON-NLS-1$
-
-		/*
-		 * XXX: This is needed because the used parser does not treat
-		 *      "<%" like every other tag.
-		 */
-		fCurrentTagHandler.addAttribute("source", java, line); //$NON-NLS-1$
-
-		try {
-			fCurrentTagHandler.processEndTag(fResultCollector, line);
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-	}
-	
-	protected void text(String t, int line) {
-		int i= 0;
-		StringBuffer out= new StringBuffer();
-		while (i < t.length()) {
-			char c= t.charAt(i++);
-			if (c == '\n') {
-				fContent.append("    System.out.println(\"" + out.toString() + "\");  //$NON-NLS-1$\n");  //$NON-NLS-1$//$NON-NLS-2$
-				fContentLines.add(new Integer(line++));
-				out.setLength(0);
-			} else {
-				out.append(c);	
-			}
-		}
-		if (out.length() > 0)  {
-			fContent.append("    System.out.print(\"" + out.toString() + "\");  //$NON-NLS-1$\n"); //$NON-NLS-1$ //$NON-NLS-2$
-			fContentLines.add(new Integer(line));
-		}
-	}
-	
-	private void resetTranslator() {
-		fDeclarations.setLength(0);
-		fContent.setLength(0);
-		fLocalDeclarations.setLength(0);
-		
-		fLocalDeclarationLines.clear();
-		fContentLines.clear();
-		fDeclarationLines.clear();
-		
-	}
-
-	public String translate(Reader reader, String name) throws IOException  {
-
-		StringBuffer buffer= new StringBuffer();
-		
-		resetTranslator();
-		parse(reader);
-
-		int lineCount= 2 + fDeclarationLines.size() + 1 + 1 + fLocalDeclarationLines.size() + fContentLines.size() + 3;
-		fSmap= new int[lineCount];
-		int line= 0;
-		fSmap[line++]= 1;
-
-		buffer.append("public class " + name + " {\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		fSmap[line++]= 1;
-		fSmap[line++]= 1;
-
-		buffer.append(fDeclarations.toString() + "\n"); //$NON-NLS-1$
-		System.out.println(fDeclarations.toString());
-		for (int i= 0; i < fDeclarationLines.size(); i++)  {
-			fSmap[line++]= ((Integer)fDeclarationLines.get(i)).intValue();
-			System.out.println("" + ((Integer)fDeclarationLines.get(i)).intValue()); //$NON-NLS-1$
-		}
-		fSmap[line]= fSmap[line - 1] + 1;
-		line++;
-
-		buffer.append("  public void out() {\n"); //$NON-NLS-1$
-		fSmap[line]= fSmap[line - 1] + 1;
-		line++;
-		
-		if (fLocalDeclarations.length() > 0)  {
-			buffer.append(fLocalDeclarations.toString());
-			System.out.println(fLocalDeclarations);
-			for (int i= 0; i < fLocalDeclarationLines.size(); i++) {
-				System.out.println("" + ((Integer)fLocalDeclarationLines.get(i)).intValue()); //$NON-NLS-1$
-				fSmap[line++]= ((Integer)fLocalDeclarationLines.get(i)).intValue();
-			}
-		}
-		
-		buffer.append(fContent.toString());
-		System.out.println(fContent);
-		for (int i= 0; i < fContentLines.size(); i++)  {
-			fSmap[line++]= ((Integer)fContentLines.get(i)).intValue();
-			System.out.println("" + ((Integer)fContentLines.get(i)).intValue()); //$NON-NLS-1$
-		}
-
-		buffer.append("  }\n"); //$NON-NLS-1$
-		fSmap[line]= fSmap[line - 1];
-
-		line++;
-		
-		buffer.append("}\n"); //$NON-NLS-1$
-		fSmap[line]= fSmap[line - 2];
-		
-		for (int i= 0; i < fSmap.length; i++)
-			System.out.println("" + i + " -> " + fSmap[i]); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		System.out.println(buffer.toString());
-		
-		return buffer.toString();
-	}
-	
-	public int[] getLineMapping()  {
-		return fSmap;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.source.ITranslator#setTagHandlerFactory(org.eclipse.jface.text.source.ITagHandlerFactory)
-	 */
-	public void setTagHandlerFactory(ITagHandlerFactory tagHandlerFactory) {
-		fTagHandlerFactor= tagHandlerFactory;
-	}
-
-	/*
-	 * @see ITranslator#backTranslateOffsetInLine(String, String, int)
-	 */
-	public int backTranslateOffsetInLine(String originalLine, String translatedLine, int offsetInTranslatedLine, String tag)  {
-
-		ITagHandler handler;
-		if (tag != null)
-			handler= fTagHandlerFactor.getHandler(tag);
-		else
-			handler= fTagHandlerFactor.findHandler(originalLine);
-
-		if (handler != null)
-			return handler.backTranslateOffsetInLine(originalLine, translatedLine, offsetInTranslatedLine);
-
-		return -1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspTypeQuery.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspTypeQuery.java
deleted file mode 100644
index 44a15e1..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspTypeQuery.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.indexsearch.*;
-import org.eclipse.core.indexsearch.IIndexQuery;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-
-/**
- * Implementation for a JSP type query.
- */
-public class JspTypeQuery implements IIndexQuery {
-
-	private IType fType;
-	private JspMatchLocatorParser fParser;
-	
-	public JspTypeQuery(IType type) {
-		fType= type;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.search.ISearch#computePathsKeyingIndexFiles(java.util.ArrayList)
-	 */
-	public void computePathsKeyingIndexFiles(ArrayList requiredIndexKeys) {
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IProject[] projects= workspace.getRoot().getProjects();
-		try {
-			for (int i= 0; i < projects.length; i++) {
-				IProject project= projects[i];
-				if (!project.isAccessible() || !project.hasNature(JavaCore.NATURE_ID))
-					continue;
-				IPath path= project.getFullPath();
-				if (requiredIndexKeys.indexOf(path) == -1) {
-					requiredIndexKeys.add(path);
-				}
-			}
-		} catch (CoreException ex) {
-			JspUIPlugin.log("jsp query internal error", ex); //$NON-NLS-1$
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.search.ISearch#findIndexMatches(org.eclipse.jdt.internal.core.index.IIndex, org.eclipse.jdt.internal.core.search.PathCollector, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void findIndexMatches(IIndex index, HashSet pathCollector, IProgressMonitor progressMonitor) throws IOException {
-
-		String typeName= fType.getFullyQualifiedName();
-		String s= JspIndexParser.JSP_TYPE_REF + "/" + typeName; //$NON-NLS-1$
-		index.queryPrefix(pathCollector, s);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.search.ISearch#locateMatches(org.eclipse.core.resources.IFile, org.eclipse.jsp.IJspSearchResultCollector)
-	 */
-	public void locateMatches(IFile candidate, ISearchResultCollector resultCollector) {
-		if (fParser== null)
-			fParser= new JspMatchLocatorParser();
-		String typeName= fType.getFullyQualifiedName();
-		fParser.match(candidate, typeName, resultCollector);
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspUIPlugin.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspUIPlugin.java
deleted file mode 100644
index 0b25dc5..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/JspUIPlugin.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import org.eclipse.core.indexsearch.IIndexQuery;
-import org.eclipse.core.indexsearch.ISearchResultCollector;
-import org.eclipse.core.indexsearch.SearchEngine;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceProxy;
-import org.eclipse.core.resources.IResourceProxyVisitor;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageRegistry;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.editors.text.TextEditorPreferenceConstants;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-
-/**
- */
-public class JspUIPlugin extends AbstractUIPlugin implements IResourceChangeListener {
-		
-	/**
-	 * The id of the JavaFamilyExample plugin (value <code>"org.eclipse.jdt.ui.examples.javafamily"</code>).
-	 */	
-	public static final String ID_PLUGIN= "org.eclipse.jdt.ui.examples.javafamily"; //$NON-NLS-1$
-
-	public static final String JSP_TYPE= "jsp"; //$NON-NLS-1$
-	
-	private static final boolean DEBUG= false;
-	private static JspUIPlugin fgDefault;
-	private static boolean fgJSPIndexingIsEnabled= false;
-	
-	private SearchEngine fSearchEngine;
-	
-	/**
-	 * @param descriptor
-	 */
-	public JspUIPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		fgDefault= this;
-		fSearchEngine= SearchEngine.getSearchEngine();
-	}
-	
-	public static JspUIPlugin getDefault() {
-		return fgDefault;
-	}
-
-	void controlJSPIndexing(boolean enable) {
-		if (fgJSPIndexingIsEnabled != enable) {
-			fgJSPIndexingIsEnabled= enable;
-			IWorkspace workspace= ResourcesPlugin.getWorkspace();
-			if (enable) {
-				
-				IResourceProxyVisitor visitor=
-					new IResourceProxyVisitor() {
-						public boolean visit(IResourceProxy proxy) throws CoreException {
-							String name= proxy.getName();
-							int pos= name.lastIndexOf('.');
-							if (pos >= 0) {
-								String extension= name.substring(pos+1);
-								if (JSP_TYPE.equalsIgnoreCase(extension)) {
-									IResource r= proxy.requestResource();
-									if (r instanceof IFile)
-										jspAdded((IFile)r);
-								}
-							}
-							return true;
-						}
-					};
-				try {
-					workspace.getRoot().accept(visitor, 0);
-				} catch (CoreException e) {
-					log("visiting jsp files", e); //$NON-NLS-1$
-				}
-				
-				workspace.addResourceChangeListener(this,
-	//					IResourceChangeEvent.PRE_AUTO_BUILD |
-	//					IResourceChangeEvent.POST_AUTO_BUILD |
-						IResourceChangeEvent.POST_CHANGE |
-						IResourceChangeEvent.PRE_DELETE |
-						IResourceChangeEvent.PRE_CLOSE
-				);					
-			} else {
-				workspace.removeResourceChangeListener(this);					
-			}
-		}
-	}
-		
-	boolean isJSPIndexingOn() {
-		return fgJSPIndexingIsEnabled;
-	}
-	
-	public void resourceChanged(IResourceChangeEvent event) {
-		if ( !fgJSPIndexingIsEnabled || event == null)
-			return;
-		IResourceDelta d= event.getDelta();
-		if (d == null)
-			return;
-		try {
-			d.accept(
-				new IResourceDeltaVisitor() {
-					public boolean visit(IResourceDelta delta) {
-						if (delta != null) {
-							IResource r= delta.getResource();
-							if (r instanceof IFile) {
-								IFile file= (IFile) r;
-								String type= file.getFileExtension();
-								if (JSP_TYPE.equalsIgnoreCase(type)) {
-									switch (delta.getKind()) {
-									case IResourceDelta.ADDED:
-										jspAdded(file);
-										break;
-									case IResourceDelta.REMOVED:
-										jspRemoved(file);
-										break;
-									case IResourceDelta.CHANGED:
-										// no need to index if the content has not changed
-										if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
-											jspAdded(file);
-										break;
-									}					
-								}
-							}
-						}
-						return true;
-					}
-				}
-			);
-		} catch (CoreException e) {
-			log("processing resource delta", e); //$NON-NLS-1$
-		}
-	}
-	
-	public static void log(String message, Throwable e) {
-		getDefault().getLog().log(new Status(IStatus.ERROR, ID_PLUGIN, IStatus.ERROR, message, e));
-	}
-	
-	void jspAdded(IFile jspFile) {
-		if (DEBUG) System.out.println("Added: " + jspFile); //$NON-NLS-1$		
-		JspIndexParser indexer= new JspIndexParser(jspFile);
-		fSearchEngine.add(jspFile.getProject().getFullPath(), indexer);
-	}
-	
-	void jspRemoved(IFile jspFile) {
-		if (DEBUG) System.out.println("Removed: " + jspFile); //$NON-NLS-1$
-		fSearchEngine.remove(jspFile.getFullPath().toString(), jspFile.getProject().getFullPath());
-	}
-	
-	public void search(IIndexQuery query, ISearchResultCollector resultCollector, IProgressMonitor pm) {
-		fSearchEngine.search(query, resultCollector, pm, SearchEngine.WAIT_UNTIL_READY_TO_SEARCH);
-	}
-		
-	/**
-	 * Shutdown the JspCore plug-in.
-	 * <p>
-	 * De-registers the resource changed listener.
-	 * <p>
-	 * @see org.eclipse.core.runtime.Plugin#shutdown()
-	 */
-	public void shutdown() {
-		controlJSPIndexing(false);
-	}
-	
-	protected void initializeDefaultPreferences(IPreferenceStore prefs) {
-		TextEditorPreferenceConstants.initializeDefaultValues(prefs);
-	}
-	
-	/**
-	 * Returns the standard display to be used. The method first checks, if
-	 * the thread calling this method has an associated display. If so, this
-	 * display is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display= Display.getCurrent();
-		if (display == null) {
-			display= Display.getDefault();
-		}
-		return display;		
-	}
-	
-	protected ImageRegistry createImageRegistry() {
-		return JspPluginImages.initializeImageRegistry();
-	}	
-		
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/RenameTypeParticipant.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/RenameTypeParticipant.java
deleted file mode 100644
index 70a7a84..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/RenameTypeParticipant.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003 International Business Machines Corp. and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v0.5 
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jsp;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.text.edits.ReplaceEdit;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.core.indexsearch.ISearchResultCollector;
-
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.internal.corext.refactoring.CompositeChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.changes.TextChangeCompatibility;
-import org.eclipse.jdt.internal.corext.refactoring.changes.TextFileChange;
-import org.eclipse.jdt.internal.corext.refactoring.participants.IRefactoringProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.participants.RenameParticipant;
-
-
-public class RenameTypeParticipant extends RenameParticipant {
-
-	private IType fType;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.corext.refactoring.participants.IRefactoringParticipant#initialize(org.eclipse.jdt.internal.corext.refactoring.participants.IRefactoringProcessor, java.lang.Object)
-	 */
-	public void initialize(IRefactoringProcessor processor, Object element) throws CoreException {
-		super.initialize(processor);
-		fType= (IType)element;
-	}
-
-	public boolean operatesOn(Object element) {
-		return fType.equals(element);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.corext.refactoring.participants.IRenameParticipant#isAvailable()
-	 */
-	public boolean isAvailable() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.corext.refactoring.participants.IRenameParticipant#checkActivation()
-	 */
-	public RefactoringStatus checkActivation() throws CoreException {
-		return new RefactoringStatus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.corext.refactoring.participants.IRenameParticipant#checkInput(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public RefactoringStatus checkInput(IProgressMonitor pm) throws CoreException {
-		return new RefactoringStatus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.corext.refactoring.participants.IRenameParticipant#createChange(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IChange createChange(IProgressMonitor pm) throws CoreException {
-		final Map changes= new HashMap();
-		final String newName= computeNewName();
-		ISearchResultCollector collector= new ISearchResultCollector() {
-			public void accept(IResource resource, int start, int length) throws CoreException {
-				TextFileChange change= (TextFileChange)changes.get(resource);
-				if (change == null) {
-					change= new TextFileChange(resource.getName(), (IFile)resource);
-					changes.put(resource, change);
-				}
-				TextChangeCompatibility.addTextEdit(change, "Update type reference", new ReplaceEdit(start, length, newName));
-			}
-		};
-		JspUIPlugin.getDefault().search(new JspTypeQuery(fType), collector, pm);
-		
-		if (changes.size() == 0)
-			return null;
-		CompositeChange result= new CompositeChange("JSP updates"); //$NON-NLS-1$
-		for (Iterator iter= changes.values().iterator(); iter.hasNext();) {
-			result.add((IChange)iter.next());
-		}
-		return result;
-	}
-	
-	private String computeNewName() {
-		String currentName= fType.getFullyQualifiedName();
-		int pos= currentName.lastIndexOf('.');
-		if (pos == -1)
-			return getNewName();
-		return currentName.substring(0, pos + 1) + getNewName();
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/Util.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/Util.java
deleted file mode 100644
index b83b9f2..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/Util.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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.jsp;
-
-import java.io.*;
-import java.io.File;
-
-public class Util {
-	
-	static char[] getChars(String s) {
-		int l= s.length();
-		char[] cc= new char[l];
-		if (l > 0)
-			s.getChars(0, l, cc, 0);
-		return cc;
-	}
-	
-	static char[] getFileCharContent(File file, String encoding) throws IOException {
-		System.out.println("****jdt.internal.compiler.util.Util.getFileCharContent: " + file + " " + encoding);
-		InputStream stream = null;
-		try {
-			stream = new BufferedInputStream(new FileInputStream(file));
-			return Util.getInputStreamAsCharArray(stream, (int) file.length(), encoding);
-		} finally {
-			if (stream != null) {
-				try {
-					stream.close();
-				} catch (IOException e) {
-					// ignore
-				}
-			}
-		}
-	}
-
-	public static char[] getInputStreamAsCharArray(InputStream stream, int length, String encoding) throws IOException {
-		InputStreamReader reader = (encoding == null)
-			? new InputStreamReader(stream)
-			: new InputStreamReader(stream, encoding);
-		char[] contents;
-		if (length == -1) {
-			contents = new char[0];
-			int contentsLength = 0;
-			int amountRead = -1;
-			do {
-				int amountRequested = Math.max(stream.available(), 8192);  // read at least 8K
-
-				// resize contents if needed
-				if (contentsLength + amountRequested > contents.length) {
-					System.arraycopy(
-							contents,
-							0,
-							contents = new char[contentsLength + amountRequested],
-							0,
-							contentsLength);
-				}
-
-				// read as many chars as possible
-				amountRead = reader.read(contents, contentsLength, amountRequested);
-
-				if (amountRead > 0) {
-					// remember length of contents
-					contentsLength += amountRead;
-				}
-			} while (amountRead != -1);
-
-			// resize contents if necessary
-			if (contentsLength < contents.length) {
-				System.arraycopy(
-						contents,
-						0,
-						contents = new char[contentsLength],
-						0,
-						contentsLength);
-			}
-		} else {
-			contents = new char[length];
-			int len = 0;
-			int readSize = 0;
-			while ((readSize != -1) && (len != length)) {
-				// See PR 1FMS89U
-				// We record first the read size. In this case len is the actual read size.
-				len += readSize;
-				readSize = reader.read(contents, len, length - len);
-			}
-			// See PR 1FMS89U
-			// Now we need to resize in case the default encoding used more than one byte for each
-			// character
-			if (len != length)
-				System.arraycopy(contents, 0, (contents = new char[len]), 0, len);
-		}
-
-		return contents;
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/LaunchingMessages.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/LaunchingMessages.java
deleted file mode 100644
index f0c7c3d..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/LaunchingMessages.java
+++ /dev/null
@@ -1,43 +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.jsp.launching;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * LaunchingMessages
- */
-public class LaunchingMessages {
-
-	private static final String BUNDLE_NAME = "org.eclipse.jsp.launching.LaunchingMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE =
-		ResourceBundle.getBundle(BUNDLE_NAME);
-
-	/**
-	 * 
-	 */
-	private LaunchingMessages() {
-		super();
-	}
-	/**
-	 * @param key
-	 * @return
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/LaunchingMessages.properties b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/LaunchingMessages.properties
deleted file mode 100644
index 1c314cd..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/LaunchingMessages.properties
+++ /dev/null
@@ -1,34 +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
-###############################################################################
-
-ToggleJspBreakpointAction.2=Toggle Breakpoint
-
-TomcatLaunchDelegate.6=Unable to resolve ${catalina_home}
-TomcatLaunchDelegate.7=Specified $catalina_home does not exist: {0}
-TomcatLaunchDelegate.8=Unable to resolve ${catalina_home}
-TomcatLaunchDelegate.9=${catalina_home} variable does not exist.
-
-TomcatTab.3=&Tomcat install location:
-TomcatTab.4=Select a Tomcat installation directory
-TomcatTab.5=Tomcat installation directory does not exist.
-TomcatTab.6=Tomcat installation directory is not a directory.
-TomcatTab.7=Tomcat
-TomcatTab.21=&Browse...
-TomcatTab.22=W&eb application root:
-TomcatTab.23=B&rowse...
-TomcatTab.24=Select a single folder
-TomcatTab.25=Select a folder
-TomcatTab.27=Selected folder does not contain a WEB-INF folder
-TomcatTab.28=Web Application Selection
-TomcatTab.29=Choose the root folder of a web application
-TomcatTab.30=Specified web application root does not exist.
-TomcatTab.31=Specified web application root must be a folder or project.
-
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/ToggleJspBreakpointAction.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/ToggleJspBreakpointAction.java
deleted file mode 100644
index f1722c4..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/ToggleJspBreakpointAction.java
+++ /dev/null
@@ -1,91 +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.jsp.launching;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.jdt.debug.core.IJavaStratumLineBreakpoint;
-import org.eclipse.jdt.debug.core.JDIDebugModel;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * ToggleJspBreakpointAction
- */
-public class ToggleJspBreakpointAction extends Action implements IAction {
-	
-	private ITextEditor fEditor;
-	private IVerticalRulerInfo fRulerInfo;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
-		IBreakpoint[] breakpoints = manager.getBreakpoints();
-		IResource resource = getResource();
-		int lineNumber = fRulerInfo.getLineOfLastMouseButtonActivity() + 1;
-		for (int i = 0; i < breakpoints.length; i++) {
-			IBreakpoint bp = breakpoints[i];
-			if (bp instanceof IJavaStratumLineBreakpoint) {
-				IJavaStratumLineBreakpoint breakpoint = (IJavaStratumLineBreakpoint)bp;
-				if (breakpoint.getMarker().getResource().equals(resource)) {
-					try {
-						if (breakpoint.getLineNumber() == lineNumber) {
-							// remove
-							breakpoint.delete();
-							return;
-						}
-					} catch (CoreException e) {
-						e.printStackTrace();
-					}
-				} 
-			}
-		}
-		createBreakpoint();
-	}
-	
-	protected void createBreakpoint() {
-		IResource resource = getResource();
-		int lineNumber = fRulerInfo.getLineOfLastMouseButtonActivity() + 1;
-		try {
-			JDIDebugModel.createStratumBreakpoint(resource, "JSP", resource.getName(), null, "*_jsp", lineNumber, -1, -1, 0, true, null); //$NON-NLS-1$ //$NON-NLS-2$
-		} catch (CoreException e) {
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * @param editor
-	 * @param rulerInfo
-	 */
-	public ToggleJspBreakpointAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
-		super(LaunchingMessages.getString("ToggleJspBreakpointAction.2")); //$NON-NLS-1$
-		fEditor = editor;
-		fRulerInfo = rulerInfo; 
-	}
-
-	protected IResource getResource() {
-		IEditorInput input= fEditor.getEditorInput();
-		IResource resource= (IResource) input.getAdapter(IFile.class);
-		if (resource == null) {
-			resource= (IResource) input.getAdapter(IResource.class);
-		}
-		return resource;
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/ToggleJspBreakpointRulerActionDelegate.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/ToggleJspBreakpointRulerActionDelegate.java
deleted file mode 100644
index 85cafef..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/ToggleJspBreakpointRulerActionDelegate.java
+++ /dev/null
@@ -1,31 +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.jsp.launching;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * ToggleJspBreakpointActionDelegate
- */
-public class ToggleJspBreakpointRulerActionDelegate extends AbstractRulerActionDelegate {
-
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.AbstractRulerActionDelegate#createAction(org.eclipse.ui.texteditor.ITextEditor, org.eclipse.jface.text.source.IVerticalRulerInfo)
-	 */
-	protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
-		return new ToggleJspBreakpointAction(editor, rulerInfo);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatClasspathProvider.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatClasspathProvider.java
deleted file mode 100644
index d6eb4b5..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatClasspathProvider.java
+++ /dev/null
@@ -1,82 +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.jsp.launching;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
-import org.eclipse.jdt.launching.IVMInstall;
-import org.eclipse.jdt.launching.JavaRuntime;
-import org.eclipse.jdt.launching.LibraryLocation;
-import org.eclipse.jdt.launching.StandardClasspathProvider;
-
-/**
- * TomcatClasspathProvider
- */
-public class TomcatClasspathProvider extends StandardClasspathProvider {
-
-	/**
-	 * Tomcat requires <code>tools.jar</code> and <code>bootstrap.jar</code> on its
-	 * classpath.
-	 * 
-	 * @see org.eclipse.jdt.launching.IRuntimeClasspathProvider#computeUnresolvedClasspath(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public IRuntimeClasspathEntry[] computeUnresolvedClasspath(ILaunchConfiguration configuration) throws CoreException {
-		boolean useDefault = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, true);
-		if (useDefault) {
-			IVMInstall vm = JavaRuntime.computeVMInstall(configuration);
-			LibraryLocation[] libs = JavaRuntime.getLibraryLocations(vm);
-			if (libs == null) {
-				return new IRuntimeClasspathEntry[0];
-			} else {
-				List rtes = new ArrayList();
-				// add bootstrap.jar
-				String catalinaHome = TomcatLaunchDelegate.getCatalinaHome();
-				IPath path = new Path(catalinaHome).append("bin").append("bootstrap.jar"); //$NON-NLS-1$ //$NON-NLS-2$
-				IRuntimeClasspathEntry r = JavaRuntime.newArchiveRuntimeClasspathEntry(path);
-				rtes.add(r);
-				// add class libraries to bootpath			
-				boolean tools = false; // keeps track of whether a tools.jar was found	
-				for (int i = 0; i < libs.length; i++) {
-					LibraryLocation lib = libs[i];
-					r = JavaRuntime.newArchiveRuntimeClasspathEntry(lib.getSystemLibraryPath());
-					r.setSourceAttachmentPath(lib.getSystemLibrarySourcePath());
-					r.setSourceAttachmentRootPath(lib.getPackageRootPath());
-					r.setClasspathProperty(IRuntimeClasspathEntry.STANDARD_CLASSES);
-					rtes.add(r);
-					if (lib.getSystemLibraryPath().toString().endsWith("tools.jar")) { //$NON-NLS-1$
-						tools = true;
-					}
-				}
-				if (!tools) {
-					// add a tools.jar
-					IPath toolsPath = new Path(vm.getInstallLocation().getAbsolutePath()).append("lib").append("tools.jar"); //$NON-NLS-1$ //$NON-NLS-2$
-					if (toolsPath.toFile().exists()) {
-						r = JavaRuntime.newArchiveRuntimeClasspathEntry(toolsPath);
-						r.setClasspathProperty(IRuntimeClasspathEntry.USER_CLASSES);
-						rtes.add(r);
-					}
-				}
-				return (IRuntimeClasspathEntry[])rtes.toArray(new IRuntimeClasspathEntry[rtes.size()]);
-			}				
-		} else {
-			// recover persisted classpath
-			return recoverRuntimePath(configuration, IJavaLaunchConfigurationConstants.ATTR_CLASSPATH);
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatLaunchDelegate.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatLaunchDelegate.java
deleted file mode 100644
index 1d7946a..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatLaunchDelegate.java
+++ /dev/null
@@ -1,102 +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.jsp.launching;
-
-import java.io.File;
-import java.text.MessageFormat;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.IValueVariable;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.jdt.debug.core.IJavaDebugTarget;
-import org.eclipse.jdt.internal.launching.JavaLocalApplicationLaunchConfigurationDelegate;
-import org.eclipse.jsp.JspUIPlugin;
-
-/**
- * Launch delegate for a local Tomcat server
- */
-public class TomcatLaunchDelegate extends JavaLocalApplicationLaunchConfigurationDelegate {
-
-	/**
-	 * Identifier for Tomcat launch configurations.
-	 */
-	public static final String ID_TOMCAT_LAUNCH_CONFIGURATION_TYPE = "org.eclipse.jsp.TomcatConfigurationType"; //$NON-NLS-1$
-	
-	/**
-	 * Identifier for Tomcat classpath provider.
-	 */
-	public static final String ID_TOMCAT_CLASSPATH_PROVIDER = "org.eclipse.jsp.tomcatClasspathProvider"; //$NON-NLS-1$
-		
-	/**
-	 * Launch configuration attribute - value is path to local installation of Tomcat.
-	 * The path may be encoded in a launch variable.
-	 */
-	public static final String ATTR_CATALINA_HOME = "org.eclipse.jsp.CATALINA_HOME"; //$NON-NLS-1$
-	
-	/**
-	 * Launch configuration attribute - value is a workspace relative path to the root
-	 * folder of a web application.
-	 */
-	public static final String ATTR_WEB_APP_ROOT= "org.eclipse.jsp.WEB_APP_ROOT"; //$NON-NLS-1$	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
-		super.launch(configuration, mode, launch, monitor);
-		
-		// set default stratum
-		IJavaDebugTarget target = (IJavaDebugTarget)launch.getDebugTarget();
-		if (target != null) {
-			// only available in debug mode
-			target.setDefaultStratum("JSP"); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * Constructs a new launch delegate
-	 */
-	public TomcatLaunchDelegate() {
-		super();
-	}
-
-	/**
-	 * Returns the value of the <code>${catalina_home}</code> launch variable.
-	 * 
-	 * @return the value of the <code>${catalina_home}</code> launch variable
-	 * @exception CoreException if the variable or value is undefined
-	 */
-	public static String getCatalinaHome() throws CoreException {
-		IValueVariable variable = VariablesPlugin.getDefault().getStringVariableManager().getValueVariable("catalina_home"); //$NON-NLS-1$
-		IStatus err = null;
-		if (variable == null) {
-			err = new Status(IStatus.ERROR, JspUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), 0, LaunchingMessages.getString("TomcatLaunchDelegate.9"), null); //$NON-NLS-1$
-		} else {
-			String home = variable.getValue();	
-			if (home != null && home.length() > 0) {
-				File file = new File(home);
-				if (file.exists() && file.isDirectory()) {
-					return home;
-				} else {
-					err = new Status(IStatus.ERROR, JspUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), 0, MessageFormat.format(LaunchingMessages.getString("TomcatLaunchDelegate.7"), new String[]{home}), null); //$NON-NLS-1$
-				}
-			} else {
-				err = new Status(IStatus.ERROR, JspUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), 0, LaunchingMessages.getString("TomcatLaunchDelegate.8"), null); //$NON-NLS-1$
-			}
-		}
-		throw new CoreException(err);
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatSourceLocator.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatSourceLocator.java
deleted file mode 100644
index e47dfc9..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatSourceLocator.java
+++ /dev/null
@@ -1,86 +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.jsp.launching;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.jdt.debug.core.IJavaStackFrame;
-import org.eclipse.jdt.debug.ui.JavaUISourceLocator;
-
-/**
- * A source locator for a Tomcat launch configuration
- */
-public class TomcatSourceLocator extends JavaUISourceLocator {
-	
-	/**
-	 * Root web app folder, or <code>null</code> if none
-	 */
-	private IContainer fWebAppRoot;
-	
-	public static final String ID_TOMCAT_SOURCE_LOCATOR = "org.eclipse.jsp.TOMCAT_SOURCE_LOCATOR"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(org.eclipse.debug.core.model.IStackFrame)
-	 */
-	public Object getSourceElement(IStackFrame stackFrame) {
-		if (fWebAppRoot != null) {
-			IJavaStackFrame frame = (IJavaStackFrame)stackFrame.getAdapter(IJavaStackFrame.class);
-			if (frame != null) {
-				String sourceName;
-				try {
-					sourceName = frame.getSourceName();
-					if (sourceName != null && sourceName.endsWith("jsp")) { //$NON-NLS-1$
-						String sourcePath = frame.getSourcePath("JSP"); //$NON-NLS-1$
-						if (sourcePath == null) {
-							sourcePath = sourceName;
-						}
-						IPath path = new Path(sourcePath);
-						IFile file = fWebAppRoot.getFile(path);
-						if (file.exists()) {
-							return file;
-						} else {
-							return null;
-						}
-					}
-				} catch (DebugException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		return super.getSourceElement(stackFrame);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IPersistableSourceLocator#initializeDefaults(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeDefaults(ILaunchConfiguration configuration) throws CoreException {
-		super.initializeDefaults(configuration);
-		String root = configuration.getAttribute(TomcatLaunchDelegate.ATTR_WEB_APP_ROOT, (String)null);
-		if (root != null) {
-			IPath path = new Path(root);
-			IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
-			if (resource != null && resource instanceof IContainer) {
-				fWebAppRoot = (IContainer)resource;
-			} 
-		}
-	}
-	
-	
-
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatSourceLookupTab.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatSourceLookupTab.java
deleted file mode 100644
index 3335ac1..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatSourceLookupTab.java
+++ /dev/null
@@ -1,41 +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.jsp.launching;
-
-import java.util.List;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaSourceLookupTab;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-
-/**
- * A source locator tab for a Tomcat launch confiugration
- */
-public class TomcatSourceLookupTab extends JavaSourceLookupTab {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, TomcatSourceLocator.ID_TOMCAT_SOURCE_LOCATOR);
-		configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_SOURCE_PATH, (String)null);
-		configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH, (List)null);
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		super.performApply(configuration);
-		configuration.setAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_ID, TomcatSourceLocator.ID_TOMCAT_SOURCE_LOCATOR);
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatTab.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatTab.java
deleted file mode 100644
index 4d6b382..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatTab.java
+++ /dev/null
@@ -1,356 +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.jsp.launching;
-
- 
-import java.io.File;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.variables.VariablesPlugin;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jsp.JspPluginImages;
-import org.eclipse.jsp.JspUIPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-import org.eclipse.ui.model.WorkbenchContentProvider;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-import org.eclipse.ui.views.navigator.ResourceSorter;
-
-/**
- * Specifies the install location of Tomcat.
- */
-public class TomcatTab extends AbstractLaunchConfigurationTab {
-		
-		
-	// Tomcat location
-	private Button fBrowseButton;
-	private Text fTomcatDir;
-	
-	// WebApp location
-	private Button fWebAppButton;
-	private Text fWebAppDir;
-	
-	/**
-	 * Constructs a new Tomcat tab
-	 */
-	public TomcatTab() {
-		super();
-	}
-		
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		
-		Font font = parent.getFont();
-				
-		Composite composite = new Composite(parent, SWT.NONE);		
-		GridLayout workingDirLayout = new GridLayout();
-		workingDirLayout.numColumns = 3;
-		workingDirLayout.marginHeight = 0;
-		workingDirLayout.marginWidth = 0;
-		composite.setLayout(workingDirLayout);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		composite.setLayoutData(gd);
-		composite.setFont(font);
-		setControl(composite);
-		
-		createVerticalSpacer(composite, 3);
-				
-		Label label = new Label(composite, SWT.NONE);
-		label.setText(LaunchingMessages.getString("TomcatTab.3")); //$NON-NLS-1$
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		gd.horizontalSpan = 3;
-		label.setLayoutData(gd);
-		label.setFont(font);
-				
-		fTomcatDir = new Text(composite, SWT.SINGLE | SWT.BORDER);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		fTomcatDir.setLayoutData(gd);
-		fTomcatDir.setFont(font);
-		fTomcatDir.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent evt) {
-				updateLaunchConfigurationDialog();
-			}
-		});
-		
-		fBrowseButton = createPushButton(composite, LaunchingMessages.getString("TomcatTab.21"), null); //$NON-NLS-1$
-		fBrowseButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleTomcatBrowseButtonSelected();
-			}
-		});
-		
-		createVerticalSpacer(composite, 3);
-		
-		label = new Label(composite, SWT.NONE);
-		label.setText(LaunchingMessages.getString("TomcatTab.22")); //$NON-NLS-1$
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		gd.horizontalSpan = 3;
-		label.setLayoutData(gd);
-		label.setFont(font);
-				
-		fWebAppDir = new Text(composite, SWT.SINGLE | SWT.BORDER);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		fWebAppDir.setLayoutData(gd);
-		fWebAppDir.setFont(font);
-		fWebAppDir.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent evt) {
-				updateLaunchConfigurationDialog();
-			}
-		});
-		
-		fWebAppButton = createPushButton(composite, LaunchingMessages.getString("TomcatTab.23"), null); //$NON-NLS-1$
-		fWebAppButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent evt) {
-				handleWebAppBrowseButtonSelected();
-			}
-		});		
-	}
-		
-	/**
-	 * Show a dialog that lets the user select a root WebApp directory
-	 * from the workspace
-	 */
-	protected void handleWebAppBrowseButtonSelected() {
-		ISelectionStatusValidator validator= new ISelectionStatusValidator() {
-			public IStatus validate(Object[] selection) {
-				if (selection.length != 1) {
-					return new Status(IStatus.ERROR, JspUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), 0, LaunchingMessages.getString("TomcatTab.24"), null); //$NON-NLS-1$
-				}
-				if (!(selection[0] instanceof IContainer)) {
-					return new Status(IStatus.ERROR, JspUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), 0, LaunchingMessages.getString("TomcatTab.25"), null); //$NON-NLS-1$
-				}
-				// check for "WEB-INF"
-				IContainer container = (IContainer)selection[0];
-				if (!container.getFolder(new Path("WEB-INF")).exists()) { //$NON-NLS-1$
-					return new Status(IStatus.WARNING, JspUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), 0, LaunchingMessages.getString("TomcatTab.27"), null); //$NON-NLS-1$
-				}		
-				return new Status(IStatus.OK, JspUIPlugin.getDefault().getDescriptor().getUniqueIdentifier(), 0, "", null); //$NON-NLS-1$
-			}			
-		};
-		
-		ILabelProvider lp= new WorkbenchLabelProvider();
-		ITreeContentProvider cp= new WorkbenchContentProvider();
-
-		ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(getShell(), lp, cp);
-		dialog.setSorter(new ResourceSorter(ResourceSorter.NAME));
-		dialog.addFilter(new ViewerFilter() {
-			public boolean select(Viewer viewer, Object parentElement, Object element) {
-				return element instanceof IContainer;
-			}
-		});
-		dialog.setValidator(validator);
-		dialog.setTitle(LaunchingMessages.getString("TomcatTab.28")); //$NON-NLS-1$
-		dialog.setMessage(LaunchingMessages.getString("TomcatTab.29")); //$NON-NLS-1$
-		dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());	
-
-		if (dialog.open() == Window.OK) {
-			Object[] elements= dialog.getResult();
-			if (elements != null && elements.length == 1) {
-				fWebAppDir.setText(((IResource)elements[0]).getFullPath().toString());
-			}
-		}
-		
-	}
-
-	/**
-	 * Show a dialog that lets the user select a tomcat install directory
-	 */
-	protected void handleTomcatBrowseButtonSelected() {
-		DirectoryDialog dialog = new DirectoryDialog(getShell());
-		dialog.setMessage(LaunchingMessages.getString("TomcatTab.4")); //$NON-NLS-1$
-		String currentWorkingDir = fTomcatDir.getText();
-		if (!currentWorkingDir.trim().equals("")) { //$NON-NLS-1$
-			File path = new File(currentWorkingDir);
-			if (path.exists()) {
-				dialog.setFilterPath(currentWorkingDir);
-			}			
-		}
-		
-		String selectedDirectory = dialog.open();
-		if (selectedDirectory != null) {
-			fTomcatDir.setText(selectedDirectory);
-		}		
-	}
-					
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#dispose()
-	 */
-	public void dispose() {
-		// empty implementation
-	}
-		
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#isValid(ILaunchConfiguration)
-	 */
-	public boolean isValid(ILaunchConfiguration config) {
-		setErrorMessage(null);
-		setMessage(null);
-		
-		String workingDirPath = fTomcatDir.getText().trim();
-		// resolve variables (if any)
-		String expansion;
-		try {
-			expansion = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(workingDirPath);
-		} catch (CoreException e) {
-			setErrorMessage(e.getMessage());
-			return false;
-		}
-		if (workingDirPath.length() > 0) {
-			File dir = new File(expansion);
-			if (!dir.exists()) {
-				setErrorMessage(LaunchingMessages.getString("TomcatTab.5")); //$NON-NLS-1$
-				return false;
-			}
-			if (!dir.isDirectory()) {
-				setErrorMessage(LaunchingMessages.getString("TomcatTab.6")); //$NON-NLS-1$
-				return false;
-			}
-		}	
-		
-		String webappDirPath = fWebAppDir.getText().trim();
-		if (webappDirPath.length() > 0) {
-			IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(webappDirPath));
-			if (resource == null) {
-				setErrorMessage(LaunchingMessages.getString("TomcatTab.30")); //$NON-NLS-1$
-				return false;
-			}
-			if (!(resource instanceof IContainer)) {
-				setErrorMessage(LaunchingMessages.getString("TomcatTab.31")); //$NON-NLS-1$
-				return false;
-			}
-		}	
-					
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy config) {
-		config.setAttribute(TomcatLaunchDelegate.ATTR_CATALINA_HOME, "${catalina_home}"); //$NON-NLS-1$
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH_PROVIDER, TomcatLaunchDelegate.ID_TOMCAT_CLASSPATH_PROVIDER);
-		config.setAttribute(IJavaLaunchConfigurationConstants.ATTR_MAIN_TYPE_NAME, "org.apache.catalina.startup.Bootstrap"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		try {
-			fTomcatDir.setText(configuration.getAttribute(TomcatLaunchDelegate.ATTR_CATALINA_HOME, "")); //$NON-NLS-1$
-			fWebAppDir.setText(configuration.getAttribute(TomcatLaunchDelegate.ATTR_WEB_APP_ROOT, "")); //$NON-NLS-1$
-			if (configuration.isWorkingCopy()) {
-				// set VM args
-				ILaunchConfigurationWorkingCopy workingCopy = (ILaunchConfigurationWorkingCopy)configuration;
-				String home = TomcatLaunchDelegate.getCatalinaHome();
-				IPath endorsed = new Path(home).append("common").append("endorsed");  //$NON-NLS-1$//$NON-NLS-2$
-				IPath temp = new Path(home).append("temp"); //$NON-NLS-1$
-				StringBuffer args = new StringBuffer();
-				args.append("-Djava.endorsed.dirs=\""); //$NON-NLS-1$
-				args.append(endorsed.toOSString());
-				args.append("\" "); //$NON-NLS-1$
-				args.append("-Dcatalina.base=\""); //$NON-NLS-1$
-				args.append(home);
-				args.append("\" "); //$NON-NLS-1$
-				args.append("-Dcatalina.home=\""); //$NON-NLS-1$
-				args.append(home);
-				args.append("\" "); //$NON-NLS-1$
-				args.append("-Djava.io.tmpdir=\""); //$NON-NLS-1$
-				args.append(temp.toOSString());
-				args.append("\"");  //$NON-NLS-1$
-				workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, args.toString());
-				workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, "start"); //$NON-NLS-1$
-			}
-		} catch (CoreException e) {
-			setErrorMessage(e.getMessage());
-			DebugPlugin.log(e);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		configuration.setAttribute(TomcatLaunchDelegate.ATTR_CATALINA_HOME, getAttributeValueFrom(fTomcatDir));
-		String webApp = getAttributeValueFrom(fWebAppDir);
-		configuration.setAttribute(TomcatLaunchDelegate.ATTR_WEB_APP_ROOT, webApp);
-		// set project (if there is one)
-		if (webApp != null) {
-			IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(webApp));
-			if (resource != null) {
-				configuration.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, resource.getProject().getName());
-			}
-		}		
-	}
-
-	/**
-	 * Retuns the string in the text widget, or <code>null</code> if empty.
-	 * 
-	 * @return text or <code>null</code>
-	 */
-	protected String getAttributeValueFrom(Text text) {
-		String content = text.getText().trim();
-		if (content.length() > 0) {
-			return content;
-		}
-		return null;
-	}
-	
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return LaunchingMessages.getString("TomcatTab.7"); //$NON-NLS-1$
-	}	
-		
-	/**
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return JspPluginImages.getImage(JspPluginImages.IMG_OBJ_TOMCAT);
-	}	
-
-}
-
diff --git a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatTabGroup.java b/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatTabGroup.java
deleted file mode 100644
index ba95321..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/src/org/eclipse/jsp/launching/TomcatTabGroup.java
+++ /dev/null
@@ -1,39 +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.jsp.launching;
-
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaClasspathTab;
-import org.eclipse.jdt.debug.ui.launchConfigurations.JavaJRETab;
-
-/**
- * Tab group for launching a local Tomcat server.
- */
-public class TomcatTabGroup extends AbstractLaunchConfigurationTabGroup {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#createTabs(org.eclipse.debug.ui.ILaunchConfigurationDialog, java.lang.String)
-	 */
-	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
-		ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
-			new TomcatTab(),
-			new JavaJRETab(),
-			new JavaClasspathTab(),
-			new TomcatSourceLookupTab(),
-			new CommonTab(),
-		};
-		setTabs(tabs);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/stuff/Search.java b/org.eclipse.jdt.ui.examples.javafamily/stuff/Search.java
deleted file mode 100644
index e669ad0..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/stuff/Search.java
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- * Created on Apr 24, 2003
- *
- * To change this generated comment go to 
- * Window>Preferences>Java>Code Generation>Code Template
- */
-package org.eclipse.jsp.core.search;
-
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Hashtable;
-
-import javax.servlet.jsp.tagext.TagInfo;
-import javax.servlet.jsp.tagext.TagLibraryInfo;
-
-import org.apache.jasper.CommandLineContext;
-import org.apache.jasper.JasperException;
-import org.apache.jasper.JspCompilationContext;
-import org.apache.jasper.Options;
-import org.apache.jasper.compiler.*;
-import org.apache.jasper.compiler.Compiler;
-import org.xml.sax.Attributes;
-
-/**
- * @author weinand
- */
-public class Search {
-	
-	static JspCompilationContext context= new JspCompilationContext() {
-		public String getClassPath() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public JspReader getReader() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public ServletWriter getWriter() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public ClassLoader getClassLoader() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public boolean isErrorPage() {
-			// TODO Auto-generated method stub
-			return false;
-		}
-
-		public String getOutputDir() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public String getJavacOutputDir() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public String getJspFile() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public String getServletClassName() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public String getServletPackageName() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public String getServletJavaFileName() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public boolean keepGenerated() {
-			// TODO Auto-generated method stub
-			return false;
-		}
-
-		public String getContentType() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public Options getOptions() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public void setContentType(String arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void setReader(JspReader arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void setWriter(ServletWriter arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void setServletClassName(String arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void setServletPackageName(String arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void setServletJavaFileName(String arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void setErrorPage(boolean arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public Compiler createCompiler() throws JasperException {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public String resolveRelativeUri(String arg0) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public InputStream getResourceAsStream(String arg0) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public URL getResource(String arg0) throws MalformedURLException {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public String getRealPath(String arg0) {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public String[] getTldLocation(String arg0) throws JasperException {
-			// TODO Auto-generated method stub
-			return null;
-		}
-	};
-	
-	static ParseEventListener pel= new ParseEventListener() {
-		public void setReader(JspReader arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void setDefault(boolean arg0) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void setTemplateInfo(Mark arg0, Mark arg1) {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void beginPageProcessing() throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleComment(Mark arg0, Mark arg1, char[] arg2)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleDirective(
-			String arg0,
-			Mark arg1,
-			Mark arg2,
-			Attributes arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleDeclaration(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			char[] arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleScriptlet(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			char[] arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleExpression(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			char[] arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleBean(Mark arg0, Mark arg1, Attributes arg2)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleBean(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			boolean arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleBeanEnd(Mark arg0, Mark arg1, Attributes arg2)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleGetProperty(Mark arg0, Mark arg1, Attributes arg2)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleSetProperty(Mark arg0, Mark arg1, Attributes arg2)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleSetProperty(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			boolean arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handlePlugin(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			Hashtable arg3,
-			String arg4)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handlePlugin(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			Hashtable arg3,
-			String arg4,
-			boolean arg5)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleCharData(Mark arg0, Mark arg1, char[] arg2)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public TagLibraries getTagLibraries() {
-			// TODO Auto-generated method stub
-			return null;
-		}
-
-		public void handleTagBegin(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			String arg3,
-			String arg4,
-			TagLibraryInfo arg5,
-			TagInfo arg6,
-			boolean arg7)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleTagBegin(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			String arg3,
-			String arg4,
-			TagLibraryInfo arg5,
-			TagInfo arg6,
-			boolean arg7,
-			boolean arg8)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleTagEnd(
-			Mark arg0,
-			Mark arg1,
-			String arg2,
-			String arg3,
-			Attributes arg4,
-			TagLibraryInfo arg5,
-			TagInfo arg6,
-			boolean arg7)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleForward(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			Hashtable arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleForward(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			Hashtable arg3,
-			boolean arg4)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleInclude(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			Hashtable arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleInclude(
-			Mark arg0,
-			Mark arg1,
-			Attributes arg2,
-			Hashtable arg3,
-			boolean arg4)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void endPageProcessing() throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleRootBegin(Attributes arg0) throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleRootEnd() {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleUninterpretedTagBegin(
-			Mark arg0,
-			Mark arg1,
-			String arg2,
-			Attributes arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleUninterpretedTagEnd(
-			Mark arg0,
-			Mark arg1,
-			String arg2,
-			char[] arg3)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-
-		public void handleJspCdata(Mark arg0, Mark arg1, char[] arg2)
-			throws JasperException {
-			// TODO Auto-generated method stub
-
-		}
-	};
-
-	public static void main(String[] args) {
-				
-		String file= null;
-		String encoding= null;
-		InputStreamReader reader= null;
-		
-		try {
-			Parser p= new Parser(context, file, encoding, reader, pel);
-			p.parse();
-		} catch (ParseException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (FileNotFoundException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (JasperException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/stuff/easy.jsp b/org.eclipse.jdt.ui.examples.javafamily/stuff/easy.jsp
deleted file mode 100644
index ace438a..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/stuff/easy.jsp
+++ /dev/null
@@ -1,15 +0,0 @@
-<%@ page contentType="text/html" %>
-<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
-<html>
-  <head>
-    <title>JSP is Easy</title>
-  </head>
-  <body bgcolor="white">
-
-    <h1>JSP is as easy as ...</h1>
-
-    <%-- Calculate the sum of 1 + 2 + 3 dynamically --%>
-    1 + 2 + 3 = <c:out value="${1 + 2 + 3}" />
-
-  </body>
-</html>
diff --git a/org.eclipse.jdt.ui.examples.javafamily/stuff/easy_jsp.java b/org.eclipse.jdt.ui.examples.javafamily/stuff/easy_jsp.java
deleted file mode 100644
index c95b485..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/stuff/easy_jsp.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.apache.jsp;
-
-import javax.servlet.*;
-import javax.servlet.http.*;
-import javax.servlet.jsp.*;
-import org.apache.jasper.runtime.*;
-
-public class easy_jsp extends HttpJspBase {
-
-
-  private static java.util.Vector _jspx_includes;
-
-  private org.apache.jasper.runtime.TagHandlerPool _jspx_tagPool_c_out_value;
-
-  public easy_jsp() {
-    _jspx_tagPool_c_out_value = new org.apache.jasper.runtime.TagHandlerPool();
-  }
-
-  public java.util.List getIncludes() {
-    return _jspx_includes;
-  }
-
-  public void _jspDestroy() {
-    _jspx_tagPool_c_out_value.release();
-  }
-
-  public void _jspService(HttpServletRequest request, HttpServletResponse response)
-        throws java.io.IOException, ServletException {
-
-    JspFactory _jspxFactory = null;
-    javax.servlet.jsp.PageContext pageContext = null;
-    HttpSession session = null;
-    ServletContext application = null;
-    ServletConfig config = null;
-    JspWriter out = null;
-    Object page = this;
-    JspWriter _jspx_out = null;
-
-
-    try {
-      _jspxFactory = JspFactory.getDefaultFactory();
-      response.setContentType("text/html;charset=ISO-8859-1");
-      pageContext = _jspxFactory.getPageContext(this, request, response,
-      			null, true, 8192, true);
-      application = pageContext.getServletContext();
-      config = pageContext.getServletConfig();
-      session = pageContext.getSession();
-      out = pageContext.getOut();
-      _jspx_out = out;
-
-      out.write("\r\n");
-      out.write("\r\n");
-      out.write("<html>\r\n  ");
-      out.write("<head>\r\n    ");
-      out.write("<title>JSP is Easy");
-      out.write("</title>\r\n  ");
-      out.write("</head>\r\n  ");
-      out.write("<body bgcolor=\"white\">\r\n\r\n    ");
-      out.write("<h1>JSP is as easy as ...");
-      out.write("</h1>\r\n\r\n    ");
-      out.write("\r\n    1 + 2 + 3 = ");
-      if (_jspx_meth_c_out_0(pageContext))
-        return;
-      out.write("\r\n\r\n  ");
-      out.write("</body>\r\n");
-      out.write("</html>\r\n");
-    } catch (Throwable t) {
-      out = _jspx_out;
-      if (out != null && out.getBufferSize() != 0)
-        out.clearBuffer();
-      if (pageContext != null) pageContext.handlePageException(t);
-    } finally {
-      if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext);
-    }
-  }
-
-  private boolean _jspx_meth_c_out_0(javax.servlet.jsp.PageContext pageContext)
-          throws Throwable {
-    JspWriter out = pageContext.getOut();
-    /* ----  c:out ---- */
-    org.apache.taglibs.standard.tag.el.core.OutTag _jspx_th_c_out_0 = (org.apache.taglibs.standard.tag.el.core.OutTag) _jspx_tagPool_c_out_value.get(org.apache.taglibs.standard.tag.el.core.OutTag.class);
-    _jspx_th_c_out_0.setPageContext(pageContext);
-    _jspx_th_c_out_0.setParent(null);
-    _jspx_th_c_out_0.setValue("${1 + 2 + 3}");
-    int _jspx_eval_c_out_0 = _jspx_th_c_out_0.doStartTag();
-    if (_jspx_th_c_out_0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
-      return true;
-    _jspx_tagPool_c_out_value.reuse(_jspx_th_c_out_0);
-    return false;
-  }
-}
diff --git a/org.eclipse.jdt.ui.examples.javafamily/stuff/exampleJspProject.zip b/org.eclipse.jdt.ui.examples.javafamily/stuff/exampleJspProject.zip
deleted file mode 100644
index fc299767..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/stuff/exampleJspProject.zip
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.javafamily/stuff/index-format11 b/org.eclipse.jdt.ui.examples.javafamily/stuff/index-format11
deleted file mode 100644
index 1303041..0000000
--- a/org.eclipse.jdt.ui.examples.javafamily/stuff/index-format11
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.projects/.classpath b/org.eclipse.jdt.ui.examples.projects/.classpath
deleted file mode 100644
index 6c25ac1..0000000
--- a/org.eclipse.jdt.ui.examples.projects/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="examples"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.ui.examples.projects/.cvsignore b/org.eclipse.jdt.ui.examples.projects/.cvsignore
deleted file mode 100644
index fe99505..0000000
--- a/org.eclipse.jdt.ui.examples.projects/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-
diff --git a/org.eclipse.jdt.ui.examples.projects/.project b/org.eclipse.jdt.ui.examples.projects/.project
deleted file mode 100644
index c1ce1fb..0000000
--- a/org.eclipse.jdt.ui.examples.projects/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt.ui.examples.projects</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.ide</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.jdt.ui.examples.projects/about.html b/org.eclipse.jdt.ui.examples.projects/about.html
deleted file mode 100644
index 6df85fe..0000000
--- a/org.eclipse.jdt.ui.examples.projects/about.html
+++ /dev/null
@@ -1,43 +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>Third Party Content</h3>
-
-<p>The Content includes items that have been sourced from third parties as follows:</p>
-
-<p><b>JUnit 3.7</b></p>
-<p>The plug-in is based on software developed by JUnit.org.  Your use of JUnit 3.7 in both source and binary code
-form contained in the plug-in is subject to the terms and conditions of the IBM Public License 1.0 which is available at
-<a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>.
-The source code is located in archive/junit/junit37src.jar.</p>
-
-<p>i) IBM effectively disclaims 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;</p>
-<p>ii) IBM effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;</p>
-<p>iii) IBM states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party.</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/org.eclipse.jdt.ui.examples.projects/archive/junit/junit37src.jar b/org.eclipse.jdt.ui.examples.projects/archive/junit/junit37src.jar
deleted file mode 100644
index 083466c..0000000
--- a/org.eclipse.jdt.ui.examples.projects/archive/junit/junit37src.jar
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.projects/build.properties b/org.eclipse.jdt.ui.examples.projects/build.properties
deleted file mode 100644
index ce36198..0000000
--- a/org.eclipse.jdt.ui.examples.projects/build.properties
+++ /dev/null
@@ -1,18 +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 = doc-html/,\
-               plugin.xml,\
-               about.html,\
-               icons/,\
-               plugin.properties,\
-               archive/,\
-               *.jar
-source.jdtexamples.jar = examples/
diff --git a/org.eclipse.jdt.ui.examples.projects/doc-html/hglegal.htm b/org.eclipse.jdt.ui.examples.projects/doc-html/hglegal.htm
deleted file mode 100644
index c598113..0000000
--- a/org.eclipse.jdt.ui.examples.projects/doc-html/hglegal.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Mozilla/4.73 [en] (Win98; U) [Netscape]">
-   <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright IBM Corp. 2000, 2001. All Rights Reserved.
-</body>
-</html>
diff --git a/org.eclipse.jdt.ui.examples.projects/doc-html/hglegal2003.htm b/org.eclipse.jdt.ui.examples.projects/doc-html/hglegal2003.htm
deleted file mode 100644
index f5871b7..0000000
--- a/org.eclipse.jdt.ui.examples.projects/doc-html/hglegal2003.htm
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-  <LINK REL="stylesheet" HREF="../../../book.css" CHARSET="ISO-8859-1" TYPE="text/css">
-  <title>Legal Notices</title>
-</head>
-<body>
-
-<h3>
-<a NAME="Notices"></a>Notices</h3>
-(c) Copyright (c) 2000, 2003 IBM Corporation and others. All Rights Reserved.
-</body>
-</html>
diff --git a/org.eclipse.jdt.ui.examples.projects/doc-html/jdt_projects_ex.html b/org.eclipse.jdt.ui.examples.projects/doc-html/jdt_projects_ex.html
deleted file mode 100644
index d569c9e..0000000
--- a/org.eclipse.jdt.ui.examples.projects/doc-html/jdt_projects_ex.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-   <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
-   <title>JDT - Java Example Projects</title>
-</head>
-<body>
-
-<h2>
-<b>Java Example Projects</b></h2>
-
-<h3>
-Introduction</h3>
-The Java examples provide you with sample code for exploring the Eclipse Java
-tools.
-
-<h3>
-Loading the Samples</h3>
-
-<ol>
-<li>
-Open the New wizard.</li>
-
-<li>
-Select Java in the Examples category.</li>
-
-<li>
-Select the project to be added to your workspace.</li>
-
-</ol>
-
-<p>The wizard creates a new Java project for you and imports the sample code
-into this project.</p>
-    <p><a href="hglegal2003.htm"><img src="ngibmcpy2003.gif" alt="Copyright (c) 2000, 2003 IBM Corporation and others. All Rights Reserved." border="0"></a></p>
-</body>
-</html>
diff --git a/org.eclipse.jdt.ui.examples.projects/doc-html/ngibmcpy.gif b/org.eclipse.jdt.ui.examples.projects/doc-html/ngibmcpy.gif
deleted file mode 100644
index 360f8e9..0000000
--- a/org.eclipse.jdt.ui.examples.projects/doc-html/ngibmcpy.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.projects/doc-html/ngibmcpy2003.gif b/org.eclipse.jdt.ui.examples.projects/doc-html/ngibmcpy2003.gif
deleted file mode 100644
index c786e43..0000000
--- a/org.eclipse.jdt.ui.examples.projects/doc-html/ngibmcpy2003.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationOperation.java b/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationOperation.java
deleted file mode 100644
index f78bcd9..0000000
--- a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationOperation.java
+++ /dev/null
@@ -1,184 +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.jdt.internal.ui.exampleprojects;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-import org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider;
-
-public class ExampleProjectCreationOperation implements IRunnableWithProgress {
-
-	private IResource fElementToOpen;
-	
-	private ExampleProjectCreationWizardPage[] fPages;
-	private IOverwriteQuery fOverwriteQuery;
-	
-	/**
-	 * Constructor for ExampleProjectCreationOperation
-	 */
-	public ExampleProjectCreationOperation(ExampleProjectCreationWizardPage[] pages, IOverwriteQuery overwriteQuery) {
-		fElementToOpen= null;
-		fPages= pages;
-		fOverwriteQuery= overwriteQuery;
-	}
-	
-	/*
-	 * @see IRunnableWithProgress#run(IProgressMonitor)
-	 */
-	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		if (monitor == null) {
-			monitor= new NullProgressMonitor();
-		}
-		try {
-			monitor.beginTask(ExampleProjectMessages.getString("ExampleProjectCreationOperation.op_desc"), fPages.length); //$NON-NLS-1$
-			IWorkspaceRoot root= ExampleProjectsPlugin.getWorkspace().getRoot();
-			
-			for (int i= 0; i < fPages.length; i++) {
-				createProject(root, fPages[i], new SubProgressMonitor(monitor, 1));
-			}
-		} finally {
-			monitor.done();
-		}
-	}		
-	
-	public IResource getElementToOpen() {
-		return fElementToOpen;
-	}
-	
-
-	private void createProject(IWorkspaceRoot root, ExampleProjectCreationWizardPage page, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		IConfigurationElement desc= page.getConfigurationElement();
-		
-		IConfigurationElement[] imports= desc.getChildren("import"); //$NON-NLS-1$
-		IConfigurationElement[] natures= desc.getChildren("nature"); //$NON-NLS-1$
-		IConfigurationElement[] references= desc.getChildren("references"); //$NON-NLS-1$
-		int nImports= (imports == null) ? 0 : imports.length;
-		int nNatures= (natures == null) ? 0 : natures.length;
-		int nReferences= (references == null) ? 0 : references.length;
-		
-		monitor.beginTask(ExampleProjectMessages.getString("ExampleProjectCreationOperation.op_desc_proj"), nImports + 1); //$NON-NLS-1$
-
-		String name= page.getName();
-		
-		String[] natureIds= new String[nNatures];
-		for (int i= 0; i < nNatures; i++) {
-			natureIds[i]= natures[i].getAttribute("id"); //$NON-NLS-1$
-		}
-		IProject[] referencedProjects= new IProject[nReferences];
-		for (int i= 0; i < nReferences; i++) {
-			referencedProjects[i]= root.getProject(references[i].getAttribute("id")); //$NON-NLS-1$
-		}		
-		
-		IProject proj= configNewProject(root, name, natureIds, referencedProjects, monitor);
-			
-		for (int i= 0; i < nImports; i++) {
-			doImports(proj, imports[i], new SubProgressMonitor(monitor, 1));
-		}
-		
-		String open= desc.getAttribute("open"); //$NON-NLS-1$
-		if (open != null && open.length() > 0) {
-			IResource fileToOpen= proj.findMember(new Path(open));
-			if (fileToOpen != null) {
-				fElementToOpen= fileToOpen;
-			}
-		}		
-		
-	}
-	
-	private IProject configNewProject(IWorkspaceRoot root, String name, String[] natureIds, IProject[] referencedProjects, IProgressMonitor monitor) throws InvocationTargetException {
-		try {
-			IProject project= root.getProject(name);
-			if (!project.exists()) {
-				project.create(null);
-			}
-			if (!project.isOpen()) {
-				project.open(null);
-			}
-			IProjectDescription desc= project.getDescription();
-			desc.setLocation(null);
-			desc.setNatureIds(natureIds);
-			desc.setReferencedProjects(referencedProjects);
-			
-			project.setDescription(desc, new SubProgressMonitor(monitor, 1));
-
-			return project;
-		} catch (CoreException e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-	
-	private void doImports(IProject project, IConfigurationElement curr, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-		try {
-			IPath destPath;
-			String name= curr.getAttribute("dest"); //$NON-NLS-1$
-			if (name == null || name.length() == 0) {
-				destPath= project.getFullPath();
-			} else {
-				IFolder folder= project.getFolder(name);
-				if (!folder.exists()) {
-					folder.create(true, true, null);
-				}
-				destPath= folder.getFullPath();
-			}
-			String importPath= curr.getAttribute("src"); //$NON-NLS-1$
-			if (importPath == null) {
-				importPath= ""; //$NON-NLS-1$
-				ExampleProjectsPlugin.log("projectsetup descriptor: import missing"); //$NON-NLS-1$
-				return;
-			}
-		
-			ZipFile zipFile= getZipFileFromPluginDir(importPath);
-			importFilesFromZip(zipFile, destPath, new SubProgressMonitor(monitor, 1));
-		} catch (CoreException e) {
-			throw new InvocationTargetException(e);
-		}
-	}
-	
-	private ZipFile getZipFileFromPluginDir(String pluginRelativePath) throws CoreException {
-		try {
-			URL starterURL= new URL(ExampleProjectsPlugin.getDefault().getDescriptor().getInstallURL(), pluginRelativePath);
-			return new ZipFile(Platform.asLocalURL(starterURL).getFile());
-		} catch (IOException e) {
-			String message= pluginRelativePath + ": " + e.getMessage(); //$NON-NLS-1$
-			Status status= new Status(IStatus.ERROR, ExampleProjectsPlugin.getPluginId(), IStatus.ERROR, message, e);
-			throw new CoreException(status);
-		}
-	}
-	
-	private void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {		
-		ZipFileStructureProvider structureProvider=	new ZipFileStructureProvider(srcZipFile);
-		ImportOperation op= new ImportOperation(destPath, structureProvider.getRoot(), structureProvider, fOverwriteQuery);
-		op.run(monitor);
-	}
-}
diff --git a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationWizard.java b/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationWizard.java
deleted file mode 100644
index 005fc2b..0000000
--- a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationWizard.java
+++ /dev/null
@@ -1,185 +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.jdt.internal.ui.exampleprojects;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IStatus;
-
-import org.eclipse.swt.widgets.Display;
-
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-public class ExampleProjectCreationWizard extends Wizard implements INewWizard, IExecutableExtension {
-
-	private ExampleProjectCreationWizardPage[] fPages;
-	private IConfigurationElement fConfigElement;
-
-	public ExampleProjectCreationWizard() {
-		super();
-		setDialogSettings(ExampleProjectsPlugin.getDefault().getDialogSettings());
-		setWindowTitle(ExampleProjectMessages.getString("ExampleProjectCreationWizard.title"));		 //$NON-NLS-1$
-		setNeedsProgressMonitor(true);
-	}
-	
-	private void initializeDefaultPageImageDescriptor() {
-		if (fConfigElement != null) {
-			String banner= fConfigElement.getAttribute("banner"); //$NON-NLS-1$
-			if (banner != null) {
-				ImageDescriptor desc= ExampleProjectsPlugin.getDefault().getImageDescriptor(banner);
-				setDefaultPageImageDescriptor(desc);
-			}
-		}
-	}
-
-	/*
-	 * @see Wizard#addPages
-	 */	
-	public void addPages() {
-		super.addPages();
-		
-		IConfigurationElement[] children = fConfigElement.getChildren("projectsetup"); //$NON-NLS-1$
-		if (children == null || children.length == 0) {
-			ExampleProjectsPlugin.log("descriptor must contain one ore more projectsetup tags"); //$NON-NLS-1$
-			return;
-		}
-		
-		fPages=  new ExampleProjectCreationWizardPage[children.length];
-		
-		for (int i= 0; i < children.length; i++) {
-			fPages[i]= new ExampleProjectCreationWizardPage(i, children[i]);
-			addPage(fPages[i]);
-		}
-	}
-	
-	/*
-	 * @see Wizard#performFinish
-	 */		
-	public boolean performFinish() {
-		ExampleProjectCreationOperation runnable= new ExampleProjectCreationOperation(fPages, new ImportOverwriteQuery());
-		
-		IRunnableWithProgress op= new WorkspaceModifyDelegatingOperation(runnable);
-		try {
-			getContainer().run(false, true, op);
-		} catch (InvocationTargetException e) {
-			handleException(e.getTargetException());
-			return false;
-		} catch  (InterruptedException e) {
-			return false;
-		}
-		BasicNewProjectResourceWizard.updatePerspective(fConfigElement);
-		IResource res= runnable.getElementToOpen();
-		if (res != null) {
-			openResource(res);
-		}
-		return true;
-	}
-	
-	private void handleException(Throwable target) {
-		String title= ExampleProjectMessages.getString("ExampleProjectCreationWizard.op_error.title"); //$NON-NLS-1$
-		String message= ExampleProjectMessages.getString("ExampleProjectCreationWizard.op_error.message"); //$NON-NLS-1$
-		if (target instanceof CoreException) {
-			IStatus status= ((CoreException)target).getStatus();
-			ErrorDialog.openError(getShell(), title, message, status);
-			ExampleProjectsPlugin.log(status);
-		} else {
-			MessageDialog.openError(getShell(), title, target.getMessage());
-			ExampleProjectsPlugin.log(target);
-		}
-	}
-	
-	private void openResource(final IResource resource) {
-		if (resource.getType() != IResource.FILE) {
-			return;
-		}
-		IWorkbenchWindow window= ExampleProjectsPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
-		if (window == null) {
-			return;
-		}
-		final IWorkbenchPage activePage= window.getActivePage();
-		if (activePage != null) {
-			final Display display= getShell().getDisplay();
-			display.asyncExec(new Runnable() {
-				public void run() {
-					try {
-						IDE.openEditor(activePage, (IFile)resource, true);
-					} catch (PartInitException e) {
-						ExampleProjectsPlugin.log(e);
-					}
-				}
-			});
-			BasicNewResourceWizard.selectAndReveal(resource, activePage.getWorkbenchWindow());
-		}
-	}	
-		
-	/**
-	 * Stores the configuration element for the wizard.  The config element will be used
-	 * in <code>performFinish</code> to set the result perspective.
-	 */
-	public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
-		fConfigElement= cfig;
-		
-		initializeDefaultPageImageDescriptor();
-	}
-	
-	// overwrite dialog
-	
-	private class ImportOverwriteQuery implements IOverwriteQuery {
-		public String queryOverwrite(String file) {
-			String[] returnCodes= { YES, NO, ALL, CANCEL};
-			int returnVal= openDialog(file);
-			return returnVal < 0 ? CANCEL : returnCodes[returnVal];
-		}	
-		
-		private int openDialog(final String file) {
-			final int[] result= { IDialogConstants.CANCEL_ID };
-			getShell().getDisplay().syncExec(new Runnable() {
-				public void run() {
-					String title= ExampleProjectMessages.getString("ExampleProjectCreationWizard.overwritequery.title"); //$NON-NLS-1$
-					String msg= ExampleProjectMessages.getFormattedString("ExampleProjectCreationWizard.overwritequery.message", file); //$NON-NLS-1$
-					String[] options= {IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.YES_TO_ALL_LABEL, IDialogConstants.CANCEL_LABEL};
-					MessageDialog dialog= new MessageDialog(getShell(), title, null, msg, MessageDialog.QUESTION, options, 0);
-					result[0]= dialog.open();
-				}
-			});
-			return result[0];
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-
-	}		
-}
diff --git a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationWizardPage.java b/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationWizardPage.java
deleted file mode 100644
index e5203d1..0000000
--- a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectCreationWizardPage.java
+++ /dev/null
@@ -1,172 +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.jdt.internal.ui.exampleprojects;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-import org.eclipse.jface.dialogs.DialogPage;
-import org.eclipse.jface.wizard.WizardPage;
-
-public class ExampleProjectCreationWizardPage extends WizardPage {
-
-	private IStatus fCurrStatus;
-	
-	private boolean fPageVisible;
-	
-	private IConfigurationElement fConfigurationElement;
-	
-	private String fNameLabel;
-	private String fProjectName;
-	
-	private Text fTextControl;
-	
-	public ExampleProjectCreationWizardPage(int pageNumber, IConfigurationElement elem) {
-		super("page" + pageNumber); //$NON-NLS-1$
-		fCurrStatus= createStatus(IStatus.OK, ""); //$NON-NLS-1$
-		
-		fConfigurationElement= elem;
-		
-		setTitle(getAttribute(elem, "pagetitle")); //$NON-NLS-1$
-		setDescription(getAttribute(elem, "pagedescription")); //$NON-NLS-1$
-		
-		fNameLabel= getAttribute(elem, "label"); //$NON-NLS-1$
-		fProjectName= getAttribute(elem, "name");		 //$NON-NLS-1$
-		
-	}
-	
-	private String getAttribute(IConfigurationElement elem, String tag) {
-		String res= elem.getAttribute(tag);
-		if (res == null) {
-			return '!' + tag + '!';
-		}
-		return res;
-	}
-	
-	/*
-	 * @see IDialogPage#createControl(Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite composite= new Composite(parent, SWT.NONE);
-		GridLayout gd= new GridLayout();
-		gd.numColumns= 2;
-		composite.setLayout(gd);
-		
-		Label label= new Label(composite, SWT.LEFT);
-		label.setText(fNameLabel);
-		label.setLayoutData(new GridData());
-		
-		fTextControl= new Text(composite, SWT.SINGLE | SWT.BORDER);
-		fTextControl.setText(fProjectName);
-		fTextControl.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (!fTextControl.isDisposed()) {
-					validateText(fTextControl.getText());
-				}
-			}
-		});
-		fTextControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		setControl(composite);
-	}
-
-	private void validateText(String text) {
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IStatus status= workspace.validateName(text, IResource.PROJECT);
-		if (status.isOK()) {
-			if (workspace.getRoot().getProject(text).exists()) {
-				status= createStatus(IStatus.ERROR, ExampleProjectMessages.getString("ExampleProjectCreationWizardPage.error.alreadyexists")); //$NON-NLS-1$
-			}
-		}	
-		updateStatus(status);
-		
-		fProjectName= text;
-	}	
-	
-	
-	/*
-	 * @see WizardPage#becomesVisible
-	 */
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-		fPageVisible= visible;
-		// policy: wizards are not allowed to come up with an error message
-		if (visible && fCurrStatus.matches(IStatus.ERROR)) {
-			// keep the error state, but remove the message
-			fCurrStatus= createStatus(IStatus.ERROR, ""); //$NON-NLS-1$
-		} 
-		updateStatus(fCurrStatus);
-	}	
-
-	/**
-	 * Updates the status line and the ok button depending on the status
-	 */
-	private void updateStatus(IStatus status) {
-		fCurrStatus= status;
-		setPageComplete(!status.matches(IStatus.ERROR));
-		if (fPageVisible) {
-			applyToStatusLine(this, status);
-		}
-	}
-
-	/**
-	 * Applies the status to a dialog page
-	 */
-	private static void applyToStatusLine(DialogPage page, IStatus status) {
-		String errorMessage= null;
-		String warningMessage= null;
-		String statusMessage= status.getMessage();
-		if (statusMessage.length() > 0) {
-			if (status.matches(IStatus.ERROR)) {
-				errorMessage= statusMessage;
-			} else if (!status.isOK()) {
-				warningMessage= statusMessage;
-			}
-		}
-		page.setErrorMessage(errorMessage);
-		page.setMessage(warningMessage);
-	}
-	
-	
-	private static IStatus createStatus(int severity, String message) {
-		return new Status(severity, ExampleProjectsPlugin.getPluginId(), severity, message, null);
-	}
-	
-	/**
-	 * Returns the name entered by the user
-	 */
-	public String getName() {
-		return fProjectName;
-	}
-
-	/**
-	 * Returns the configuration element of this page.
-	 * @return Returns a IConfigurationElement
-	 */
-	public IConfigurationElement getConfigurationElement() {
-		return fConfigurationElement;
-	}
-
-}
-
diff --git a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectMessages.java b/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectMessages.java
deleted file mode 100644
index 213e5df..0000000
--- a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectMessages.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.jdt.internal.ui.exampleprojects;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-public class ExampleProjectMessages {
-
-	private static final String RESOURCE_BUNDLE= ExampleProjectMessages.class.getName();
-	private static ResourceBundle fgResourceBundle= ResourceBundle.getBundle(RESOURCE_BUNDLE);
-
-	private ExampleProjectMessages() {
-	}
-
-	public static String getString(String key) {
-		try {
-			return fgResourceBundle.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-	
-	/**
-	 * Gets a string from the resource bundle and formats it with the argument
-	 * 
-	 * @param key	the string used to get the bundle value, must not be null
-	 */
-	public static String getFormattedString(String key, Object arg) {
-		return MessageFormat.format(getString(key), new Object[] { arg });
-	}
-
-
-	/**
-	 * Gets a string from the resource bundle and formats it with arguments
-	 */	
-	public static String getFormattedString(String key, Object[] args) {
-		return MessageFormat.format(getString(key), args);
-	}
-
-
-}
diff --git a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectMessages.properties b/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectMessages.properties
deleted file mode 100644
index cf8c062..0000000
--- a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectMessages.properties
+++ /dev/null
@@ -1,23 +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
-###############################################################################
-
-ExampleProjectCreationWizard.title=New
-ExampleProjectCreationWizard.op_error.title=Project Creation Failed
-ExampleProjectCreationWizard.op_error.message=Project could not be created.
-
-ExampleProjectCreationWizard.overwritequery.title=Overwrite
-ExampleProjectCreationWizard.overwritequery.message=Do you want to overwrite {0}?
-
-
-ExampleProjectCreationOperation.op_desc=Creating example projects...
-ExampleProjectCreationOperation.op_desc_proj=Configuring project...
-
-ExampleProjectCreationWizardPage.error.alreadyexists=Project already exists.
diff --git a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectsPlugin.java b/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectsPlugin.java
deleted file mode 100644
index c1d5471..0000000
--- a/org.eclipse.jdt.ui.examples.projects/examples/org/eclipse/jdt/internal/ui/exampleprojects/ExampleProjectsPlugin.java
+++ /dev/null
@@ -1,86 +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.jdt.internal.ui.exampleprojects;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class ExampleProjectsPlugin extends AbstractUIPlugin {
-
-	// The shared instance.
-	private static ExampleProjectsPlugin fgPlugin;
-	
-	/**
-	 * The constructor.
-	 */
-	public ExampleProjectsPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		fgPlugin= this;
-	}
-
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static ExampleProjectsPlugin getDefault() {
-		return fgPlugin;
-	}
-	
-	/**
-	 * Returns the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	public ImageDescriptor getImageDescriptor(String name) {
-		try {
-			URL url= new URL(getDescriptor().getInstallURL(), name);
-			return ImageDescriptor.createFromURL(url);
-		} catch (MalformedURLException e) {
-			return ImageDescriptor.getMissingImageDescriptor();
-		}
-	}	
-	
-	public static String getPluginId() {
-		return getDefault().getDescriptor().getUniqueIdentifier();
-	}	
-
-
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-
-
-	public static void log(String message) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, message, null));
-	}
-
-
-	public static void log(Throwable e) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, "Internal Error", e)); //$NON-NLS-1$
-	}
-
-
-}
diff --git a/org.eclipse.jdt.ui.examples.projects/icons/full/ctool16/newjprjex_wiz.gif b/org.eclipse.jdt.ui.examples.projects/icons/full/ctool16/newjprjex_wiz.gif
deleted file mode 100644
index 60b2806..0000000
--- a/org.eclipse.jdt.ui.examples.projects/icons/full/ctool16/newjprjex_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.projects/icons/full/dtool16/newjprjex_wiz.gif b/org.eclipse.jdt.ui.examples.projects/icons/full/dtool16/newjprjex_wiz.gif
deleted file mode 100644
index bb7be20..0000000
--- a/org.eclipse.jdt.ui.examples.projects/icons/full/dtool16/newjprjex_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.projects/icons/full/etool16/newjprjex_wiz.gif b/org.eclipse.jdt.ui.examples.projects/icons/full/etool16/newjprjex_wiz.gif
deleted file mode 100644
index 2b41e51..0000000
--- a/org.eclipse.jdt.ui.examples.projects/icons/full/etool16/newjprjex_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.projects/icons/full/wizban/newjprjex_wiz.gif b/org.eclipse.jdt.ui.examples.projects/icons/full/wizban/newjprjex_wiz.gif
deleted file mode 100644
index b5dab66..0000000
--- a/org.eclipse.jdt.ui.examples.projects/icons/full/wizban/newjprjex_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.examples.projects/plugin.properties b/org.eclipse.jdt.ui.examples.projects/plugin.properties
deleted file mode 100644
index f062fd9..0000000
--- a/org.eclipse.jdt.ui.examples.projects/plugin.properties
+++ /dev/null
@@ -1,24 +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
-###############################################################################
-
-# --- string from plugin.xml ----
-
-pluginName=Java Development Tools Example Projects
-providerName=Eclipse.org
-
-JUnitProjectExampleCreationWizard.title=Example Project - JUnit
-JUnitProjectExampleCreationWizard.description=Create a new JUnit project
-
-JUnitProjectExampleCreationWizard.pagetitle=JUnit
-JUnitProjectExampleCreationWizard.pagedescription=Create a Java project containing the JUnit source
-JUnitProjectExampleCreationWizard.label=&Project Name:
-
-JUnitProjectExampleCreationWizard.categoryName=Java
diff --git a/org.eclipse.jdt.ui.examples.projects/plugin.xml b/org.eclipse.jdt.ui.examples.projects/plugin.xml
deleted file mode 100644
index 9d5f784..0000000
--- a/org.eclipse.jdt.ui.examples.projects/plugin.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jdt.ui.examples.projects"
-   name="%pluginName"
-   version="3.0.0"
-   provider-name="%providerName"
-   class="org.eclipse.jdt.internal.ui.exampleprojects.ExampleProjectsPlugin">
-
-   <runtime>
-      <library name="jdtexamples.jar"/>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime.compatibility" optional="true"/>
-      
-   </requires>
-
-
-   <extension
-         point="org.eclipse.ui.newWizards">
-      <category
-            name="%JUnitProjectExampleCreationWizard.categoryName"
-            parentCategory="org.eclipse.ui.Examples"
-            id="org.eclipse.jdt.ui.java">
-      </category>
-      <wizard
-            banner="icons/full/wizban/newjprjex_wiz.gif"
-            name="%JUnitProjectExampleCreationWizard.title"
-            icon="icons/full/ctool16/newjprjex_wiz.gif"
-            category="org.eclipse.ui.Examples/org.eclipse.jdt.ui.java"
-            class="org.eclipse.jdt.internal.ui.exampleprojects.ExampleProjectCreationWizard"
-            project="true"
-            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-            id="org.eclipse.jdt.examples.projects.JUnitProjectExampleCreationWizard">
-         <description>
-            %JUnitProjectExampleCreationWizard.description
-         </description>
-         <projectsetup
-               pagetitle="%JUnitProjectExampleCreationWizard.pagetitle"
-               name="JUnit"
-               label="%JUnitProjectExampleCreationWizard.label"
-               pagedescription="%JUnitProjectExampleCreationWizard.pagedescription">
-            <nature
-                  id="org.eclipse.jdt.core.javanature">
-            </nature>
-            <import
-                  dest=""
-                  src="archive/junit/junit37src.jar">
-            </import>
-         </projectsetup>
-      </wizard>
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.jdt.ui.examples.projects/scripts/exportplugin.xml b/org.eclipse.jdt.ui.examples.projects/scripts/exportplugin.xml
deleted file mode 100644
index 8bc2434..0000000
--- a/org.eclipse.jdt.ui.examples.projects/scripts/exportplugin.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<project name="org.eclipse.search" default="export" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.jdt.ui.examples.projects" />
-		<property name="version"  value="_3.0.0" />
-		<property name="dest"  value="${destdir}/${plugin}${version}" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		<jar 
-			jarfile="${dest}/jdtexamples.jar"
-			basedir="bin"
-		/>
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<copy todir="${dest}/icons">
-			<fileset dir="icons" />
-		</copy>
-			<copy todir="${dest}/archive">
-			<fileset dir="archive" />
-		</copy>
-			<copy todir="${dest}/doc-html">
-			<fileset dir="doc-html" />
-		</copy>
-		<zip zipfile="${dest}/jdtexamplessrc.zip">
-		    <fileset dir="examples" />
-  		</zip>				
-	</target>
-</project>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/.classpath b/org.eclipse.jdt.ui.tests.refactoring/.classpath
deleted file mode 100644
index 447dc7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="test cases"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/.project b/org.eclipse.jdt.ui.tests.refactoring/.project
deleted file mode 100644
index 185eda7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/.project
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt.ui.tests.refactoring</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.jdt.core</project>
-		<project>org.eclipse.jdt.ui</project>
-		<project>org.eclipse.jdt.ui.tests</project>
-		<project>org.eclipse.jface.text</project>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.ide</project>
-		<project>org.eclipse.ui.workbench.texteditor</project>
-		<project>org.junit</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/about.html b/org.eclipse.jdt.ui.tests.refactoring/about.html
deleted file mode 100644
index 9db411a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/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/org.eclipse.jdt.ui.tests.refactoring/build.properties b/org.eclipse.jdt.ui.tests.refactoring/build.properties
deleted file mode 100644
index a21ae2c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/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.xml,\
-               test.xml,\
-               about.html,\
-               resources/,\
-               *.jar
-source.refactoringtests.jar = test cases/
diff --git a/org.eclipse.jdt.ui.tests.refactoring/plugin.properties b/org.eclipse.jdt.ui.tests.refactoring/plugin.properties
deleted file mode 100644
index e8cb7ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/plugin.properties
+++ /dev/null
@@ -1,13 +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
-###############################################################################
-
-Plugin.name= Refactoring Tests Pluging
-Plugin.providerName= Eclipse.org
diff --git a/org.eclipse.jdt.ui.tests.refactoring/plugin.xml b/org.eclipse.jdt.ui.tests.refactoring/plugin.xml
deleted file mode 100644
index 857d0e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/plugin.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jdt.ui.tests.refactoring"
-   name="%Plugin.name"
-   version="3.0.0"
-   provider-name="%Plugin.providerName"
-   class="org.eclipse.jdt.ui.tests.refactoring.infra.RefactoringTestPlugin">
-
-   <runtime>
-      <library name="refactoringtests.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jdt.ui"/>
-      <import plugin="org.eclipse.jdt.ui.tests"/>
-      <import plugin="org.eclipse.core.runtime.compatibility" optional="true"/>
-   </requires>
-
-
-   <extension
-         point="org.eclipse.jdt.ui.typeExtenders">
-      <typeExtender
-            methods="simple, overridden, ordering, chainOrdering"
-            type="org.eclipse.jdt.ui.tests.xml.A"
-            class="org.eclipse.jdt.ui.tests.xml.A_TypeExtender"
-            id="org.eclipse.jdt.ui.tests.A_TypeExtender">
-      </typeExtender>
-      <typeExtender
-            methods="chaining, chainOrdering"
-            type="org.eclipse.jdt.ui.tests.xml.A"
-            class="org.eclipse.jdt.ui.tests.xml.A_TypeExtender2"
-            id="org.eclipse.jdt.ui.tests.A_TypeExtender2">
-      </typeExtender>
-      <typeExtender
-            methods="overridden"
-            type="org.eclipse.jdt.ui.tests.xml.B"
-            class="org.eclipse.jdt.ui.tests.xml.B_TypeExtender"
-            id="org.eclipse.jdt.ui.tests.B_TypeExtender">
-      </typeExtender>
-      <typeExtender
-            methods="ordering"
-            type="org.eclipse.jdt.ui.tests.xml.I"
-            class="org.eclipse.jdt.ui.tests.xml.I_TypeExtender"
-            id="org.eclipse.jdt.ui.tests.I_TypeExtender">
-      </typeExtender>
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test0_in.java
deleted file mode 100644
index 0a37955..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test0_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	private int f;
-	void m(){
-		int g= f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test0_out.java
deleted file mode 100644
index 2c46008..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test0_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	private int f;
-	void m(){
-		int g= getF();
-	}
-	private int getF(){
-		return f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test1_in.java
deleted file mode 100644
index b00dd07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test1_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	private int f;
-	void m(){
-		f= 3;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test1_out.java
deleted file mode 100644
index f166768..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test1_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	private int f;
-	void m(){
-		setF(3);
-	}
-	private void setF(int f){
-		this.f= f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test2_in.java
deleted file mode 100644
index a0f3096..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test2_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//abstract and make private
-package p;
-class A{
-	public int f;
-	void m(){
-		int g= f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test2_out.java
deleted file mode 100644
index 3ec4bc3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test2_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//abstract and make private
-package p;
-class A{
-	private int f;
-	void m(){
-		int g= f;
-	}
-	public int getF(){
-		return f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test3_in.java
deleted file mode 100644
index 08a9cad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test3_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//abstract and make private
-package p;
-class A{
-	public int f;
-	void m(){
-		int g= f;
-	}
-}
-class B{
-	int m(){
-		A a= new A();
-		return a.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test3_out.java
deleted file mode 100644
index ce9a78a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test3_out.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//abstract and make private
-package p;
-class A{
-	private int f;
-	void m(){
-		int g= getF();
-	}
-	public int getF(){
-		return f;
-	}
-}
-class B{
-	int m(){
-		A a= new A();
-		return a.getF();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test4_in.java
deleted file mode 100644
index af410b1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test4_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//abstract and make private (do not abstract private accesses)
-package p;
-class A{
-	public int f;
-	void m(){
-		int g= f;
-	}
-}
-class B{
-	int m(){
-		A a= new A();
-		return a.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test4_out.java
deleted file mode 100644
index 8ccdfa3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test4_out.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//abstract and make private (do not abstract private accesses)
-package p;
-class A{
-	private int f;
-	void m(){
-		int g= f;
-	}
-	public int getF(){
-		return f;
-	}
-}
-class B{
-	int m(){
-		A a= new A();
-		return a.getF();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test5_in.java
deleted file mode 100644
index 603871f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test5_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//abstract and make private
-package p;
-class A{
-	public int f;
-	void m(){
-		f= f;
-	}
-}
-class B{
-	int m(){
-		A a= new A();
-		a.f= a.f;
-		return a.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test5_out.java
deleted file mode 100644
index 65c7709..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/can/A_test5_out.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//abstract and make private
-package p;
-class A{
-	private int f;
-	void m(){
-		setF(getF());
-	}
-	public int getF(){
-		return f;
-	}
-	public void setF(int f){
-		this.f= f;
-	}
-}
-class B{
-	int m(){
-		A a= new A();
-		a.setF(a.getF());
-		return a.getF();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/cannot/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/cannot/A_testFail0.java
deleted file mode 100644
index 308c8bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/AbstractField/cannot/A_testFail0.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//abstract and make private, only getter
-package p;
-class A{
-	public int f;
-	void m(){
-		f= f;
-	}
-}
-class B{
-	int m(){
-		A a= new A();
-		a.f= a.f;
-		return a.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test0_in.java
deleted file mode 100644
index 95a0fe5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test0_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private void m(int i, int j){
-	}
-	private void foo(){
-		m(1, 2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test0_out.java
deleted file mode 100644
index 6b86b75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test0_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private void m(int j, int i){
-	}
-	private void foo(){
-		m(2, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test10_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test10_in.java
deleted file mode 100644
index 996a053..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test10_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to j k i
-package p;
-class A{
-	private void m(int i, int j, int k){
-	}
-	private void foo(){
-		m(1, 2, 3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test10_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test10_out.java
deleted file mode 100644
index d050502..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test10_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to j k i
-package p;
-class A{
-	private void m(int j, int k, int i){
-	}
-	private void foo(){
-		m(2, 3, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test11_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test11_in.java
deleted file mode 100644
index 361a676..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test11_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//change to j k i
-package p;
-class A{
-	private void m(int i, int j, int k){
-	}
-	private void foo(){
-		m(3+ 1, 
-			2, 
-				3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test11_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test11_out.java
deleted file mode 100644
index 6abf7f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test11_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//change to j k i
-package p;
-class A{
-	private void m(int j, int k, int i){
-	}
-	private void foo(){
-		m(2, 
-			3, 
-				3+ 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test12_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test12_in.java
deleted file mode 100644
index f1d6726..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test12_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//change to j k i
-package p;
-class A{
-	private void m(int i, int j, int k){
-	}
-	private void foo(){
-		m(19, 
-			/*comment*/2000, 
-				3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test12_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test12_out.java
deleted file mode 100644
index 2cc1236..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test12_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//change to j k i
-package p;
-class A{
-	private void m(int j, int k, int i){
-	}
-	private void foo(){
-		m(/*comment*/2000, 
-			3, 
-				19);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test13_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test13_in.java
deleted file mode 100644
index 963f2ea..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test13_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//change to j k i
-package p;
-class A{
-	private void m(int i, int j, int k){
-	}
-	private void foo(){
-		m(19, 
-			/*comment*/2000, 
-				3/*comment2*/);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test13_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test13_out.java
deleted file mode 100644
index 3a83012..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test13_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//change to j k i
-package p;
-class A{
-	private void m(int j, int k, int i){
-	}
-	private void foo(){
-		m(/*comment*/2000, 
-			3/*comment2*/, 
-				19);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test14_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test14_in.java
deleted file mode 100644
index b3beea3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test14_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private int m(int i, int j){
-		return m(m(1, 2), 3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test14_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test14_out.java
deleted file mode 100644
index 1d856cc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test14_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private int m(int j, int i){
-		return m(3, m(2, 1));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test15_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test15_in.java
deleted file mode 100644
index 6c68ffb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test15_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private void m(int i, boolean b){
-	}
-	private void foo(){
-		m(2, true);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test15_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test15_out.java
deleted file mode 100644
index a1aee28..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test15_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private void m(boolean b, int i){
-	}
-	private void foo(){
-		m(true, 2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test16_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test16_in.java
deleted file mode 100644
index bd03d2f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test16_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-class A{
-	protected void m(int i, boolean b){
-	}
-	private void foo(){
-		m(2, true);
-	}
-}
-class B extends A{
-	protected void m(int j, boolean b){
-		m(6, false);
-		super.m(4, true);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test16_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test16_out.java
deleted file mode 100644
index ca0a136..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test16_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-class A{
-	protected void m(boolean b, int i){
-	}
-	private void foo(){
-		m(true, 2);
-	}
-}
-class B extends A{
-	protected void m(boolean b, int j){
-		m(false, 6);
-		super.m(true, 4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test17_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test17_in.java
deleted file mode 100644
index 8515e6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test17_in.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-class A1 implements A{
-	public void m(int i, boolean b){
-	}
-	private void foo(){
-		m(2, true);
-	}
-}
-class B extends A1{
-	public void m(int j, boolean b){
-		m(6, false);
-		super.m(4, true);
-	}
-}
-interface A {
-	public void m(int i, boolean b);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test17_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test17_out.java
deleted file mode 100644
index f86e232..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test17_out.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-class A1 implements A{
-	public void m(boolean b, int i){
-	}
-	private void foo(){
-		m(true, 2);
-	}
-}
-class B extends A1{
-	public void m(boolean b, int j){
-		m(false, 6);
-		super.m(true, 4);
-	}
-}
-interface A {
-	public void m(boolean b, int i);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test18_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test18_in.java
deleted file mode 100644
index 38c7930..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test18_in.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-
-class A1 implements A{
-	public void m(int i, boolean b){
-	}
-	private void foo(){
-		m(2, true);
-	}
-}
-class B extends A1 implements AA{
-	public void m(int j, boolean b){
-		m(6, false);
-		super.m(4, true);
-	}
-}
-interface A {
-	public void m(int i, boolean b);
-}
-interface AA {
-	public void m(int xxx, boolean yyy);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test18_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test18_out.java
deleted file mode 100644
index 5118484..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test18_out.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-
-class A1 implements A{
-	public void m(boolean b, int i){
-	}
-	private void foo(){
-		m(true, 2);
-	}
-}
-class B extends A1 implements AA{
-	public void m(boolean b, int j){
-		m(false, 6);
-		super.m(true, 4);
-	}
-}
-interface A {
-	public void m(boolean b, int i);
-}
-interface AA {
-	public void m(boolean yyy, int xxx);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test19_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test19_in.java
deleted file mode 100644
index 204f3ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test19_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A {
-	public void m(int i, final boolean b){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test19_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test19_out.java
deleted file mode 100644
index 1db9fb4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test19_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A {
-	public void m(final boolean b, int i){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test1_in.java
deleted file mode 100644
index 014a77c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test1_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	private void m(int i, int j){
-	}
-	private void foo(){
-		m(1,
-		2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test1_out.java
deleted file mode 100644
index a94f00c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test1_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	private void m(int j, int i){
-	}
-	private void foo(){
-		m(2,
-		1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test20_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test20_in.java
deleted file mode 100644
index 73a860d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test20_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A {
-	void m(int a, int b[]){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test20_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test20_out.java
deleted file mode 100644
index 7966618..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test20_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A {
-	void m(int b[], int a){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test21_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test21_in.java
deleted file mode 100644
index 57f3cf7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test21_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A {
-	A(int a, int b){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test21_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test21_out.java
deleted file mode 100644
index 8e163ed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test21_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A {
-	A(int b, int a){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test22_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test22_in.java
deleted file mode 100644
index 5973c82..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test22_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	A(int a, int b){}
-	A(){
-		this(3, 2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test22_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test22_out.java
deleted file mode 100644
index 27b8cd4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test22_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	A(int b, int a){}
-	A(){
-		this(2, 3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test23_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test23_in.java
deleted file mode 100644
index 9f19fe6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test23_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	A(int a, int b){}
-}
-class B extends A{
-	B(){
-		super(4, 6);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test23_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test23_out.java
deleted file mode 100644
index 0238f01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test23_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	A(int b, int a){}
-}
-class B extends A{
-	B(){
-		super(6, 4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test24_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test24_in.java
deleted file mode 100644
index 60bcb15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test24_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	A(int a, int b){}
-	
-	void f(){
-		new A(1, 4){
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test24_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test24_out.java
deleted file mode 100644
index c1f8b6e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test24_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	A(int b, int a){}
-	
-	void f(){
-		new A(4, 1){
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test25_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test25_in.java
deleted file mode 100644
index b55e8ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test25_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class Outer{
-	class A {
-		A(int a, int b){}
-	}
-}	
-class Outer2 extends Outer.A{
-	Outer2(){
-		new Outer().super(4, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test25_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test25_out.java
deleted file mode 100644
index f0db900..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test25_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class Outer{
-	class A {
-		A(int b, int a){}
-	}
-}	
-class Outer2 extends Outer.A{
-	Outer2(){
-		new Outer().super(1, 4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test26_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test26_in.java
deleted file mode 100644
index a3467df..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test26_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	A(int a, int b){}
-	
-	void f(){
-		new A(1, 4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test26_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test26_out.java
deleted file mode 100644
index 14b9c22..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test26_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	A(int b, int a){}
-	
-	void f(){
-		new A(4, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test2_in.java
deleted file mode 100644
index fe19e39..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test2_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private void m(int i, int j){
-		m(i, j);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test2_out.java
deleted file mode 100644
index 083b2b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test2_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private void m(int j, int i){
-		m(j, i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test3_in.java
deleted file mode 100644
index 4d7f0c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test3_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private void m(
-	 int i,
-	 int j){
-		m(i, j);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test3_out.java
deleted file mode 100644
index 9822034..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test3_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private void m(
-	 int j,
-	 int i){
-		m(j, i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test4_in.java
deleted file mode 100644
index 50b1283..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test4_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private int m(
-	 int i,
-	 int j){
-		return m(m(i, j), 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test4_out.java
deleted file mode 100644
index e37883a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test4_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private int m(
-	 int j,
-	 int i){
-		return m(1, m(j, i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test5_in.java
deleted file mode 100644
index 891cabe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test5_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private void m(
-	 int i,
-	 int j){
-		m(i, 1 + 2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test5_out.java
deleted file mode 100644
index 5d1b0bc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test5_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private void m(
-	 int j,
-	 int i){
-		m(1 + 2, i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test6_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test6_in.java
deleted file mode 100644
index 02bf8cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test6_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to k i j
-package p;
-class A{
-	private void m(int i, int j, int k){
-	}
-	private void foo(){
-		m(1, 2, 3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test6_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test6_out.java
deleted file mode 100644
index 14f2b69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test6_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to k i j
-package p;
-class A{
-	private void m(int k, int i, int j){
-	}
-	private void foo(){
-		m(3, 1, 2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test7_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test7_in.java
deleted file mode 100644
index 35017b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test7_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to i k j 
-package p;
-class A{
-	private void m(int i, int j, int k){
-	}
-	private void foo(){
-		m(1, 2, 3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test7_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test7_out.java
deleted file mode 100644
index 76e96b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test7_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to i k j 
-package p;
-class A{
-	private void m(int i, int k, int j){
-	}
-	private void foo(){
-		m(1, 3, 2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test8_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test8_in.java
deleted file mode 100644
index 4038ea3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test8_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to k j i 
-package p;
-class A{
-	private void m(int i, int j, int k){
-	}
-	private void foo(){
-		m(1, 2, 3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test8_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test8_out.java
deleted file mode 100644
index 2bf338b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test8_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to k j i 
-package p;
-class A{
-	private void m(int k, int j, int i){
-	}
-	private void foo(){
-		m(3, 2, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test9_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test9_in.java
deleted file mode 100644
index 2234f30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test9_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to j i k
-package p;
-class A{
-	private void m(int i, int j, int k){
-	}
-	private void foo(){
-		m(1, 2, 3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test9_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test9_out.java
deleted file mode 100644
index 20fac3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_test9_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change to j i k
-package p;
-class A{
-	private void m(int j, int i, int k){
-	}
-	private void foo(){
-		m(2, 1, 3);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd28_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd28_in.java
deleted file mode 100644
index dbda6a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd28_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private void m(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd28_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd28_out.java
deleted file mode 100644
index 888d1b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd28_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private void m(int i, int x){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd29_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd29_in.java
deleted file mode 100644
index dbda6a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd29_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private void m(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd29_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd29_out.java
deleted file mode 100644
index ed5f756..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd29_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private void m(int x, int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd30_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd30_in.java
deleted file mode 100644
index ab989d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd30_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private void m(int i){
-		m(i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd30_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd30_out.java
deleted file mode 100644
index da6fa61..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd30_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private void m(int i, int x){
-		m(i, x);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd31_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd31_in.java
deleted file mode 100644
index 203fe15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd31_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		m(i);
-	}
-}
-class B extends A{
-	void m(int j){
-		super.m(j);
-		this.m(j);
-		m(j);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd31_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd31_out.java
deleted file mode 100644
index 5a50e62..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd31_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	void m(int i, int x){
-		m(i, x);
-	}
-}
-class B extends A{
-	void m(int j, int x){
-		super.m(j, x);
-		this.m(j, x);
-		m(j, x);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd32_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd32_in.java
deleted file mode 100644
index ab989d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd32_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private void m(int i){
-		m(i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd32_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd32_out.java
deleted file mode 100644
index 412db60..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd32_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private void m(int x, int i){
-		m(x, i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd33_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd33_in.java
deleted file mode 100644
index ca119d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd33_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private void m(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd33_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd33_out.java
deleted file mode 100644
index ba5e604..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAdd33_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private void m(int x){
-		m(x);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddRecursive1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddRecursive1_in.java
deleted file mode 100644
index c80f69d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddRecursive1_in.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package p;
-
-class A {
-	int i;
-	void m(int i) {this.i = i;}
-}
-class Super extends A {
-	void m(int i) { super.m(1); }
-}
-class Recursive extends A {
-	void m(int i) { if (true) m(i); }
-}
-class ThisRecursive extends A {
-	void m(int i) { this.m(i); }
-}
-class AlmostRecursive extends A {
-	void m(int i) { new A().m(i); }
-}
-class RecursiveOrNot extends A {
-	void m(int i) { new RecursiveOrNot().m(i); }
-}
-class NonRecursive extends A {
-	void m(int i) { int k= i; }
-}
-class Calling extends A {
-	void bar() { m(17); }
-}
-class Calling2 {
-	void bar() { new A().m(17); }
-}
-class Calling3 {
-	void bar() { new Recursive().m(17); }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddRecursive1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddRecursive1_out.java
deleted file mode 100644
index a8d3648..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddRecursive1_out.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package p;
-
-class A {
-	int i;
-	void m(int i, boolean bool) {this.i = i;}
-}
-class Super extends A {
-	void m(int i, boolean bool) { super.m(1, bool); }
-}
-class Recursive extends A {
-	void m(int i, boolean bool) { if (true) m(i, bool); }
-}
-class ThisRecursive extends A {
-	void m(int i, boolean bool) { this.m(i, bool); }
-}
-class AlmostRecursive extends A {
-	void m(int i, boolean bool) { new A().m(i, true); }
-}
-class RecursiveOrNot extends A {
-	void m(int i, boolean bool) { new RecursiveOrNot().m(i, bool); }
-}
-class NonRecursive extends A {
-	void m(int i, boolean bool) { int k= i; }
-}
-class Calling extends A {
-	void bar() { m(17, true); }
-}
-class Calling2 {
-	void bar() { new A().m(17, true); }
-}
-class Calling3 {
-	void bar() { new Recursive().m(17, true); }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddReorderRename34_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddReorderRename34_in.java
deleted file mode 100644
index dd3f8c2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddReorderRename34_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddReorderRename34_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddReorderRename34_out.java
deleted file mode 100644
index e85b749..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAddReorderRename34_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	private int m(boolean jj, Object x, int i){
-		return m(false, x, m(jj, x, i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll35_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll35_in.java
deleted file mode 100644
index 2a9c8b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll35_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//only visibility change - to public
-class A{
-	private int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll35_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll35_out.java
deleted file mode 100644
index cc2fa7b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll35_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//only visibility change - to public
-class A{
-	public int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll36_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll36_in.java
deleted file mode 100644
index 7ee41c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll36_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//only visibility change - to private
-class A{
-	public int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll36_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll36_out.java
deleted file mode 100644
index 2ef5a29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll36_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//only visibility change - to private
-class A{
-	private int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll37_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll37_in.java
deleted file mode 100644
index a847439..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll37_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//to protected
-class A{
-	public int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
-class B extends A{
-	public int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll37_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll37_out.java
deleted file mode 100644
index df49d85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll37_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//to protected
-class A{
-	protected int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
-class B extends A{
-	protected int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll38_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll38_in.java
deleted file mode 100644
index 1fb09e8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll38_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//to protected
-class A{
-	int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
-class B extends A{
-	public int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll38_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll38_out.java
deleted file mode 100644
index 00f60b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll38_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//to protected
-class A{
-	protected int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
-class B extends A{
-	public int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll39_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll39_in.java
deleted file mode 100644
index f4e0509..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll39_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//to public
-class A{
-	protected int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
-class B extends A{
-	protected int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll39_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll39_out.java
deleted file mode 100644
index 2f3c016..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll39_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//to public
-class A{
-	public int m(boolean jj, Object x, int i){
-		return m(false, x, m(jj, x, i));
-	}
-}
-class B extends A{
-	public int m(boolean jj, Object x, int i){
-		return m(false, x, m(jj, x, i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll40_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll40_in.java
deleted file mode 100644
index f4e0509..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll40_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//to public
-class A{
-	protected int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
-class B extends A{
-	protected int m(int iii, boolean j){
-		return m(m(iii, j), false);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll40_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll40_out.java
deleted file mode 100644
index 33960fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll40_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//to public
-class A{
-	public int m(boolean jj, int[] x, int i){
-		return m(false, x, m(jj, x, i));
-	}
-}
-class B extends A{
-	public int m(boolean jj, int[] x, int i){
-		return m(false, x, m(jj, x, i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll41_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll41_in.java
deleted file mode 100644
index 1b30b89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll41_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		m(0);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll41_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll41_out.java
deleted file mode 100644
index a3476d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll41_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll42_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll42_in.java
deleted file mode 100644
index 1b30b89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll42_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		m(0);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll42_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll42_out.java
deleted file mode 100644
index 6935d8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll42_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		m(i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll43_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll43_in.java
deleted file mode 100644
index 9e42322..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll43_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i, int j){
-		m(0, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll43_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll43_out.java
deleted file mode 100644
index 52fa429..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll43_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int j){
-		m(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll44_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll44_in.java
deleted file mode 100644
index 9e42322..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll44_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i, int j){
-		m(0, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll44_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll44_out.java
deleted file mode 100644
index cf2d976..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll44_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	boolean m(int j){
-		m(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll45_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll45_in.java
deleted file mode 100644
index 9e42322..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll45_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i, int j){
-		m(0, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll45_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll45_out.java
deleted file mode 100644
index 21828dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll45_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(boolean j){
-		m(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll46_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll46_in.java
deleted file mode 100644
index 8a28c5e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll46_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	A(){
-	}
-	void f(){
-		new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll46_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll46_out.java
deleted file mode 100644
index 00fbc25..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll46_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	A(int i){
-	}
-	void f(){
-		new A(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll47_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll47_in.java
deleted file mode 100644
index 9badbb3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll47_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	A(){
-	}
-	void f(){
-		new A(){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll47_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll47_out.java
deleted file mode 100644
index 3d941b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll47_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	A(int i){
-	}
-	void f(){
-		new A(1){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll48_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll48_in.java
deleted file mode 100644
index 51c75de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll48_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	A(){
-	}
-}
-class B extends A{
-	B(){
-		super();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll48_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll48_out.java
deleted file mode 100644
index a475abd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll48_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	A(int i){
-	}
-}
-class B extends A{
-	B(){
-		super(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll49_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll49_in.java
deleted file mode 100644
index cac6cfd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll49_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	A(){
-	}
-}
-class B extends A{
-	B(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll49_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll49_out.java
deleted file mode 100644
index a475abd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll49_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	A(int i){
-	}
-}
-class B extends A{
-	B(){
-		super(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll50_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll50_in.java
deleted file mode 100644
index be34b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll50_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	A(){
-	}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll50_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll50_out.java
deleted file mode 100644
index acbf6d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll50_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	A(int i){
-	}
-}
-class B extends A{
-
-	B() {
-		super(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll51_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll51_in.java
deleted file mode 100644
index 2d95523..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll51_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class F{
-	class A{
-		A(){
-		}
-	}
-}
-class X extends F.A{
-	X(){
-		new F().super();
-		new F().new A();
-		new F().new A(){};
-		new F(){}.new A(){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll51_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll51_out.java
deleted file mode 100644
index 8e1711c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll51_out.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class F{
-	class A{
-		A(int i){
-		}
-	}
-}
-class X extends F.A{
-	X(){
-		new F().super(1);
-		new F().new A(1);
-		new F().new A(1){};
-		new F(){}.new A(1){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll52_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll52_in.java
deleted file mode 100644
index c3d7a1e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll52_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	A(){
-	}
-}
-class B extends A{
-	B(){
-		this(3);
-	}
-	B(int y){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll52_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll52_out.java
deleted file mode 100644
index 0189181..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll52_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	A(int i){
-	}
-}
-class B extends A{
-	B(){
-		this(3);
-	}
-	B(int y){
-		super(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll53_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll53_in.java
deleted file mode 100644
index c449e33..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll53_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//change type of a to HashSet
-package p;
-
-class A {
-	void m(int a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll53_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll53_out.java
deleted file mode 100644
index 343f333..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll53_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change type of a to HashSet
-package p;
-
-import java.util.HashSet;
-
-class A {
-	void m(HashSet a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll54_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll54_in.java
deleted file mode 100644
index 6978f8f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll54_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change type of a to List
-package p;
-
-import java.util.List;
-
-class A {
-	void m(int a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll54_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll54_out.java
deleted file mode 100644
index a5d24a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll54_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//change type of a to List
-package p;
-
-import java.util.List;
-
-class A {
-	void m(List a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll55_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll55_in.java
deleted file mode 100644
index 9752d75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll55_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;//add boolean e before d
-
-class A {
-	public void m(Object[] b, int c, boolean d) {
-		m(new Object[] { }, Integer.MAX_VALUE, false);
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll55_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll55_out.java
deleted file mode 100644
index 2a387e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll55_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;//add boolean e before d
-
-class A {
-	public void m(Object[] b, int c, boolean e, boolean d) {
-		m(new Object[] { }, Integer.MAX_VALUE, e, false);
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll56_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll56_in.java
deleted file mode 100644
index 08690e5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll56_in.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p; //remove 'part'
-
-import java.util.Vector;
-
-class HistoryFrame extends Vector {
-
-	public HistoryFrame(EvaViewPart part, int title) {
-
-		super(title);
-
-	}
-}
-class EvaViewPart {
-
-	private void showJFreeChartFrame() {
-		HistoryFrame frame= new HistoryFrame(this, 5);
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll56_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll56_out.java
deleted file mode 100644
index b051dd7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll56_out.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p; //remove 'part'
-
-import java.util.Vector;
-
-class HistoryFrame extends Vector {
-
-	public HistoryFrame(int title) {
-
-		super(title);
-
-	}
-}
-class EvaViewPart {
-
-	private void showJFreeChartFrame() {
-		HistoryFrame frame= new HistoryFrame(5);
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll57_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll57_in.java
deleted file mode 100644
index 745c608..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll57_in.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package p; //swap hello and goodbye
-
-class TEST
-{
-   public interface X
-   {
-	  public void method(final int i, String hello, final String goodbye);
-   }
-   
-   private static X x = new X()
-	{
-	   public void method(final int i, String hello, final String goodbye)
-	   {
-		  System.err.println(hello + goodbye);
-	   }
-	};
-   
-   public static void main(String[] args)
-   {
-	  x.method(1, "hello", "goodbye");
-   }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll57_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll57_out.java
deleted file mode 100644
index c7202fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll57_out.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package p; //swap hello and goodbye
-
-class TEST
-{
-   public interface X
-   {
-	  public void method(final int i, final String goodbye, String hello);
-   }
-   
-   private static X x = new X()
-	{
-	   public void method(final int i, final String goodbye, String hello)
-	   {
-		  System.err.println(hello + goodbye);
-	   }
-	};
-   
-   public static void main(String[] args)
-   {
-	  x.method(1, "goodbye", "hello");
-   }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll58_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll58_in.java
deleted file mode 100644
index bc63244..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll58_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-abstract class A {
-	public abstract int m(int a, String[] b[][]);
-}
-class B extends A {
-	public int m(int number, String[] b[][]) {
-		return number + 0;
-	}
-}
-class C extends B {
-	public int m(int a, String[] strings[][]) {
-		return a + 17;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll58_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll58_out.java
deleted file mode 100644
index 3d5f588..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testAll58_out.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-abstract class A {
-	public abstract int m(String[] bbb[][], int abb);
-}
-class B extends A {
-	public int m(String[] bbb[][], int number) {
-		return number + 0;
-	}
-}
-class C extends B {
-	public int m(String[] strings[][], int abb) {
-		return abb + 17;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testException01_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testException01_in.java
deleted file mode 100644
index ff2e8c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testException01_in.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package p;
-
-import java.io.IOException;
-
-abstract class A {
-	public abstract int m(long l) throws IOException;
-}
-
-class B extends A {
-	public int m(long l) throws IOException {
-		return 17;
-	}
-	public int m(int i) {
-		return i;
-	}
-}
-
-class C extends B {
-}
-
-class D extends A {
-	public int m(long l) {
-		return 0;
-	}
-}	
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testException01_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testException01_out.java
deleted file mode 100644
index fb302a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testException01_out.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.zip.ZipException;
-
-abstract class A {
-	public abstract int m(long l) throws IOException, ZipException;
-}
-
-class B extends A {
-	public int m(long l) throws IOException, ZipException {
-		return 17;
-	}
-	public int m(int i) {
-		return i;
-	}
-}
-
-class C extends B {
-}
-
-class D extends A {
-	public int m(long l) throws ZipException {
-		return 0;
-	}
-}	
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic01_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic01_in.java
deleted file mode 100644
index 32c8495..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic01_in.java
+++ /dev/null
@@ -1,19 +0,0 @@
-class Example {
-	public static final Example A = new Example("A1", "A2");
-	public static final Example B = Example.getExample("B1", "B2");
-	
-	public static final Example C;    
-	public static final Example D;
-	static {
-		C = new Example("C1", "C2");
-		D = Example.getExample("D1", "D2");
-	}
-	
-	public Example(String arg1, String arg2) {
-
-	}
-	
-	public static Example getExample(String arg1, String arg2) {
-		return new Example(arg1, arg2);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic01_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic01_out.java
deleted file mode 100644
index 490af8b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic01_out.java
+++ /dev/null
@@ -1,19 +0,0 @@
-class Example {
-	public static final Example A = new Example("A2", "A1");
-	public static final Example B = Example.getExample("B1", "B2");
-	
-	public static final Example C;    
-	public static final Example D;
-	static {
-		C = new Example("C2", "C1");
-		D = Example.getExample("D1", "D2");
-	}
-	
-	public Example(String b, String a) {
-
-	}
-	
-	public static Example getExample(String arg1, String arg2) {
-		return new Example(arg2, arg1);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic02_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic02_in.java
deleted file mode 100644
index 32c8495..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic02_in.java
+++ /dev/null
@@ -1,19 +0,0 @@
-class Example {
-	public static final Example A = new Example("A1", "A2");
-	public static final Example B = Example.getExample("B1", "B2");
-	
-	public static final Example C;    
-	public static final Example D;
-	static {
-		C = new Example("C1", "C2");
-		D = Example.getExample("D1", "D2");
-	}
-	
-	public Example(String arg1, String arg2) {
-
-	}
-	
-	public static Example getExample(String arg1, String arg2) {
-		return new Example(arg1, arg2);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic02_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic02_out.java
deleted file mode 100644
index 7e5dc4d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testInStatic02_out.java
+++ /dev/null
@@ -1,19 +0,0 @@
-class Example {
-	public static final Example A = new Example("A1", "A2");
-	public static final Example B = Example.getExample("B2", "B1");
-	
-	public static final Example C;    
-	public static final Example D;
-	static {
-		C = new Example("C1", "C2");
-		D = Example.getExample("D2", "D1");
-	}
-	
-	public Example(String arg1, String arg2) {
-
-	}
-	
-	public static Example getExample(String b, String a) {
-		return new Example(a, b);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder26_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder26_in.java
deleted file mode 100644
index 592b8fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder26_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class A{
-	private void m(boolean y, int a){
-        m(y, a);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder26_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder26_out.java
deleted file mode 100644
index c3db1fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder26_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class A{
-	private void m(int bb, boolean zzz){
-        m(bb, zzz);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder27_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder27_in.java
deleted file mode 100644
index 592b8fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder27_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class A{
-	private void m(boolean y, int a){
-        m(y, a);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder27_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder27_out.java
deleted file mode 100644
index e6204fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/canModify/A_testRenameReorder27_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class A{
-	private void m(int a, boolean yyy){
-        m(a, yyy);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFail0.java
deleted file mode 100644
index 4d043c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFail0.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	private native int m(int i, int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFail1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFail1.java
deleted file mode 100644
index 4d043c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFail1.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	private native int m(int i, int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd2.java
deleted file mode 100644
index abf6cbf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd2.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//name clash in subclass
-class A{
-	int m(int i){
-	}
-}
-class B extends A{
-	int m(int x){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd3.java
deleted file mode 100644
index 0b79feb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd3.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int m(int i){
-	}
-}
-class B extends A{
-	int m(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd4.java
deleted file mode 100644
index 49def5e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailAdd4.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//name clash in subclass
-class A{
-	int m(int i){
-	}
-}
-class B extends A{
-	int m(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll5.java
deleted file mode 100644
index 359bd64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll5.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int m(int i){
-	}
-}
-class B extends A{
-	int m(int i){
-		int o= i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll6.java
deleted file mode 100644
index 74b0a1f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll6.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//cannot change type of i to Certificate (there are 2 Certificates)
-package p;
-class A{
-	int m(int i){
-		return 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll7.java
deleted file mode 100644
index 93ffb84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeSignature/cannotModify/A_testFailDoAll7.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//cannot change type of i to Fred - no such type exists
-package p;
-class A{
-	int m(int i){
-		return 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testArray_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testArray_in.java
deleted file mode 100644
index 7fc62aa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testArray_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.Vector;
-
-class A_testArray_in {
-	public static void main(String[] args) {
-		Vector[] vv = new Vector[10];
-		System.out.println("Hello, world!");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testArray_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testArray_out.java
deleted file mode 100644
index 7fc62aa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testArray_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.Vector;
-
-class A_testArray_in {
-	public static void main(String[] args) {
-		Vector[] vv = new Vector[10];
-		System.out.println("Hello, world!");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testBogusSelection_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testBogusSelection_in.java
deleted file mode 100644
index 3b8a967..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testBogusSelection_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.Hashtable;
-
-class A_testBogusSelection_in {
-	public static void main(String[] args) {
-		Hashtable h = new Hashtable();
-		System.out.println("Hello, world!");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testBogusSelection_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testBogusSelection_out.java
deleted file mode 100644
index 3b8a967..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testBogusSelection_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.Hashtable;
-
-class A_testBogusSelection_in {
-	public static void main(String[] args) {
-		Hashtable h = new Hashtable();
-		System.out.println("Hello, world!");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testFieldOfLocalType_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testFieldOfLocalType_in.java
deleted file mode 100644
index da01e6e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testFieldOfLocalType_in.java
+++ /dev/null
@@ -1,35 +0,0 @@
-public class A_testFieldOfLocalType_in {
-	
-	public void foobar() {
-		class Listener3 {
-			private A_testFieldOfLocalType_in fTest;
-			
-			private Listener3() {
-				fTest= new A_testFieldOfLocalType_in();
-			}
-			
-			public int bar() {
-				return foo();
-			}
-			
-			public int foo() {
-				return 1;
-			}
-			
-			private String getProperty() {
-				return null;
-			}
-		}
-		
-		this.addListener(new Listener3() {
-			public int bar() {
-				return 1;
-			}
-		});
-	}
-	
-	
-	public void addListener(Object o) {
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testFieldOfLocalType_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testFieldOfLocalType_out.java
deleted file mode 100644
index da01e6e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testFieldOfLocalType_out.java
+++ /dev/null
@@ -1,35 +0,0 @@
-public class A_testFieldOfLocalType_in {
-	
-	public void foobar() {
-		class Listener3 {
-			private A_testFieldOfLocalType_in fTest;
-			
-			private Listener3() {
-				fTest= new A_testFieldOfLocalType_in();
-			}
-			
-			public int bar() {
-				return foo();
-			}
-			
-			public int foo() {
-				return 1;
-			}
-			
-			private String getProperty() {
-				return null;
-			}
-		}
-		
-		this.addListener(new Listener3() {
-			public int bar() {
-				return 1;
-			}
-		});
-	}
-	
-	
-	public void addListener(Object o) {
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testInvalidSelection_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testInvalidSelection_in.java
deleted file mode 100644
index 38f4fe6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testInvalidSelection_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.Hashtable;
-
-class A_testInvalidSelection_in {
-	public static void main(String[] args) {
-		Hashtable h = new Hashtable();
-		System.out.println("Hello, world!");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testInvalidSelection_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testInvalidSelection_out.java
deleted file mode 100644
index 38f4fe6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testInvalidSelection_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.Hashtable;
-
-class A_testInvalidSelection_in {
-	public static void main(String[] args) {
-		Hashtable h = new Hashtable();
-		System.out.println("Hello, world!");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testMultiDeclaration_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testMultiDeclaration_in.java
deleted file mode 100644
index 0f08c6a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testMultiDeclaration_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*;
-
-class A_testMultiDeclaration_in {
-	public void foo(){
-		List l = list1; list2 =l;
-	}
-	
-	public ArrayList list1, list2;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testMultiDeclaration_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testMultiDeclaration_out.java
deleted file mode 100644
index 0f08c6a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testMultiDeclaration_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*;
-
-class A_testMultiDeclaration_in {
-	public void foo(){
-		List l = list1; list2 =l;
-	}
-	
-	public ArrayList list1, list2;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testOverriddenBinaryMethod_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testOverriddenBinaryMethod_in.java
deleted file mode 100644
index f85e820..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testOverriddenBinaryMethod_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-
-public class A_testOverriddenBinaryMethod_in {
-	public String toString(){
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testOverriddenBinaryMethod_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testOverriddenBinaryMethod_out.java
deleted file mode 100644
index f85e820..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testOverriddenBinaryMethod_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-
-public class A_testOverriddenBinaryMethod_in {
-	public String toString(){
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testPrimitive_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testPrimitive_in.java
deleted file mode 100644
index 86530f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testPrimitive_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.Vector;
-
-class A_testArray_in {
-	public static void main(String[] args) {
-		int i = 10;
-		System.out.println("Hello, world!");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testPrimitive_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testPrimitive_out.java
deleted file mode 100644
index 86530f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testPrimitive_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.Vector;
-
-class A_testArray_in {
-	public static void main(String[] args) {
-		int i = 10;
-		System.out.println("Hello, world!");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testUpdateNotPossible_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testUpdateNotPossible_in.java
deleted file mode 100644
index d24d1b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testUpdateNotPossible_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.Hashtable;
-
-class A_testUpdateNotPossible_in {
-	public void foo {
-		Hashtable h1 = new Hashtable();
-		Hashtable h2 = new Hashtable();
-		h1 = h2;
-		h2 = h1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testUpdateNotPossible_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testUpdateNotPossible_out.java
deleted file mode 100644
index d24d1b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/negative/A_testUpdateNotPossible_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.Hashtable;
-
-class A_testUpdateNotPossible_in {
-	public void foo {
-		Hashtable h1 = new Hashtable();
-		Hashtable h2 = new Hashtable();
-		h1 = h2;
-		h2 = h1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testArray_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testArray_in.java
deleted file mode 100644
index 45e456d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testArray_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testArray_in {
-	void foo(){
-		List[] ls = new ArrayList[10];
-		int n = ls.length;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDeclSubtypesOfList_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDeclSubtypesOfList_in.java
deleted file mode 100644
index df1089b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDeclSubtypesOfList_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*;
-
-class A_testFieldDeclSubtypesOfList_in {
-	public void foo(){
-		List list2 = list;
-	}
-	
-	public ArrayList list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDeclSubtypesOfList_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDeclSubtypesOfList_out.java
deleted file mode 100644
index c19dc17..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDeclSubtypesOfList_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*;
-
-class A_testFieldDeclSubtypesOfList_in {
-	public void foo(){
-		List list2 = list;
-	}
-	
-	public List list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDecl_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDecl_in.java
deleted file mode 100644
index d39640f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDecl_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-import java.util.*;
-
-class A_testFieldDecl_in {
-	void foo(){
-		list = new ArrayList();
-		List list2 = list;
-	}
-	
-	
-	public static ArrayList list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDecl_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDecl_out.java
deleted file mode 100644
index 7f2c18c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldDecl_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-import java.util.*;
-
-class A_testFieldDecl_in {
-	void foo(){
-		list = new ArrayList();
-		List list2 = list;
-	}
-	
-	
-	public static AbstractList list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldName_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldName_in.java
deleted file mode 100644
index 420f08d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldName_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-import java.util.ArrayList;
-import java.util.List;
-
-class A_testFieldName_in {
-	void foo(){
-		list = new ArrayList();
-		List list2 = list;
-	}
-	
-	public static ArrayList list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldName_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldName_out.java
deleted file mode 100644
index 0630d51..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldName_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.List;
-
-class A_testFieldName_in {
-	void foo(){
-		list = new ArrayList();
-		List list2 = list;
-	}
-	
-	public static AbstractList list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldType_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldType_in.java
deleted file mode 100644
index fbea643..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldType_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-import java.util.*;
-
-class A_testFieldType_in {
-	void foo(){
-		list = new ArrayList();
-		List list2 = list;
-	}
-	
-	
-	public static ArrayList list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldType_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldType_out.java
deleted file mode 100644
index ca474a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldType_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-import java.util.*;
-
-class A_testFieldType_in {
-	void foo(){
-		list = new ArrayList();
-		List list2 = list;
-	}
-	
-	
-	public static AbstractList list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldUseSubtypesOfList_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldUseSubtypesOfList_in.java
deleted file mode 100644
index 3edf03d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldUseSubtypesOfList_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*;
-
-class A_testFieldUseSubtypesOfList_in {
-	public void foo(){
-		List list2 = list;
-	}
-	
-	public ArrayList list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldUseSubtypesOfList_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldUseSubtypesOfList_out.java
deleted file mode 100644
index 0867282..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldUseSubtypesOfList_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*;
-
-class A_testFieldUseSubtypesOfList_in {
-	public void foo(){
-		List list2 = list;
-	}
-	
-	public List list;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess2.java
deleted file mode 100644
index d145005..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess2.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testFieldWithAccess2 {
-	void bar(){
-		A_testFieldWithAccess_in ww = new A_testFieldWithAccess_in();
-		Collection pp = ww.fList;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess_in.java
deleted file mode 100644
index cfcb567..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.*;
-
-class A_testFieldWithAccess_in {
-	public List fList = new ArrayList();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess_out.java
deleted file mode 100644
index 6a92e17..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testFieldWithAccess_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.*;
-
-class A_testFieldWithAccess_in {
-	public Collection fList = new ArrayList();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testHashMap_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testHashMap_in.java
deleted file mode 100644
index a91710c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testHashMap_in.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package p;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-
-public class A_testHashMap_in {
-	public static void main(String[] args) {
-		A a = new B();
-		Collection c1 = a.e();
-		HashMap h1 = new HashMap();	/* A1 */
-		a.h(h1, "aaa", c1);
-		a.k(h1);
-		for (Iterator it = h1.values().iterator(); it.hasNext(); ){
-			Vector v1 = (Vector)it.next(); /* C1 */
-			Integer i1 = (Integer)v1.iterator().next(); /* C2 */
-			System.out.println(i1);
-		}
-	}
-}
-
-class A {
-	public Vector e(){
-		Vector v2 = new Vector();	/* A2 */
-		Integer i2 = new Integer(17);
-		insert(v2, i2);
-		Integer i3 = (Integer)v2.iterator().next(); /* C3 */
-		return v2;
-	}
-	public void f(){
-		Vector v3 = new Vector();	/* A3 */
-		v3.add(new Integer(18));
-		reverse(v3);
-		Integer i4 = (Integer)v3.get(0); /* C4 */
-	}
-	public void g(){
-		Vector v4 = new Vector();	/* A4 */
-		v4.add(new String("xyzzy"));
-		reverse(v4);
-		String s1 = (String)v4.get(0); /* C5 */
-	}
-	public void h(Map m1, Object o1, Collection c2){
-		HashMap h2 = new HashMap(); /* A5 */
-		h2.put(o1, c2);
-		m1.putAll(h2);
-	}
-	public void k(Map m2){
-		Vector v5 = new Vector(); /* A6 */
-		v5.add(new Integer(18));
-		v5.addAll(m2.keySet());
-	}
-	public void insert(Vector v6, Object o2){
-		v6.add(o2);
-	}
-	public void reverse(List x1){
-		for (int t=0; t < x1.size()/2; t++){
-			Object temp = x1.get(x1.size()-t);
-			x1.add(x1.size()-1, x1.get(t));
-			x1.add(t, temp);
-		}
-	}
-}
-class B extends A {
-	public void h(Map m3, Object o3, Collection c3){
-		m3.put(o3, c3);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testHashMap_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testHashMap_out.java
deleted file mode 100644
index 277252d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testHashMap_out.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package p;
-
-import java.util.AbstractMap;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-
-public class A_testHashMap_in {
-	public static void main(String[] args) {
-		A a = new B();
-		Collection c1 = a.e();
-		AbstractMap h1 = new HashMap();	/* A1 */
-		a.h(h1, "aaa", c1);
-		a.k(h1);
-		for (Iterator it = h1.values().iterator(); it.hasNext(); ){
-			Vector v1 = (Vector)it.next(); /* C1 */
-			Integer i1 = (Integer)v1.iterator().next(); /* C2 */
-			System.out.println(i1);
-		}
-	}
-}
-
-class A {
-	public Vector e(){
-		Vector v2 = new Vector();	/* A2 */
-		Integer i2 = new Integer(17);
-		insert(v2, i2);
-		Integer i3 = (Integer)v2.iterator().next(); /* C3 */
-		return v2;
-	}
-	public void f(){
-		Vector v3 = new Vector();	/* A3 */
-		v3.add(new Integer(18));
-		reverse(v3);
-		Integer i4 = (Integer)v3.get(0); /* C4 */
-	}
-	public void g(){
-		Vector v4 = new Vector();	/* A4 */
-		v4.add(new String("xyzzy"));
-		reverse(v4);
-		String s1 = (String)v4.get(0); /* C5 */
-	}
-	public void h(Map m1, Object o1, Collection c2){
-		HashMap h2 = new HashMap(); /* A5 */
-		h2.put(o1, c2);
-		m1.putAll(h2);
-	}
-	public void k(Map m2){
-		Vector v5 = new Vector(); /* A6 */
-		v5.add(new Integer(18));
-		v5.addAll(m2.keySet());
-	}
-	public void insert(Vector v6, Object o2){
-		v6.add(o2);
-	}
-	public void reverse(List x1){
-		for (int t=0; t < x1.size()/2; t++){
-			Object temp = x1.get(x1.size()-t);
-			x1.add(x1.size()-1, x1.get(t));
-			x1.add(t, temp);
-		}
-	}
-}
-class B extends A {
-	public void h(Map m3, Object o3, Collection c3){
-		m3.put(o3, c3);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testImport_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testImport_in.java
deleted file mode 100644
index 16a83bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testImport_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-
-import java.awt.List;
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-class A_TestImport_in {
-	public void foo(Hashtable table){
-		table = new Hashtable();
-		table.put("foo", "bar");
-		List awtList = null;
-		ArrayList al = new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testImport_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testImport_out.java
deleted file mode 100644
index de26311..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testImport_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-
-import java.awt.List;
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-class A_TestImport_in {
-	public void foo(Hashtable table){
-		table = new Hashtable();
-		table.put("foo", "bar");
-		List awtList = null;
-		java.util.List al = new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testInterfaceTypes_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testInterfaceTypes_in.java
deleted file mode 100644
index bb7d617..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testInterfaceTypes_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-
-public class A_testInterfaceTypes_in {
-	void foo(){
-		B b = new C();
-		b.toString();
-	}
-}
-
-interface I { }
-class A implements I { }
-class B extends A implements I { }
-class C extends B implements I { }
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testInterfaceTypes_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testInterfaceTypes_out.java
deleted file mode 100644
index 3b775d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testInterfaceTypes_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-
-public class A_testInterfaceTypes_in {
-	void foo(){
-		I b = new C();
-		b.toString();
-	}
-}
-
-interface I { }
-class A implements I { }
-class B extends A implements I { }
-class C extends B implements I { }
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalSuperTypesOfArrayList_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalSuperTypesOfArrayList_in.java
deleted file mode 100644
index 2222265..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalSuperTypesOfArrayList_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-import java.util.*;
-
-class A_testLocalSuperTypesOfArrayList_in {
-	public static void main(String[] args) {
-		ArrayList list = new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalSuperTypesOfArrayList_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalSuperTypesOfArrayList_out.java
deleted file mode 100644
index 2c93a7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalSuperTypesOfArrayList_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-import java.util.*;
-
-class A_testLocalSuperTypesOfArrayList_in {
-	public static void main(String[] args) {
-		List list = new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarCast_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarCast_in.java
deleted file mode 100644
index d488f84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarCast_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*;
-
-class A_testLocalVarCast_in {
-	public void foo(){
-		ArrayList x = new ArrayList();
-		ArrayList o = x;
-		List y = (List)o;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarCast_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarCast_out.java
deleted file mode 100644
index b5a3e9a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarCast_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*;
-
-class A_testLocalVarCast_in {
-	public void foo(){
-		ArrayList x = new ArrayList();
-		List o = x;
-		List y = (List)o;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarDecl_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarDecl_in.java
deleted file mode 100644
index 30ddcb5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarDecl_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Properties;
-
-class A_testLocalVarDecl_in {
-	public static void main(String[] args) {
-		Hashtable table = new Properties();
-		Map map = table;
-		table.put(table,table);
-		table.containsKey(map);
-		map = new HashMap();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarDecl_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarDecl_out.java
deleted file mode 100644
index 1d5d5d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarDecl_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Properties;
-
-class A_testLocalVarDecl_in {
-	public static void main(String[] args) {
-		Map table = new Properties();
-		Map map = table;
-		table.put(table,table);
-		table.containsKey(map);
-		map = new HashMap();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarName_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarName_in.java
deleted file mode 100644
index a0946af..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarName_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.*;
-
-class A_testLocalVarName_in {
-	public static void main(String[] args) {
-		Hashtable table = new Properties();
-		Map map = table;
-		table.put(table,table);
-		table.containsKey(map);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarName_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarName_out.java
deleted file mode 100644
index 37ae052..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarName_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.*;
-
-class A_testLocalVarName_in {
-	public static void main(String[] args) {
-		Map table = new Properties();
-		Map map = table;
-		table.put(table,table);
-		table.containsKey(map);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarType_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarType_in.java
deleted file mode 100644
index 7be90b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarType_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.*;
-
-class A_testLocalVarType_in {
-	public static void main(String[] args) {
-		Hashtable table = new Properties();
-		Map map = table;
-		table.put(table,table);
-		table.containsKey(map);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarType_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarType_out.java
deleted file mode 100644
index 9d3f17b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarType_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.*;
-
-class A_testLocalVarType_in {
-	public static void main(String[] args) {
-		Map table = new Properties();
-		Map map = table;
-		table.put(table,table);
-		table.containsKey(map);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarUse_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarUse_in.java
deleted file mode 100644
index 20e284a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarUse_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testLocalVarUse_in {
-	public void foo(){
-		ArrayList list = new ArrayList();
-		List list2 = list;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarUse_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarUse_out.java
deleted file mode 100644
index 880f2e4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testLocalVarUse_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testLocalVarUse_in {
-	public void foo(){
-		AbstractList list = new ArrayList();
-		List list2 = list;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUClass1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUClass1.java
deleted file mode 100644
index 23d87d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUClass1.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testMultiCUClass1 extends A_testMultiCU_in implements A_testMultiCUInterface1 {
-	public void foo(List z){
-		Collection c = z;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUClass2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUClass2.java
deleted file mode 100644
index e6215d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUClass2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testMultiCUClass2 extends A_testMultiCU_in implements A_testMultiCUInterface2 {
-	/* no method foo(List) here */
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUInterface1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUInterface1.java
deleted file mode 100644
index 3bf98b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUInterface1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.*;
-
-public interface A_testMultiCUInterface1 {
-	public void foo(List y1);
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUInterface2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUInterface2.java
deleted file mode 100644
index 81752ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCUInterface2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.*;
-
-public interface A_testMultiCUInterface2 {
-	public void foo(List y2);
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCU_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCU_in.java
deleted file mode 100644
index 0ee53b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCU_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testMultiCU_in {
-	public void foo(List x){
-		x = new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCU_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCU_out.java
deleted file mode 100644
index 2aae916..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testMultiCU_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testMultiCU_in {
-	public void foo(Collection x){
-		x = new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDeclWithOverride_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDeclWithOverride_in.java
deleted file mode 100644
index 427d9d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDeclWithOverride_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-import java.util.*;
-
-class A_testParameterDeclWithOverride_in {
-	static class X {
-		public void foo(AbstractList v1){
-			Collection c = v1;
-		}
-	}
-	static class Y extends X {
-		public void foo(AbstractList v2){
-			v2 = new ArrayList();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDeclWithOverride_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDeclWithOverride_out.java
deleted file mode 100644
index 99e9581..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDeclWithOverride_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-import java.util.*;
-
-class A_testParameterDeclWithOverride_in {
-	static class X {
-		public void foo(ArrayList v1){
-			Collection c = v1;
-		}
-	}
-	static class Y extends X {
-		public void foo(ArrayList v2){
-			v2 = new ArrayList();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDecl_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDecl_in.java
deleted file mode 100644
index 75389de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDecl_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testParameterDecl_in {
-	public void foo(Hashtable table){
-		table = new Hashtable();
-		table.put("foo", "bar");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDecl_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDecl_out.java
deleted file mode 100644
index 193f938..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterDecl_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testParameterDecl_in {
-	public void foo(Map table){
-		table = new Hashtable();
-		table.put("foo", "bar");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterNameWithOverride_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterNameWithOverride_in.java
deleted file mode 100644
index bacb43f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterNameWithOverride_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-import java.util.*;
-
-class A_testParameterNameWithOverride_in {
-	static class X {
-		public void foo(AbstractList v1){
-			Collection c = v1;
-		}
-	}
-	static class Y extends X {
-		public void foo(AbstractList v2){
-			v2 = new ArrayList();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterNameWithOverride_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterNameWithOverride_out.java
deleted file mode 100644
index 51a0e9c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterNameWithOverride_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-import java.util.*;
-
-class A_testParameterNameWithOverride_in {
-	static class X {
-		public void foo(Collection v1){
-			Collection c = v1;
-		}
-	}
-	static class Y extends X {
-		public void foo(Collection v2){
-			v2 = new ArrayList();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterName_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterName_in.java
deleted file mode 100644
index b88497c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterName_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testParameterName_in {
-	public void foo(Hashtable table){
-		table = new Hashtable();
-		table.put("foo", "bar");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterName_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterName_out.java
deleted file mode 100644
index 5189183..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterName_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testParameterName_in {
-	public void foo(Map table){
-		table = new Hashtable();
-		table.put("foo", "bar");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverride_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverride_in.java
deleted file mode 100644
index 00796bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverride_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-import java.util.*;
-
-class A_testParameterTypeWithOverride_in {
-	static class X {
-		public void foo(AbstractList v1){
-			Collection c = v1;
-		}
-	}
-	static class Y extends X {
-		public void foo(AbstractList v2){
-			v2 = new ArrayList();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverride_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverride_out.java
deleted file mode 100644
index f66f2d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverride_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-import java.util.*;
-
-class A_testParameterTypeWithOverride_in {
-	static class X {
-		public void foo(List v1){
-			Collection c = v1;
-		}
-	}
-	static class Y extends X {
-		public void foo(List v2){
-			v2 = new ArrayList();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding2.java
deleted file mode 100644
index 8d79d00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding2.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testParameterTypeWithOverriding2 extends A_testParameterTypeWithOverriding_in {
-	public void foo(List list2){
-		Collection c = list2;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding2_out.java
deleted file mode 100644
index 8d79d00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding2_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testParameterTypeWithOverriding2 extends A_testParameterTypeWithOverriding_in {
-	public void foo(List list2){
-		Collection c = list2;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding_in.java
deleted file mode 100644
index 3db6fb0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testParameterTypeWithOverriding_in {
-	public void foo(List list){
-		list = new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding_out.java
deleted file mode 100644
index 9176fa4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterTypeWithOverriding_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testParameterTypeWithOverriding_in {
-	public void foo(Collection list){
-		list = new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterType_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterType_in.java
deleted file mode 100644
index da71728..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterType_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testParameterType_in {
-	public void foo(Hashtable table){
-		table = new Hashtable();
-		table.put("foo", "bar");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterType_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterType_out.java
deleted file mode 100644
index a1bc569..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testParameterType_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-import java.util.*;
-
-class A_testParameterType_in {
-	public void foo(Dictionary table){
-		table = new Hashtable();
-		table.put("foo", "bar");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType2.java
deleted file mode 100644
index 527bb43..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType2.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.*;
-
-public class A_testReturnType2 {
-	void bar(){
-		A_testReturnType_in ww = new A_testReturnType_in();
-		Object pp = ww.foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnTypeWithCall_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnTypeWithCall_in.java
deleted file mode 100644
index cbed2e5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnTypeWithCall_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.*;
-
-class A_testReturnTypeWithCall_in {
-	public ArrayList foo(){
-		return new ArrayList();
-	}
-	public void bar(){
-		List l = this.foo();	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnTypeWithCall_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnTypeWithCall_out.java
deleted file mode 100644
index 7f0b8ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnTypeWithCall_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.*;
-
-class A_testReturnTypeWithCall_in {
-	public AbstractList foo(){
-		return new ArrayList();
-	}
-	public void bar(){
-		List l = this.foo();	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType_in.java
deleted file mode 100644
index 7b0bfd1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-class A_testReturnType_in {
-	public List foo(){
-		return new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType_out.java
deleted file mode 100644
index 139f62d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testReturnType_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.*;
-
-class A_testReturnType_in {
-	public Collection foo(){
-		return new ArrayList();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testString_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testString_in.java
deleted file mode 100644
index 1db9bd5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testString_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-
-class A_testString_in {
-	public static void bar(){
-		String s = new String();
-		s.toString();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testString_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testString_out.java
deleted file mode 100644
index d96ed24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ChangeTypeRefactoring/positive/A_testString_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-
-class A_testString_in {
-	public static void bar(){
-		Object s = new String();
-		s.toString();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test0_in.java
deleted file mode 100644
index f24aa7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test0_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//private, static, final
-class A{
-	void f(){
-		new A(){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test0_out.java
deleted file mode 100644
index 501f134..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test0_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//private, static, final
-class A{
-	private final class Inner extends A {
-	}
-
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test10_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test10_in.java
deleted file mode 100644
index 17e86da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test10_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//private, static, final
-class A{
-	A(int i){
-	}
-	void f(){
-		new A(1){
-			void f(){
-				x();
-			}
-		};
-	}
-	static void x(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test10_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test10_out.java
deleted file mode 100644
index 7bd4647..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test10_out.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-//private, static, final
-class A{
-	private final class Inner extends A {
-		private Inner(int i) {
-			super(i);
-		}
-		void f(){
-			x();
-		}
-	}
-	A(int i){
-	}
-	void f(){
-		new Inner(1);
-	}
-	static void x(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test11_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test11_in.java
deleted file mode 100644
index bcf9c61..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test11_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	void f(){
-		final int u= 9;
-		new A(){
-			int k= u;
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test11_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test11_out.java
deleted file mode 100644
index 9dc80ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test11_out.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-class A{
-	private final class Inner extends A {
-		int k;
-		private final int u;
-		private Inner(int u) {
-			super();
-			this.u= u;
-			k= u;
-		}
-	}
-
-	void f(){
-		final int u= 9;
-		new Inner(u);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test12_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test12_in.java
deleted file mode 100644
index b3e2851..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test12_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	A(int x){
-	}
-	void f(){
-		final int u= 9;
-		int s= 2;
-		new A(s){
-			int k= u;
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test12_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test12_out.java
deleted file mode 100644
index 3ef6ce6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test12_out.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-class A{
-	private final class Inner extends A {
-		int k;
-		private final int u;
-		private Inner(int x, int u) {
-			super(x);
-			this.u= u;
-			k= u;
-		}
-	}
-	A(int x){
-	}
-	void f(){
-		final int u= 9;
-		int s= 2;
-		new Inner(s, u);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test13_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test13_in.java
deleted file mode 100644
index 3a0d387..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test13_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	A(Object s){}
-	void f(){
-		class Local{}
-		new A(new Local()){
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test13_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test13_out.java
deleted file mode 100644
index be04509..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test13_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	private final class Inner extends A {
-		private Inner(Object s) {
-			super(s);
-		}
-	}
-	A(Object s){}
-	void f(){
-		class Local{}
-		new Inner(new Local());
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test14_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test14_in.java
deleted file mode 100644
index 44ac387..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test14_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//private, static, final
-class A{
-	void f(){
-		new Object(){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test14_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test14_out.java
deleted file mode 100644
index 53a64d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test14_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//private, static, final
-class A{
-	private final class Inner {
-	}
-
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test15_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test15_in.java
deleted file mode 100644
index 6feac7b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test15_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-
-class A{
-	void g(){
-		new ArrayList(6){
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test15_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test15_out.java
deleted file mode 100644
index 6783e2d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test15_out.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-
-class A{
-	private final class Inner extends ArrayList {
-		private Inner(int arg0) {
-			super(arg0);
-		}
-	}
-
-	void g(){
-		new Inner(6);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test16_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test16_in.java
deleted file mode 100644
index 176d1cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test16_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A {
-	void f(){
-		new Comparable(){
-			public int compareTo(Object other) {
-				return 0;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test16_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test16_out.java
deleted file mode 100644
index 36f5608..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test16_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A {
-	private final class Inner implements Comparable {
-		public int compareTo(Object other) {
-			return 0;
-		}
-	}
-
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test17_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test17_in.java
deleted file mode 100644
index 3612339..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test17_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	A(Object x){
-	}
-	void f(){
-		new A(this){
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test17_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test17_out.java
deleted file mode 100644
index 42c8e2a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test17_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	private final class Inner extends A {
-		private Inner(Object x) {
-			super(x);
-		}
-	}
-	A(Object x){
-	}
-	void f(){
-		new Inner(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test18_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test18_in.java
deleted file mode 100644
index db38aa6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test18_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void f(){
-		final int u= 9;
-		new A(){
-			void g(){
-				int uj= u;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test18_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test18_out.java
deleted file mode 100644
index 3578aaa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test18_out.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A{
-	private final class Inner extends A {
-		private final int u;
-		private Inner(int u) {
-			super();
-			this.u= u;
-		}
-		void g(){
-			int uj= u;
-		}
-	}
-
-	void f(){
-		final int u= 9;
-		new Inner(u);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test19_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test19_in.java
deleted file mode 100644
index 37303db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test19_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void f(){
-		final int u= 8;
-		new A(){
-			int l= 9;
-			int p0= 2, k= u, k1= k;
-			int l1= l+1, p, q= p+u;
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test19_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test19_out.java
deleted file mode 100644
index c910733..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test19_out.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-class A{
-	private final class Inner extends A {
-		int l= 9;
-		int p0= 2, k, k1= k;
-		int l1= l+1, p, q;
-		private final int u;
-		private Inner(int u) {
-			super();
-			this.u= u;
-			k= u;
-			q= p+u;
-		}
-	}
-
-	void f(){
-		final int u= 8;
-		new Inner(u);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test1_in.java
deleted file mode 100644
index c567910..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test1_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//public, static, final
-class A{
-	void f(){
-		new A(){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test1_out.java
deleted file mode 100644
index 8db3e50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test1_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//public, static, final
-class A{
-	public final class Inner extends A {
-	}
-
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test20_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test20_in.java
deleted file mode 100644
index ab963b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test20_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	public void foo() {
-		A foo= new A() {
-			public void bar() {
-					// TODO the return is misaligned
-	return;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test20_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test20_out.java
deleted file mode 100644
index bae6c85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test20_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	private final class Inner extends A {
-		public void bar() {
-				// TODO the return is misaligned
-return;
-		}
-	}
-
-	public void foo() {
-		A foo= new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test21_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test21_in.java
deleted file mode 100644
index 8a0519e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test21_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A {
-	public static void foo() {
-		A foo= new A() {
-			public void bar() {
-				return;
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test21_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test21_out.java
deleted file mode 100644
index 06b73ed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test21_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A {
-	private static final class Inner extends A {
-		public void bar() {
-			return;
-		}
-	}
-
-	public static void foo() {
-		A foo= new Inner();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test22_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test22_in.java
deleted file mode 100644
index 407e4e6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test22_in.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A {
-	interface I	{
-		void bar();
-	}
-	public static void foo(){
-		I foo= new I() {
-			public void bar() {
-				I foo = new I() {
-					public void bar(){
-					}
-				};
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test22_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test22_out.java
deleted file mode 100644
index b3e88b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test22_out.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-class A {
-	private static final class Inner implements I {
-		public void bar(){
-		}
-	}
-	interface I	{
-		void bar();
-	}
-	public static void foo(){
-		I foo= new I() {
-			public void bar() {
-				I foo = new Inner();
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test23_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test23_in.java
deleted file mode 100644
index 488a62c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test23_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A {
-	public static void foo1(){
-		A foo = new A()	{
-			public void foo(){
-				A foo = new A(){};
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test23_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test23_out.java
deleted file mode 100644
index 734562e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test23_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	private final class Inner extends A {
-	}
-
-	public static void foo1(){
-		A foo = new A()	{
-			public void foo(){
-				A foo = new Inner();
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test24_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test24_in.java
deleted file mode 100644
index 41428c2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test24_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	static A a = new A(){
-		public void foo(){
-		}
-	};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test24_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test24_out.java
deleted file mode 100644
index b786337..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test24_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	private static final class Inner extends A {
-		public void foo(){
-		}
-	}
-
-	static A a = new Inner();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test25_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test25_in.java
deleted file mode 100644
index 17059d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test25_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A {
-	interface I{
-		void foo();
-	}
-	static A i = new A(){
-		public void foo(){
-			I i = new I() {
-				public void foo(){
-					
-				}
-			};
-		}
-	};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test25_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test25_out.java
deleted file mode 100644
index bce37ae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test25_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A {
-	private final class Inner implements I {
-		public void foo(){
-			
-		}
-	}
-	interface I{
-		void foo();
-	}
-	static A i = new A(){
-		public void foo(){
-			I i = new Inner();
-		}
-	};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test26_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test26_in.java
deleted file mode 100644
index 3fd6378..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test26_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A {
-	interface I{
-		void foo();
-	}
-	static I i = new I(){
-		public void foo(){
-			I i = new I() {
-				public void foo(){
-					
-				}
-			};
-		}
-	};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test26_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test26_out.java
deleted file mode 100644
index 236d9ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test26_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A {
-	private static final class Inner implements I {
-		public void foo(){
-			
-		}
-	}
-	interface I{
-		void foo();
-	}
-	static I i = new I(){
-		public void foo(){
-			I i = new Inner();
-		}
-	};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test27_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test27_in.java
deleted file mode 100644
index df8ef5a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test27_in.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-class A {
-	interface I{
-		void foo();
-	}
-	static void foo1(){
-		new A(){
-			void foo(){
-				I i = new I(){
-					public void foo(){
-						I i = new I(){
-							public void foo(){
-							}
-						};
-					}
-				};
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test27_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test27_out.java
deleted file mode 100644
index d5dd8c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test27_out.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-class A {
-	private final class Inner implements I {
-		public void foo(){
-		}
-	}
-	interface I{
-		void foo();
-	}
-	static void foo1(){
-		new A(){
-			void foo(){
-				I i = new I(){
-					public void foo(){
-						I i = new Inner();
-					}
-				};
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test28_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test28_in.java
deleted file mode 100644
index 4ede75f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test28_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	public static class B extends A {
-		public void foo(){
-		}
-	}
-	
-	static B b = new B() {
-		public void foo() {
-			B b = new B(){};
-		}
-	};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test28_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test28_out.java
deleted file mode 100644
index 6440a3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test28_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A {
-	private final class Inner extends B {
-	}
-
-	public static class B extends A {
-		public void foo(){
-		}
-	}
-	
-	static B b = new B() {
-		public void foo() {
-			B b = new Inner();
-		}
-	};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test2_in.java
deleted file mode 100644
index f37423a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test2_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//public, nonstatic, final
-class A{
-	void f(){
-		new A(){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test2_out.java
deleted file mode 100644
index d8358e2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test2_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//public, nonstatic, final
-class A{
-	public final class Inner extends A {
-	}
-
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test3_in.java
deleted file mode 100644
index 9a318b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test3_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//public, nonstatic, nonfinal
-class A{
-	void f(){
-		new A(){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test3_out.java
deleted file mode 100644
index f02f8b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test3_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//public, nonstatic, nonfinal
-class A{
-	public class Inner extends A {
-	}
-
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test4_in.java
deleted file mode 100644
index 5a2d397..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test4_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//private, static, final
-class A{
-	A(){
-	}
-	void f(){
-		new A(){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test4_out.java
deleted file mode 100644
index 953159c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test4_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//private, static, final
-class A{
-	private final class Inner extends A {
-	}
-	A(){
-	}
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test5_in.java
deleted file mode 100644
index d2e45d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test5_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//private, static, final
-class A{
-	A(int i){
-	}
-	void f(){
-		new A(1){};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test5_out.java
deleted file mode 100644
index ba6a492..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test5_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//private, static, final
-class A{
-	private final class Inner extends A {
-		private Inner(int i) {
-			super(i);
-		}
-	}
-	A(int i){
-	}
-	void f(){
-		new Inner(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test6_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test6_in.java
deleted file mode 100644
index 18cbe20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test6_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//private, static, final
-class A{
-	A(int i){
-	}
-	void f(){
-		new A(1){
-			void f(){
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test6_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test6_out.java
deleted file mode 100644
index b7c7807..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test6_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-//private, static, final
-class A{
-	private final class Inner extends A {
-		private Inner(int i) {
-			super(i);
-		}
-		void f(){
-		}
-	}
-	A(int i){
-	}
-	void f(){
-		new Inner(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test7_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test7_in.java
deleted file mode 100644
index 81d8b7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test7_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//private, static, final
-class A{
-	A(int i){
-	}
-	void f(){
-		new A(1){
-			int X = 0;
-			void f(){
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test7_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test7_out.java
deleted file mode 100644
index e6c4841..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test7_out.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//private, static, final
-class A{
-	private final class Inner extends A {
-		int X = 0;
-		private Inner(int i) {
-			super(i);
-		}
-		void f(){
-		}
-	}
-	A(int i){
-	}
-	void f(){
-		new Inner(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test8_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test8_in.java
deleted file mode 100644
index 76a1c72..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test8_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//private, nonstatic, final
-class A{
-	A(int i){
-	}
-	void f(){
-		new A(1){
-			void f(){
-				x();
-			}
-		};
-	}
-	void x(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test8_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test8_out.java
deleted file mode 100644
index c07a000..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test8_out.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-//private, nonstatic, final
-class A{
-	private final class Inner extends A {
-		private Inner(int i) {
-			super(i);
-		}
-		void f(){
-			x();
-		}
-	}
-	A(int i){
-	}
-	void f(){
-		new Inner(1);
-	}
-	void x(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test9_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test9_in.java
deleted file mode 100644
index 5c55e59..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test9_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//private, nonstatic, final
-class A{
-	int y;
-	A(int i){
-	}
-	void f(){
-		new A(1){
-			void f(){
-				y= 0;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test9_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test9_out.java
deleted file mode 100644
index fdf593c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/canConvert/A_test9_out.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-//private, nonstatic, final
-class A{
-	private final class Inner extends A {
-		private Inner(int i) {
-			super(i);
-		}
-		void f(){
-			y= 0;
-		}
-	}
-	int y;
-	A(int i){
-	}
-	void f(){
-		new Inner(1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail0.java
deleted file mode 100644
index c4f269c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail0.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//references a local type
-class A{
-    void f(){
-        class Local{}
-        new A(){
-            Object x= new Local();
-        };
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail1.java
deleted file mode 100644
index 841b262..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail1.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-    class Inner{}
-    void f(){
-        new A(){
-            Object x= new Object();
-        };
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail2.java
deleted file mode 100644
index 9fc6c63..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail2.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class Inner{
-	class InnerInner{
-	    void f(){
-	        new Object(){
-	        };
-	    }
-	}    
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail3.java
deleted file mode 100644
index 2b82544..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail3.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-public class A {
-	public static class B extends A {
-		public void foo(){
-		}
-	}
-	
-	static B b = new B() {
-		public void foo() {
-			B b = new B(){};
-		}
-	};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail4.java
deleted file mode 100644
index 4746799..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ConvertAnonymousToNested/cannotConvert/A_testFail4.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-class A {
-	static void foo() {
-		final int x= 10; 
-		Runnable runnable= new Runnable() {
-			private int field;
-			public void run() {
-				I i= new I() {
-					public void method() {
-						field= x;
-					}
-				};
-			}
-		};
-	}
-}
-
-interface I {
-	void method();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_declared_in_multi_yes_type/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_declared_in_multi_yes_type/in/A.java
deleted file mode 100644
index a641675..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_declared_in_multi_yes_type/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int[] bar[], baz;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_declared_in_multi_yes_type/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_declared_in_multi_yes_type/out/A.java
deleted file mode 100644
index 0ae86ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_declared_in_multi_yes_type/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int[] bar[], baz;
-	int[] bar[];
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_yes_field/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_yes_field/in/A.java
deleted file mode 100644
index 7c8fc80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_yes_field/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int bar;
-	int baz;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_yes_field/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_yes_field/out/A.java
deleted file mode 100644
index 9b0472f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_field_yes_field/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int bar;
-	int baz;
-	int bar;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type/in/A.java
deleted file mode 100644
index 127f912..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int[] bar[]= null, baz= null;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type/out/A.java
deleted file mode 100644
index a4c844b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int[] bar[]= null, baz= null;
-	int[] bar[] = null;
-	int[] baz = null;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type_1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type_1/in/A.java
deleted file mode 100644
index 79ac2a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type_1/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A {
-	private int var11, var2, var3;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type_1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type_1/out/A.java
deleted file mode 100644
index 8fe2349..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_fields_declared_in_multi_yes_type_1/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	private int var11, var2, var3;
-	private int var11;
-	private int var2;
-	private int var3;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/in/A.java
deleted file mode 100644
index 5fd23e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-import java.util.*;
-import java.lang.Object;
-class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/in/C.java
deleted file mode 100644
index 9c6b788..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/in/C.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class C {
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/out/A.java
deleted file mode 100644
index 5fd23e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-import java.util.*;
-import java.lang.Object;
-class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/out/C.java
deleted file mode 100644
index 0a21d09..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_cu/out/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-import java.util.*;
-import java.lang.Object;
-class C {
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/in/A.java
deleted file mode 100644
index 5fd23e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-import java.util.*;
-import java.lang.Object;
-class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/in/C.java
deleted file mode 100644
index 9c6b788..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/in/C.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class C {
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/out/A.java
deleted file mode 100644
index 5fd23e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-import java.util.*;
-import java.lang.Object;
-class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/out/C.java
deleted file mode 100644
index 0a21d09..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_method_in_different_cu/out/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-import java.util.*;
-import java.lang.Object;
-class C {
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/in/A.java
deleted file mode 100644
index 7d966e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/in/C.java
deleted file mode 100644
index 49f041f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/in/C.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class C {
-}
-class D {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/out/A.java
deleted file mode 100644
index 7d966e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/out/C.java
deleted file mode 100644
index 5df7e22..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_import_container_yes_type_in_different_cu/out/C.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.*;
-class C {
-}
-class D {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_method/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_method/in/A.java
deleted file mode 100644
index 63216a9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_method/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	static {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_method/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_method/out/A.java
deleted file mode 100644
index f419de0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_method/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	static {
-	}
-	static {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_type/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_type/in/A.java
deleted file mode 100644
index 8c67b83..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_type/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	{
-		int fred= 0; //comment
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_type/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_type/out/A.java
deleted file mode 100644
index 272c775..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_initializer_yes_type/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	{
-		int fred= 0; //comment
-	}
-	{
-		int fred= 0; //comment
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/in/A.java
deleted file mode 100644
index f32cf61..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	class Inner {
-		void foo() {//comment here
-		}
-		int bar;//comment there
-		int baz;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/in/C.java
deleted file mode 100644
index 8b3f1f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/in/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class C{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/out/A.java
deleted file mode 100644
index f32cf61..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	class Inner {
-		void foo() {//comment here
-		}
-		int bar;//comment there
-		int baz;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/out/C.java
deleted file mode 100644
index a10a14d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_inner_type_yes_cu/out/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class C{
-}
-
-class Inner {
-	void foo() {//comment here
-	}
-	int bar;//comment there
-	int baz;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/in/A.java
deleted file mode 100644
index 97fa672..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/in/C.java
deleted file mode 100644
index 49f041f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/in/C.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class C {
-}
-class D {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/out/A.java
deleted file mode 100644
index 97fa672..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/out/C.java
deleted file mode 100644
index cc9219f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_cu_with_main_type/out/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class C {
-
-	void foo() {
-	}
-}
-class D {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_field/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_field/in/A.java
deleted file mode 100644
index 949b72d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_field/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int bar;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_field/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_field/out/A.java
deleted file mode 100644
index 046d474..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_field/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int bar;
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_initializer/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_initializer/in/A.java
deleted file mode 100644
index 7d966e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_initializer/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_initializer/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_initializer/out/A.java
deleted file mode 100644
index 3437196..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_initializer/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	{
-	}
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_itself/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_itself/in/A.java
deleted file mode 100644
index 97fa672..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_itself/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_itself/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_itself/out/A.java
deleted file mode 100644
index 050fef9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_itself/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_other_method/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_other_method/in/A.java
deleted file mode 100644
index 3df1c60..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_other_method/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	void bar() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_other_method/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_other_method/out/A.java
deleted file mode 100644
index d662690..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_other_method/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	void bar() {
-	}
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_type/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_type/in/A.java
deleted file mode 100644
index be7483e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_type/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-		int stuff= 1; //this is a comment
-					  //and another one
-	}
-	int bar;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_type/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_type/out/A.java
deleted file mode 100644
index 1210d13..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_method_yes_type/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-		int stuff= 1; //this is a comment
-					  //and another one
-	}
-	int bar;
-	void foo() {
-		int stuff= 1; //this is a comment
-					  //and another one
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/in/A.java
deleted file mode 100644
index 7c8fc80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int bar;
-	int baz;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/in/C.java
deleted file mode 100644
index 8b3f1f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/in/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class C{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/out/A.java
deleted file mode 100644
index 7c8fc80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-	int bar;
-	int baz;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/out/C.java
deleted file mode 100644
index 3609e4e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Copy/test_type_yes_type/out/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class C{
-}
-
-class A {
-	void foo() {
-	}
-	int bar;
-	int baz;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/CopyPackageChange/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/CopyPackageChange/A.java
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/CopyPackageChange/A.java
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu0/in/A.java
deleted file mode 100644
index 5fa7bcf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu0/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int i, j;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu0/out/A.java
deleted file mode 100644
index bbeefab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu0/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int j;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu1/in/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu1/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu1/out/A.java
deleted file mode 100644
index ff4381d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu1/out/A.java
+++ /dev/null
@@ -1 +0,0 @@
-package p;
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu10/in/A.java
deleted file mode 100644
index 3ec9951..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu10/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	static {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu10/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu10/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu11/in/A.java
deleted file mode 100644
index e411cc5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu11/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-import java.util.List;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu11/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu11/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu12/in/A.java
deleted file mode 100644
index 490e407..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu12/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	class B{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu12/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu12/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu13/in/A.java
deleted file mode 100644
index 490e407..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu13/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	class B{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu13/out/A.java
deleted file mode 100644
index ff4381d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu13/out/A.java
+++ /dev/null
@@ -1 +0,0 @@
-package p;
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu14/in/A.java
deleted file mode 100644
index 490e407..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu14/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	class B{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu14/out/A.java
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu14/out/A.java
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu15/in/A.java
deleted file mode 100644
index 815e6f3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu15/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	int field;
-	public int getField(){
-		return field;
-	}
-
-	public void setField(int field){
-		this.field= field;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu15/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu15/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu16/in/A.java
deleted file mode 100644
index 4b4ee0d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu16/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/**
- */
-class Test{
-}/**
- */
-class Test1{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu16/out/A.java
deleted file mode 100644
index f6c2f03..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu16/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/**
- */
-class Test1{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu17/in/A.java
deleted file mode 100644
index bb37e19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu17/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-
-	void f(){}
-	
-	/**
-	 * 
-	 */
-	void fs(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu17/out/A.java
deleted file mode 100644
index 48f86a9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu17/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-
-	/**
-	 * 
-	 */
-	void fs(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu18/in/A.java
deleted file mode 100644
index 7d18eda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu18/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	/**
-	 */
-	void fs(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu18/out/A.java
deleted file mode 100644
index 688a6d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu18/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu19/in/A.java
deleted file mode 100644
index 029feb2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu19/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-import java.util.List;
-import java.util.Set;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu19/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu19/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu2/in/A.java
deleted file mode 100644
index 40ae578..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu2/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu2/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu2/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu20/in/A.java
deleted file mode 100644
index 0c54a34..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu20/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A 
-	protected String fEmpty;
-
-	public static void main (String[] args) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu20/out/A.java
deleted file mode 100644
index b7ed234..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu20/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A 
-	public static void main (String[] args) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu21/in/A.java
deleted file mode 100644
index 9d80a97..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu21/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A 
-	private int var11, var2, var3;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu21/out/A.java
deleted file mode 100644
index cb4cb95..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu21/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A 
-	private int var2, var3;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu3/in/A.java
deleted file mode 100644
index 5fa7bcf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu3/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int i, j;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu3/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu3/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu4/in/A.java
deleted file mode 100644
index be1c2f8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu4/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int i, j, k;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu4/out/A.java
deleted file mode 100644
index bbeefab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu4/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int j;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu5/in/A.java
deleted file mode 100644
index 5fa7bcf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu5/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int i, j;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu5/out/A.java
deleted file mode 100644
index 40ae578..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu5/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu6/in/A.java
deleted file mode 100644
index 618deb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu6/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int i= 0, j= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu6/out/A.java
deleted file mode 100644
index 727dfc4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu6/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int i= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu7/in/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu7/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu7/out/A.java
deleted file mode 100644
index 197a31b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu7/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu8/in/A.java
deleted file mode 100644
index ed947f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu8/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu8/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu8/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu9/in/A.java
deleted file mode 100644
index c08e03d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu9/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu9/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Delete/testDeleteWithinCu9/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test0_in.java
deleted file mode 100644
index 34e6051..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test0_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//5, 16 -> 5, 17   AllowLoadtime == false
-package p;
-class A {
-	void f() {
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test0_out.java
deleted file mode 100644
index 942e111..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test0_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//5, 16 -> 5, 17   AllowLoadtime == false
-package p;
-class A {
-	private static final int CONSTANT= 0;
-	void f() {
-		int i= CONSTANT;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test10_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test10_in.java
deleted file mode 100644
index bb77191..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test10_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 17 -> 8, 22
-package p;
-
-class A {
-	void foob() {
-		int c= 2 + 2 * 4 + (28 + 2 + 2) + 1;
-
-		int e= (2 + 2) * 3 * 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test10_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test10_out.java
deleted file mode 100644
index f3c9fe3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test10_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 8, 17 -> 8, 22
-package p;
-
-class A {
-	private static final int CONSTANT= 2 + 2;
-	void foob() {
-		int c= 2 + 2 * 4 + (28 + CONSTANT) + 1;
-
-		int e= (CONSTANT) * 3 * 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test11_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test11_in.java
deleted file mode 100644
index 751b6aa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test11_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// 10, 37 -> 10, 43
-package p;
-
-class A {
-	void foob() {
-
-		int c= 3 * (2 + 1) + 2 + 2 * 4 + 28;
-
-
-		int e= (2 + 2) * (27 + 2 * (2+2* 4+1*2));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test11_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test11_out.java
deleted file mode 100644
index 67b999d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test11_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-// 10, 37 -> 10, 43
-package p;
-
-class A {
-	private static final int CONSTANT= 2+2* 4;
-	void foob() {
-
-		int c= 3 * (2 + 1) + CONSTANT + 28;
-
-
-		int e= (2 + 2) * (27 + 2 * (CONSTANT+1*2));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test12_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test12_in.java
deleted file mode 100644
index 7481e13..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test12_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 9, 19 -> 9, 24
-package p;
-
-class A {
-	void foob() {
-		
-		int e= (2 + 2) * 3 * 1;
-		
-		int f= 5 *3*  1 *(1 + 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test12_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test12_out.java
deleted file mode 100644
index c4f8054..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test12_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// 9, 19 -> 9, 24
-package p;
-
-class A {
-	private static final int CONSTANT= 3*  1;
-	void foob() {
-		
-		int e= (2 + 2) * CONSTANT;
-		
-		int f= 5 *CONSTANT *(1 + 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test13_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test13_in.java
deleted file mode 100644
index 08cf97c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test13_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//9, 16 -> 9, 28   AllowLoadtime == true
-package p;
-
-class S {
-	public static S instance= new S();
-	
-	int f(){
-
-		int v= instance.f();
-		return 0;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test13_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test13_out.java
deleted file mode 100644
index a057491..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test13_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//9, 16 -> 9, 28   AllowLoadtime == true
-package p;
-
-class S {
-	public static S instance= new S();
-	private static final int CONSTANT= instance.f();
-	
-	int f(){
-
-		int v= CONSTANT;
-		return 0;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test14_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test14_in.java
deleted file mode 100644
index 5ac843b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test14_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//10, 28 -> 10, 44   AllowLoadtime == true
-package p;
-
-class S {
-	public static S instance= new S();
-
-	int s;
-
-	int f() {
-		System.out.println(S.instance.s + 1);
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test14_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test14_out.java
deleted file mode 100644
index a53a057..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test14_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//10, 28 -> 10, 44   AllowLoadtime == true
-package p;
-
-class S {
-	public static S instance= new S();
-	private static final int CONSTANT= S.instance.s + 1;
-
-	int s;
-
-	int f() {
-		System.out.println(CONSTANT);
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test15_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test15_in.java
deleted file mode 100644
index 71a125d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test15_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//5, 16 -> 5, 25   AllowLoadtime == false
-package p;
-class A {
-	void f() {
-		int i= getFred();
-	}
-	static int getFred(){
-		return 5;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test15_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test15_out.java
deleted file mode 100644
index e42902f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test15_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//5, 16 -> 5, 25   AllowLoadtime == false
-package p;
-class A {
-	private static final int CONSTANT= getFred();
-	void f() {
-		int i= CONSTANT;
-	}
-	static int getFred(){
-		return 5;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test16_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test16_in.java
deleted file mode 100644
index 2df41b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test16_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//5, 20 -> 5, 27   AllowLoadtime == false
-package p;
-class A {
-	void f() {
-		boolean i= isRed();
-	}
-	static boolean isRed(){
-		return 5==1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test16_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test16_out.java
deleted file mode 100644
index 1f2d557..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test16_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//5, 20 -> 5, 27   AllowLoadtime == false
-package p;
-class A {
-	private static final boolean CONSTANT= isRed();
-	void f() {
-		boolean i= CONSTANT;
-	}
-	static boolean isRed(){
-		return 5==1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test17_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test17_in.java
deleted file mode 100644
index 4c84790..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test17_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//5, 16 -> 5, 35   AllowLoadtime == false
-package p;
-class A {
-	void f() {
-		int i= getYetAnotherFred();
-	}
-	static int getYetAnotherFred(){
-		return 5;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test17_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test17_out.java
deleted file mode 100644
index 5aa9959..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test17_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//5, 16 -> 5, 35   AllowLoadtime == false
-package p;
-class A {
-	private static final int CONSTANT= getYetAnotherFred();
-	void f() {
-		int i= CONSTANT;
-	}
-	static int getYetAnotherFred(){
-		return 5;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test18_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test18_in.java
deleted file mode 100644
index d8b8815..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test18_in.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//5, 16 -> 5, 17   AllowLoadtime == false,  qualifyReferencesWithClassName= true
-package p;
-class ClassName {
-	int f() {
-		return 0;
-	}
-	
-	class Nested {
-		{
-			System.out.println(0);	
-		}
-		
-		void f() {
-			int i= 0;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test18_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test18_out.java
deleted file mode 100644
index 6adfcc7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test18_out.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//5, 16 -> 5, 17   AllowLoadtime == false,  qualifyReferencesWithClassName= true
-package p;
-class ClassName {
-	private static final int CONSTANT= 0;
-	int f() {
-		return ClassName.CONSTANT;
-	}
-	
-	class Nested {
-		{
-			System.out.println(ClassName.CONSTANT);	
-		}
-		
-		void f() {
-			int i= ClassName.CONSTANT;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test19_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test19_in.java
deleted file mode 100644
index 77f3a8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test19_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-// 5, 23 -> 5, 38
-class Foo {
-	public final static String BASE = "base."; //$NON-NLS-1$
-	public void m1() {
-		String name = BASE + "suffix";
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test19_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test19_out.java
deleted file mode 100644
index 023ec69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test19_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-// 5, 23 -> 5, 38
-class Foo {
-	public final static String BASE = "base."; //$NON-NLS-1$
-	private static final String CONSTANT= BASE + "suffix";
-	public void m1() {
-		String name = CONSTANT;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test1_in.java
deleted file mode 100644
index a9eea96..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test1_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//5, 16 -> 5, 21   AllowLoadtime == false
-package p;
-class A {
-	void f() {
-		int i= 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test1_out.java
deleted file mode 100644
index 235a882..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test1_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//5, 16 -> 5, 21   AllowLoadtime == false
-package p;
-class A {
-	private static final int CONSTANT= 1 + 2;
-	void f() {
-		int i= CONSTANT;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test20_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test20_in.java
deleted file mode 100644
index 102d0a9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test20_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// 7, 19 -> 7, 28
-class BodyDeclOnSameLine {
-	private final static String BAR= "c";
-	private final static String FOO=  "a";  /* ambiguous */ String strange= "b"; //$NON-NLS-1$ //$NON-NLS-2$
-
-	void m() {
-		String s= FOO + BAR;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test20_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test20_out.java
deleted file mode 100644
index 3aa11d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test20_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// 7, 19 -> 7, 28
-class BodyDeclOnSameLine {
-	private final static String BAR= "c";
-	private final static String FOO=  "a"; private static final String CONSTANT= FOO + BAR;  /* ambiguous */ String strange= "b"; //$NON-NLS-1$ //$NON-NLS-2$
-
-	void m() {
-		String s= CONSTANT;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test21_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test21_in.java
deleted file mode 100644
index c2834b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test21_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//  4, 28 -> 4, 37
-class EndsOnSameLine {
-	void m() {
-		System.out.println(FOO + FOO);
-	}
-
-	static final String FOO= "foo";} // $NON-NLS-1$
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test21_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test21_out.java
deleted file mode 100644
index fa66a97..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test21_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//  4, 28 -> 4, 37
-class EndsOnSameLine {
-	void m() {
-		System.out.println(CONSTANT);
-	}
-
-	static final String FOO= "foo"; private static final String CONSTANT= FOO + FOO;} // $NON-NLS-1$
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test2_in.java
deleted file mode 100644
index 66ad43a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test2_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//8, 16 -> 8, 27   AllowLoadtime == false
-package p;
-class A {
-	static final int foo= 1;
-	static final int bar= 2;
-	static final int baz= 3;
-	void f() {
-		int i= 1 + 3 * bar;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test2_out.java
deleted file mode 100644
index 87cffcf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test2_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//8, 16 -> 8, 27   AllowLoadtime == false
-package p;
-class A {
-	static final int foo= 1;
-	static final int bar= 2;
-	private static final int CONSTANT= 1 + 3 * bar;
-	static final int baz= 3;
-	void f() {
-		int i= CONSTANT;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test3_in.java
deleted file mode 100644
index d049fb1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test3_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//8, 16 -> 8, 27   AllowLoadtime == false
-package p;
-class A {
-	static final int foo= 1;
-	static final int bar= 2;
-	static final int baz= foo * (1+3*bar);
-	void f() {
-		int i= 1 + 3 * bar;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test3_out.java
deleted file mode 100644
index 62aeeb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test3_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//8, 16 -> 8, 27   AllowLoadtime == false
-package p;
-class A {
-	static final int foo= 1;
-	static final int bar= 2;
-	private static final int CONSTANT= 1 + 3 * bar;
-	static final int baz= foo * (CONSTANT);
-	void f() {
-		int i= CONSTANT;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test4_in.java
deleted file mode 100644
index 9eb2244..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test4_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//5, 23 -> 5, 34   AllowLoadtime == false
-package p;
-class A {
-	static void f() {
-		int i= 2*(1 + 2 * b() * 5);
-		System.out.println(i);
-		System.out.println(2*b     ()*5  +1);
-	}
-	static int b() {
-		return 4;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test4_out.java
deleted file mode 100644
index bf3031a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test4_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//5, 23 -> 5, 34   AllowLoadtime == false
-package p;
-class A {
-	private static final int CONSTANT= 2 * b() * 5;
-	static void f() {
-		int i= 2*(1 + CONSTANT);
-		System.out.println(i);
-		System.out.println(CONSTANT  +1);
-	}
-	static int b() {
-		return 4;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test5_in.java
deleted file mode 100644
index b871560..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test5_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//11, 20 -> 11, 26   AllowLoadtime == true
-package p;
-
-class R {
-	static int rG() {
-		return 2;
-	}
-
-	static class S extends R {
-		int f(){
-			int d= R.rG();
-			return d;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test5_out.java
deleted file mode 100644
index cc45ec7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test5_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-//11, 20 -> 11, 26   AllowLoadtime == true
-package p;
-
-class R {
-	static int rG() {
-		return 2;
-	}
-
-	static class S extends R {
-		private static final int CONSTANT= R.rG();
-		int f(){
-			int d= CONSTANT;
-			return d;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test6_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test6_in.java
deleted file mode 100644
index 4d28bf7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test6_in.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//13, 20 -> 13, 35   AllowLoadtime == true
-package p;
-
-class R {
-	public static R instance= new R();
-	
-	int rF() {
-		return 1;
-	}
-	
-	static class S extends R {
-		int f(){
-			int d= R.instance.rF();		
-			return 0;	
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test6_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test6_out.java
deleted file mode 100644
index 931e69e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test6_out.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//13, 20 -> 13, 35   AllowLoadtime == true
-package p;
-
-class R {
-	public static R instance= new R();
-	
-	int rF() {
-		return 1;
-	}
-	
-	static class S extends R {
-		private static final int CONSTANT= R.instance.rF();
-		int f(){
-			int d= CONSTANT;		
-			return 0;	
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test7_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test7_in.java
deleted file mode 100644
index 001007d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test7_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//12, 20 -> 12, 28   AllowLoadtime == true
-package p;
-
-
-class R {
-	static int rG() {
-		return 2;	
-	}
-	
-	static class S extends R {
-		void f(){
-			int d= p.R.rG();	
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test7_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test7_out.java
deleted file mode 100644
index 82d01e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test7_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-//12, 20 -> 12, 28   AllowLoadtime == true
-package p;
-
-
-class R {
-	static int rG() {
-		return 2;	
-	}
-	
-	static class S extends R {
-		private static final int CONSTANT= p.R.rG();
-		void f(){
-			int d= CONSTANT;	
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test8_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test8_in.java
deleted file mode 100644
index 59610d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test8_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//8, 16 -> 8, 22   AllowLoadtime == true
-package p;
-
-class S {
-	static int s;
-
-	int f() {
-		return 23 * s;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test8_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test8_out.java
deleted file mode 100644
index 186eeb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test8_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//8, 16 -> 8, 22   AllowLoadtime == true
-package p;
-
-class S {
-	static int s;
-	private static final int CONSTANT= 23 * s;
-
-	int f() {
-		return CONSTANT;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test9_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test9_in.java
deleted file mode 100644
index 87db857..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test9_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 6, 24 -> 6, 29
-package p;
-
-class A {
-	void foob() {
-		int a= 2 * 3 + 3 + 1;
-
-		int b= (3 + 1) + 1*1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test9_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test9_out.java
deleted file mode 100644
index de08992..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_test9_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 6, 24 -> 6, 29
-package p;
-
-class A {
-	private static final int CONSTANT= 3 + 1;
-	void foob() {
-		int a= 2 * 3 + CONSTANT;
-
-		int b= (CONSTANT) + 1*1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_testZeroLengthSelection0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_testZeroLengthSelection0_in.java
deleted file mode 100644
index b2d2c71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_testZeroLengthSelection0_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//5, 18 -> 5, 18   AllowLoadtime == false
-package p;
-class A {
-	void f() {
-		int i= 100;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_testZeroLengthSelection0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_testZeroLengthSelection0_out.java
deleted file mode 100644
index 81d5e7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/canExtract/A_testZeroLengthSelection0_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//5, 18 -> 5, 18   AllowLoadtime == false
-package p;
-class A {
-	private static final int CONSTANT= 100;
-	void f() {
-		int i= CONSTANT;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail0.java
deleted file mode 100644
index 5ebd210..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail0.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//8, 16 -> 8, 21   AllowLoadtime == true
-package p;
-
-class S {
-	int s;
-	
-	void f(){
-		int l= s + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail1.java
deleted file mode 100644
index bc91ca4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//8, 16 -> 8, 26   AllowLoadtime == true
-package p;
-
-class S {
-	int s;
-		
-	int f() {
-		return 23 *this.s;	
-	}
-}	
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail10.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail10.java
deleted file mode 100644
index ae366f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail10.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//15, 20 -> 15, 37   AllowLoadtime == false
-package p;
-
-class R {
-	static R instance() {
-		return null;
-	}
-	
-	int rF() {
-		return 1;	
-	}
-	
-	static class S extends R {
-		int f(){
-			int d= R.instance().rF();		
-			return 0;	
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail11.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail11.java
deleted file mode 100644
index 77096bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail11.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//8, 16 -> 8, 22   AllowLoadtime == false
-package p;
-
-class S {
-	static int s;
-		
-	int f() {
-		return 23 * s;	
-	}
-}	
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail12.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail12.java
deleted file mode 100644
index 1ffe9d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail12.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//4, 7 -> 4, 8   AllowLoadtime == true
-package p;
-
-class S {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail13.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail13.java
deleted file mode 100644
index af9a246..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail13.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//2, 9 -> 2, 10   AllowLoadtime == true
-package p;
-
-class S {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail14.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail14.java
deleted file mode 100644
index 2d28a7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail14.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//5, 9 -> 5, 11   AllowLoadtime == true
-package p;
-
-class S {
-	int i= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail15.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail15.java
deleted file mode 100644
index 062140a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail15.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//5, 10 -> 5, 13   AllowLoadtime == true
-package p;
-
-class S {
-	int i= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail2.java
deleted file mode 100644
index 01cc4e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail2.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//9, 20 -> 9, 21   AllowLoadtime == true
-package p;
-
-class R {
-	int r;
-	
-	static class S extends R {
-		void f(){
-			int n= r;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail3.java
deleted file mode 100644
index 778b26d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail3.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//9, 18 -> 9, 25   AllowLoadtime == true
-package p;
-
-class R {
-	int r;
-
-	static class S extends R {
-		String f() {
-			fish(super.r);
-			return null;	
-		}
-		static void fish(int parm) {
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail4.java
deleted file mode 100644
index 08045d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail4.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//6, 16 -> 6, 20   AllowLoadtime == true
-package p;
-
-class S {
-	int f(){
-		return f2();	
-	}
-	int f2() {
-		return 0;
-	}
-}	
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail5.java
deleted file mode 100644
index d55f27e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail5.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//9, 16 -> 9, 25   AllowLoadtime == true
-package p;
-
-class S {
-	public int f2() {
-		return 1;	
-	}
-	void f(){
-		int i= this.f2();	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail6.java
deleted file mode 100644
index 0e12a9c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail6.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//11, 20 -> 11, 24   AllowLoadtime == true
-package p;
-class R {
-	int rF() {
-		return 1;
-	}
-	
-	
-	static class S extends R {
-		int f(){
-			int t= rF();
-			return t * t;
-		}	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail7.java
deleted file mode 100644
index 836f07d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/cannotExtract/A_testFail7.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//11, 20 -> 11, 34   AllowLoadtime == true
-package p;
-
-class R {
-	int rF() {
-		return 1;
-	}
-	
-	static class S extends R {
-		void foo() {
-			int u= super.rF() + 1;	
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessFromGetterName0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessFromGetterName0.java
deleted file mode 100644
index 34aa9cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessFromGetterName0.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	void foo() {
-		String s= getFooBar();//expected FOO_BAR
-	}
-	static String getFooBar() {
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessFromGetterName1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessFromGetterName1.java
deleted file mode 100644
index e4fadd8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessFromGetterName1.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	void foo() {
-		boolean isfb= isFooBar();//expected FOO_BAR
-	}
-	static boolean isFooBar() {
-		return false;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessStringLiteral0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessStringLiteral0.java
deleted file mode 100644
index 421fc6e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessStringLiteral0.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void foo() {
-		String s= "Foo.HashMap";//expected FOO_HASHMAP
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessStringLiteral1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessStringLiteral1.java
deleted file mode 100644
index 03eb775..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractConstant/nameGuessing/testGuessStringLiteral1.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void foo() {
-		String s= "Foo/Hash+Map";//expected FOO_HASH_MAP
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test/in/A.java
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test/in/A.java
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test/out/A.java
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test/out/A.java
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/in/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/out/A.java
deleted file mode 100644
index e773ba6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A implements I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test0/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/in/A.java
deleted file mode 100644
index dd87960..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/out/A.java
deleted file mode 100644
index 8a36a2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test1/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/in/A.java
deleted file mode 100644
index 6641992..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	public final void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/out/A.java
deleted file mode 100644
index eb1b77e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public final void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test10/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/in/A.java
deleted file mode 100644
index 2b34eb5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-abstract class A{
-	abstract public void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/out/A.java
deleted file mode 100644
index b29a790..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-abstract class A implements I{
-	abstract public void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test11/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/in/A.java
deleted file mode 100644
index 5e21e43..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	public void m(){}
-	private void f(){
-		A a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/out/A.java
deleted file mode 100644
index 41cb3cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A implements I{
-	public void m(){}
-	private void f(){
-		I a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test12/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/in/A.java
deleted file mode 100644
index 12e1ef3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A extends Object implements Cloneable{
-	public void m(){
-	}
-	protected Object clone() throws CloneNotSupportedException {
-		return super.clone();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/out/A.java
deleted file mode 100644
index be2224a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A extends Object implements Cloneable, I{
-	public void m(){
-	}
-	protected Object clone() throws CloneNotSupportedException {
-		return super.clone();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test13/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/in/A.java
deleted file mode 100644
index 5a5dfce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	public void m(){}
-	void f(){
-		A a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/out/A.java
deleted file mode 100644
index a4a2709..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	void f(){
-		I a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test14/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/in/A.java
deleted file mode 100644
index 5a5e889..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/out/A.java
deleted file mode 100644
index 857dece..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		I a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/out/I.java
deleted file mode 100644
index 6529d15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test15/out/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-	public abstract void m1();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/in/A.java
deleted file mode 100644
index 25c6492..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/out/A.java
deleted file mode 100644
index 2a08fb9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		I a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test16/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/in/A.java
deleted file mode 100644
index f8b6018..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/out/A.java
deleted file mode 100644
index 1e3a413..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test17/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/in/A.java
deleted file mode 100644
index ef848e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-		a.m();
-
-		A a1= new A();
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/out/A.java
deleted file mode 100644
index f175b95..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		I a= new A();
-		a.m();
-
-		A a1= new A();
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test18/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/in/A.java
deleted file mode 100644
index 465ce7d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A(), a1 = new A();
-		a.m();
-
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/out/A.java
deleted file mode 100644
index 66eebc6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A(), a1 = new A();
-		a.m();
-
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test19/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/in/A.java
deleted file mode 100644
index 8cde1c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.List;
-
-class A{
-	public List m(){return null;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/out/A.java
deleted file mode 100644
index b0e0bdf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.List;
-
-class A implements I{
-	public List m(){return null;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/out/I.java
deleted file mode 100644
index a6a02f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test2/out/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-import java.util.List;
-
-/** typecomment template*/
-interface I {
-	public abstract List m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/in/A.java
deleted file mode 100644
index 465ce7d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A(), a1 = new A();
-		a.m();
-
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/out/A.java
deleted file mode 100644
index f92f6a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		I a= new A(), a1 = new A();
-		a.m();
-
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/out/I.java
deleted file mode 100644
index 6529d15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test20/out/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-	public abstract void m1();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/in/A.java
deleted file mode 100644
index 097d162..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A extends Exception {
-	public void m() {}
-	void e() throws A{}
-	void g() {
-		try{
-			e();
-		} catch (A a){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/out/A.java
deleted file mode 100644
index e5b9c3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A extends Exception implements I {
-	public void m() {}
-	void e() throws A{}
-	void g() {
-		try{
-			e();
-		} catch (A a){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/out/I.java
deleted file mode 100644
index 0881aa0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test21/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/in/A.java
deleted file mode 100644
index ccfb484..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	Class g() {
-		return A.class;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/out/A.java
deleted file mode 100644
index b0fcab7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	Class g() {
-		return A.class;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test22/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/in/A.java
deleted file mode 100644
index 6a11d58..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	void g() {
-		A a= (A)new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/out/A.java
deleted file mode 100644
index fe659e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	void g() {
-		I a= (I)new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test23/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/in/A.java
deleted file mode 100644
index b62808f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		A a= (A)new A();
-		((A)this).m1();
-		((A)this).m();
-		(((A)this)).m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/out/A.java
deleted file mode 100644
index 2af8159..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		I a= (I)new A();
-		((A)this).m1();
-		((I)this).m();
-		(((I)this)).m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test24/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/in/A.java
deleted file mode 100644
index e68557f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	protected A g() {
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/out/A.java
deleted file mode 100644
index 689cc1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	protected I g() {
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test25/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/in/A.java
deleted file mode 100644
index b1a453c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		g().m();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/out/A.java
deleted file mode 100644
index 9bb324d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected I g() {
-		g().m();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test26/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/in/A.java
deleted file mode 100644
index 5b3c42a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		g().m1();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/out/A.java
deleted file mode 100644
index 75151ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		g().m1();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test27/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/in/A.java
deleted file mode 100644
index 034048d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		return this;	
-	}
-}
-class A1 extends A{
-	protected A g() {
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/out/A.java
deleted file mode 100644
index ea612d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected I g() {
-		return this;	
-	}
-}
-class A1 extends A{
-	protected I g() {
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test28/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/in/A.java
deleted file mode 100644
index e35e769..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		return this;	
-	}
-}
-class A1 extends A{
-	protected A g() {
-		g().m1();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/out/A.java
deleted file mode 100644
index 2792500..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		return this;	
-	}
-}
-class A1 extends A{
-	protected A g() {
-		g().m1();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test29/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/in/A.java
deleted file mode 100644
index 8dc8224..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class A{
-	public void m(){
-		List list= new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/out/A.java
deleted file mode 100644
index c598efa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class A implements I{
-	public void m(){
-		List list= new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test3/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/in/A.java
deleted file mode 100644
index bd95d6d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	A f(A a){
-		f(a).m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/out/A.java
deleted file mode 100644
index 10362fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	A f(A a){
-		f(a).m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test30/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/in/A.java
deleted file mode 100644
index ac7516b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	A f(A a){
-		f(a).m();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/out/A.java
deleted file mode 100644
index 0cfc234..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((I)this);
-	}
-	I f(I a){
-		f(a).m();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test31/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/in/A.java
deleted file mode 100644
index 73697dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/out/A.java
deleted file mode 100644
index 2424bbd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		I a1= a0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test32/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/in/A.java
deleted file mode 100644
index dafae2d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/out/A.java
deleted file mode 100644
index a7373d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test33/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/in/A.java
deleted file mode 100644
index 77c79e4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		a1.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/out/A.java
deleted file mode 100644
index 32d25a1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		I a1= a0;
-		a1.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test34/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/in/A.java
deleted file mode 100644
index a374646..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/out/A.java
deleted file mode 100644
index 82243b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test35/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/in/A.java
deleted file mode 100644
index c8eae54..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		f(a0);
-	}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/out/A.java
deleted file mode 100644
index 416a922..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		f(a0);
-	}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test36/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/in/A.java
deleted file mode 100644
index 7b8503c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		f(a0);
-	}
-	void f(A a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/out/A.java
deleted file mode 100644
index 1070412..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		f(a0);
-	}
-	void f(I a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test37/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/in/A.java
deleted file mode 100644
index 0577366..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		a1.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/out/A.java
deleted file mode 100644
index 93bff1c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		I a1;
-		a1= a0;
-		a1.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test38/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/in/A.java
deleted file mode 100644
index c59c6b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/out/A.java
deleted file mode 100644
index b9deeeb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test39/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/in/A.java
deleted file mode 100644
index 8ba1965..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements Cloneable{
-	public void m(){
-	}
-	protected Object clone() throws CloneNotSupportedException {
-		return super.clone();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/out/A.java
deleted file mode 100644
index 9304981..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements Cloneable, I{
-	public void m(){
-	}
-	protected Object clone() throws CloneNotSupportedException {
-		return super.clone();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test4/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/in/A.java
deleted file mode 100644
index 5af74a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a1;
-		a1= null;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/out/A.java
deleted file mode 100644
index 17596e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a1;
-		a1= null;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test40/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/in/A.java
deleted file mode 100644
index d51ccac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		A a2= a1;
-		a2.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/out/A.java
deleted file mode 100644
index 1af56bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		A a2= a1;
-		a2.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test41/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/in/A.java
deleted file mode 100644
index 640bb01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		A a2;
-		a2= a1;
-		a2.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/out/A.java
deleted file mode 100644
index 4172720..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		A a2;
-		a2= a1;
-		a2.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test42/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/in/A.java
deleted file mode 100644
index bd58ab2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		((A)a0).m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/out/A.java
deleted file mode 100644
index 4f1549d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		((I)a0).m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test43/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/in/A.java
deleted file mode 100644
index 6e991ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		((A)a0).m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/out/A.java
deleted file mode 100644
index e032247..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		((A)a0).m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test44/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/in/A.java
deleted file mode 100644
index 5638537..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/out/A.java
deleted file mode 100644
index fb1dd55..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test45/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/in/A.java
deleted file mode 100644
index 4a13bcf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void f(A a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/out/A.java
deleted file mode 100644
index 2a68a7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(I a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test46/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/in/A.java
deleted file mode 100644
index 2795284..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	A g() {
-		A a= new A();
-		g().m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/out/A.java
deleted file mode 100644
index 4b67e34..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	A g() {
-		A a= new A();
-		g().m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test47/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/in/A.java
deleted file mode 100644
index 4691f69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	A f(A a){
-		f(a).m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/out/A.java
deleted file mode 100644
index 28a0e57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	A f(A a){
-		f(a).m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test48/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/in/A.java
deleted file mode 100644
index a11f579..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/out/A.java
deleted file mode 100644
index dffad44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test49/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/in/A.java
deleted file mode 100644
index d5feb01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-class A{
-	public void m() throws IOException{
-		List list= new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/out/A.java
deleted file mode 100644
index 0be1335..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-class A implements I{
-	public void m() throws IOException{
-		List list= new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/out/I.java
deleted file mode 100644
index fec6102..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test5/out/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-import java.io.IOException;
-
-/** typecomment template*/
-interface I {
-	public abstract void m() throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/in/A.java
deleted file mode 100644
index 1393e6a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	A a;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/out/A.java
deleted file mode 100644
index 9e7aff4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	A a;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test50/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/in/A.java
deleted file mode 100644
index b8d3883..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	A a;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/out/A.java
deleted file mode 100644
index 5728437..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	I a;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test51/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/in/A.java
deleted file mode 100644
index 07f76ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	A fA;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= fA;
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/out/A.java
deleted file mode 100644
index 4aaa2cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	A fA;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= fA;
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test52/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/in/A.java
deleted file mode 100644
index 0c285d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	A fA;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= fA;
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/out/A.java
deleted file mode 100644
index f10dd01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	I fA;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		I a= fA;
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test53/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/in/A.java
deleted file mode 100644
index e507851..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	protected void f(A a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/in/A1.java
deleted file mode 100644
index 2d54186..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/in/A1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected void f(A a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/A.java
deleted file mode 100644
index e68d749..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected void f(I a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/A1.java
deleted file mode 100644
index 3eccac6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/A1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected void f(I a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test54/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/in/A.java
deleted file mode 100644
index e507851..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	protected void f(A a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/in/A1.java
deleted file mode 100644
index a4285b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/in/A1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/A.java
deleted file mode 100644
index bed1d04..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected void f(A a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/A1.java
deleted file mode 100644
index a4285b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/A1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test55/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/in/A.java
deleted file mode 100644
index dfb823c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/in/A1.java
deleted file mode 100644
index c6b716d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/in/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/A.java
deleted file mode 100644
index 2e5f384..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/A1.java
deleted file mode 100644
index c6b716d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test56/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/in/A.java
deleted file mode 100644
index a63fcbd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/in/A1.java
deleted file mode 100644
index d29e8f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/in/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/A.java
deleted file mode 100644
index 1391097..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected I f(){
-		return this;
-	}
-	void test(){
-		f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/A1.java
deleted file mode 100644
index 2de0edc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected I f(){
-		return this;
-	}
-	void test(){
-		f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test57/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/in/A.java
deleted file mode 100644
index 6529744..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	int f;
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().f=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/out/A.java
deleted file mode 100644
index 4dd4223..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	int f;
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().f=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test58/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/in/A.java
deleted file mode 100644
index 71717be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import p.A;
-class A {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/out/A.java
deleted file mode 100644
index 709538d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import p.A;
-class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test59/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/in/A.java
deleted file mode 100644
index 075d6ae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A{
-	public List m(Set set) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/out/A.java
deleted file mode 100644
index 7514b5e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/out/I.java
deleted file mode 100644
index df6e9a1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test6/out/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-/** typecomment template*/
-interface I {
-	List m(Set set) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/in/A.java
deleted file mode 100644
index a45dd6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	public static void s() {}
-	void t(){
-		A.s();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/out/A.java
deleted file mode 100644
index ba23032..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	public static void s() {}
-	void t(){
-		A.s();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test60/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/in/A.java
deleted file mode 100644
index 373a7ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	public static int s= 0;
-	void t(){
-		A.s= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/out/A.java
deleted file mode 100644
index c16b697..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	public static int s= 0;
-	void t(){
-		A.s= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test61/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/in/A.java
deleted file mode 100644
index 1b847e9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void t(){
-		new A(){
-			void g(){
-				A.this.m1();
-			}
-		};	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/out/A.java
deleted file mode 100644
index d2a5048..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void t(){
-		new A(){
-			void g(){
-				A.this.m1();
-			}
-		};	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test62/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/in/A.java
deleted file mode 100644
index a2b831a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void t(){
-		new A(){
-			void g() throws InterruptedException{
-				A.super.wait();
-			}
-		};	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/out/A.java
deleted file mode 100644
index 98bff3d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void t(){
-		new A(){
-			void g() throws InterruptedException{
-				A.super.wait();
-			}
-		};	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test63/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/in/A.java
deleted file mode 100644
index 227d1d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void f(Inter i){
-		A a= new A();
-		i.work(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/in/Inter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/in/Inter.java
deleted file mode 100644
index 06fa9e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/in/Inter.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-public interface Inter {
-	void work(A a);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/A.java
deleted file mode 100644
index 6eea703..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(Inter i){
-		I a= new A();
-		i.work(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/Inter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/Inter.java
deleted file mode 100644
index 505676f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test64/out/Inter.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-public interface Inter {
-	void work(I a);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/in/A.java
deleted file mode 100644
index ef34364..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= create();
-		a.m1();
-	}
-	A create(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/out/A.java
deleted file mode 100644
index 35d13b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= create();
-		a.m1();
-	}
-	A create(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test65/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/in/A.java
deleted file mode 100644
index 5be3103..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= create();
-		a.m();
-	}
-	A create(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/out/A.java
deleted file mode 100644
index 5cc489b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(){
-		I a= create();
-		a.m();
-	}
-	I create(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test66/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/A.java
deleted file mode 100644
index a374646..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/Inter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/Inter.java
deleted file mode 100644
index 147dd9a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/Inter.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface Inter {
-	void work(A a);
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/Outer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/Outer.java
deleted file mode 100644
index e09d286..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/in/Outer.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-public class Outer{
-	public static class Implementor implements Inter{	
-		public void work(A a) {}
-	}
-	Implementor implementor;
-	void f(){
-		A a= new A();
-		implementor.work(a);
-	}
-}	
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/A.java
deleted file mode 100644
index 82243b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/Inter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/Inter.java
deleted file mode 100644
index a6b6364..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/Inter.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface Inter {
-	void work(I a);
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/Outer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/Outer.java
deleted file mode 100644
index 3c1a5ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test67/out/Outer.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-public class Outer{
-	public static class Implementor implements Inter{	
-		public void work(I a) {}
-	}
-	Implementor implementor;
-	void f(){
-		I a= new A();
-		implementor.work(a);
-	}
-}	
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/in/A.java
deleted file mode 100644
index 4f1f8c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	static A getA(){
-		return null;
-	}
-	public void m(){}
-	public void m1(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/in/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/in/As.java
deleted file mode 100644
index 5aa68d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/in/As.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		A a= A.getA();
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/A.java
deleted file mode 100644
index 61b7b47..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-	static A getA(){
-		return null;
-	}
-	public void m(){}
-	public void m1(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/As.java
deleted file mode 100644
index 5aa68d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/As.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		A a= A.getA();
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test68/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/in/A.java
deleted file mode 100644
index 4f1f8c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	static A getA(){
-		return null;
-	}
-	public void m(){}
-	public void m1(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/in/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/in/As.java
deleted file mode 100644
index 156c195..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/in/As.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		A a= A.getA();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/A.java
deleted file mode 100644
index be71c7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-	static I getA(){
-		return null;
-	}
-	public void m(){}
-	public void m1(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/As.java
deleted file mode 100644
index 5dfb4a2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/As.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		I a= A.getA();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/I.java
deleted file mode 100644
index 2d11b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test69/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/in/A.java
deleted file mode 100644
index 4120bb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A{
-	public List m(Set set, Set set1) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/out/A.java
deleted file mode 100644
index ab8e79e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set, Set set1) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/out/I.java
deleted file mode 100644
index 6729aef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test7/out/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.Set;
-import java.util.List;
-/** typecomment template*/
-interface I {
-	List m(Set set, Set set1) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/in/A.java
deleted file mode 100644
index 8dc037d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/out/A.java
deleted file mode 100644
index 7795837..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/out/I.java
deleted file mode 100644
index c154072..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test70/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/in/A.java
deleted file mode 100644
index 8dc037d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/in/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/in/As.java
deleted file mode 100644
index e0c24ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/in/As.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		A a= new A();
-		if (a instanceof A){
-		} else {
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/A.java
deleted file mode 100644
index 7795837..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/As.java
deleted file mode 100644
index 2c3680f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/As.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		I a= new A();
-		if (a instanceof I){
-		} else {
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/I.java
deleted file mode 100644
index c154072..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test71/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/in/A.java
deleted file mode 100644
index 90fe4bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-    public void m(A foo) {
-        foo.m(foo);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/in/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/in/As.java
deleted file mode 100644
index b19dc18..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/in/As.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class As {
-    void r(A foo) {
-        A local= null;
-        foo.m(local);
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/A.java
deleted file mode 100644
index 77fc769..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A implements I {
-    public void m(I foo) {
-        foo.m(foo);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/As.java
deleted file mode 100644
index a18bf9a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/As.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class As {
-    void r(I foo) {
-        I local= null;
-        foo.m(local);
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/I.java
deleted file mode 100644
index eb5999a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test72/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m(I foo);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/A.java
deleted file mode 100644
index 4909214..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-public class A implements OldInterface{
-  public int amount(){ return 1;}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/B.java
deleted file mode 100644
index a04ba1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class B implements OldInterface{
-	private void s(){
-		OldInterface i= find();
-	}
-	private A find(){
-		return new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/OldInterface.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/OldInterface.java
deleted file mode 100644
index f140f1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/in/OldInterface.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface OldInterface {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/A.java
deleted file mode 100644
index fbd4aed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-public class A implements OldInterface, I{
-  public int amount(){ return 1;}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/B.java
deleted file mode 100644
index a04ba1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class B implements OldInterface{
-	private void s(){
-		OldInterface i= find();
-	}
-	private A find(){
-		return new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/I.java
deleted file mode 100644
index 6225f07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	public abstract int amount();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/OldInterface.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/OldInterface.java
deleted file mode 100644
index f140f1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test73/out/OldInterface.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface OldInterface {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/A.java
deleted file mode 100644
index 4909214..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-public class A implements OldInterface{
-  public int amount(){ return 1;}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/B.java
deleted file mode 100644
index bdacf80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-public class B implements OldInterface{
-	private void s(){
-		OldInterface i;
-		i= find();
-	}
-	private A find(){
-		return new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/OldInterface.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/OldInterface.java
deleted file mode 100644
index f140f1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/in/OldInterface.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface OldInterface {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/A.java
deleted file mode 100644
index fbd4aed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-public class A implements OldInterface, I{
-  public int amount(){ return 1;}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/B.java
deleted file mode 100644
index bdacf80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-public class B implements OldInterface{
-	private void s(){
-		OldInterface i;
-		i= find();
-	}
-	private A find(){
-		return new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/I.java
deleted file mode 100644
index 6225f07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	public abstract int amount();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/OldInterface.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/OldInterface.java
deleted file mode 100644
index f140f1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test74/out/OldInterface.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface OldInterface {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/A.java
deleted file mode 100644
index 535c1d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A {
-  public int amount(){ return 1;}
-  public void add(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/B.java
deleted file mode 100644
index cdad777..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class B {
-	B(int t, A a){
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/C.java
deleted file mode 100644
index 399856f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/in/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-public class C {
-	A fA;
-	void f(){
-		B b= new B(2, fA);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/A.java
deleted file mode 100644
index 910b1ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A implements I {
-  public int amount(){ return 1;}
-  public void add(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/B.java
deleted file mode 100644
index 53bece1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class B {
-	B(int t, I a){
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/C.java
deleted file mode 100644
index 623defa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-public class C {
-	I fA;
-	void f(){
-		B b= new B(2, fA);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/I.java
deleted file mode 100644
index 6225f07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test75/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	public abstract int amount();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/A.java
deleted file mode 100644
index 535c1d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A {
-  public int amount(){ return 1;}
-  public void add(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/B.java
deleted file mode 100644
index d07a15d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class B {
-	B(int t, A a){
-		a.add();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/C.java
deleted file mode 100644
index 399856f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/in/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-public class C {
-	A fA;
-	void f(){
-		B b= new B(2, fA);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/A.java
deleted file mode 100644
index 910b1ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A implements I {
-  public int amount(){ return 1;}
-  public void add(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/B.java
deleted file mode 100644
index d07a15d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class B {
-	B(int t, A a){
-		a.add();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/C.java
deleted file mode 100644
index 399856f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-public class C {
-	A fA;
-	void f(){
-		B b= new B(2, fA);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/I.java
deleted file mode 100644
index 6225f07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test76/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	public abstract int amount();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/in/A.java
deleted file mode 100644
index 23ebd6d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A {
-	class Inner {
-	  public int amount(){ return 1;}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/in/B.java
deleted file mode 100644
index 831a28b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class B {
-	B(int t, A.Inner a){
-		a.amount();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/A.java
deleted file mode 100644
index 1278dd9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A {
-	class Inner implements I {
-	  public int amount(){ return 1;}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/B.java
deleted file mode 100644
index 7c02a24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class B {
-	B(int t, I a){
-		a.amount();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/I.java
deleted file mode 100644
index 98b5d6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test77/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract int amount();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/in/A.java
deleted file mode 100644
index 249d15e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-    public A m(A foo) {
-        foo.m(foo);
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/out/A.java
deleted file mode 100644
index 8de951a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A implements I {
-    public I m(I foo) {
-        foo.m(foo);
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/out/I.java
deleted file mode 100644
index af9c5f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test78/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract I m(I foo);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/in/A.java
deleted file mode 100644
index 8a60a2a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-    public A getFoo() {
-        return null;
-    }
-    public void foo(A foo) {
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/out/A.java
deleted file mode 100644
index b0e08bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-    public I getFoo() {
-        return null;
-    }
-    public void foo(I foo) {
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/out/I.java
deleted file mode 100644
index c6db642..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test79/out/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract I getFoo();
-	public abstract void foo(I foo);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/in/A.java
deleted file mode 100644
index 391f87d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A{
-	public List m(Set set, String string) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/out/A.java
deleted file mode 100644
index f105f3a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set, String string) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/out/I.java
deleted file mode 100644
index 31f4af7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test8/out/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-/** typecomment template*/
-interface I {
-	List m(Set set, String string) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/in/A.java
deleted file mode 100644
index b5e6427..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/in/A.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package p;
-
-public class A {
-	/**
-	 * comment f
-	 */
-	public void f(){
-	} 
-
-	/** comment fz*/
-	public void fz(){
-	} 
-
-	/**
-	 * comment f1
-	 */
-	public void f1(){
-	} 
-
-	/** comment f1z*/
-	public void f1z(){
-	} 
-
-	//comment f11
-	public void f11(){
-	}
-
-	public void f2(){
-	}
-	
-	/** 
-	 * jdoc I1
-	 */
-	public static final int I1= 0;
-
-	/** jdoc I1z*/
-	public static final int I1z= 0;
-
-	/** 
-	 * comI2
-	 */
-	public static final int I2= 0;
-
-	/** com I2z*/
-	public static final int I2z= 0;
-
-	//comment I3
-	public static final int I3= 0;
-
-	public static final int I4= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/out/A.java
deleted file mode 100644
index d6c56cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/out/A.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package p;
-
-public class A implements I {
-	/**
-	 * comment f
-	 */
-	public void f(){
-	} 
-
-	/** comment fz*/
-	public void fz(){
-	} 
-
-	/**
-	 * comment f1
-	 */
-	public void f1(){
-	} 
-
-	/** comment f1z*/
-	public void f1z(){
-	} 
-
-	//comment f11
-	public void f11(){
-	}
-
-	public void f2(){
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/out/I.java
deleted file mode 100644
index f320f1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test80/out/I.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	/**
-	 * comment f
-	 */
-	public abstract void f();
-	/** comment fz*/
-	public abstract void fz();
-	/**
-	 * comment f1
-	 */
-	public abstract void f1();
-	/** comment f1z*/
-	public abstract void f1z();
-	//comment f11
-	public abstract void f11();
-	public abstract void f2();
-	/** 
-	 * jdoc I1
-	 */
-	public static final int I1= 0;
-
-	/** jdoc I1z*/
-	public static final int I1z= 0;
-
-	/** 
-	 * comI2
-	 */
-	public static final int I2= 0;
-
-	/** com I2z*/
-	public static final int I2z= 0;
-
-	//comment I3
-	public static final int I3= 0;
-
-	public static final int I4= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/in/A.java
deleted file mode 100644
index e2cb58a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A {
-	private int x;
-	private A[] v2= null; 
-	void f(A[] v){
-		A[] a= v;
-		a[0].x= 0;
-		A[] v1= null;
-		a= v1;
-		a= v2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/out/A.java
deleted file mode 100644
index 50afd04..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A implements I {
-	private int x;
-	private A[] v2= null; 
-	void f(A[] v){
-		A[] a= v;
-		a[0].x= 0;
-		A[] v1= null;
-		a= v1;
-		a= v2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test81/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/in/A.java
deleted file mode 100644
index 9998396..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	private int x;
-	void f(A[] v){
-		A[] a= v;
-		a[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/out/A.java
deleted file mode 100644
index 28e3dc3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-	private int x;
-	void f(A[] v){
-		A[] a= v;
-		a[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test82/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/in/A.java
deleted file mode 100644
index 5a3af0b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	private int x;
-	void f(A[] v){
-		A[] a= v;
-		g(a);
-	}
-	void g(A[] x){
-		x[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/out/A.java
deleted file mode 100644
index f470b9f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A implements I {
-	private int x;
-	void f(A[] v){
-		A[] a= v;
-		g(a);
-	}
-	void g(A[] x){
-		x[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test83/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/in/A.java
deleted file mode 100644
index c198bd9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	int x;
-}
-class B {
-	A f(){
-		A a= null;
-		return (a);	
-	}
-	void x(){
-		f().x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/out/A.java
deleted file mode 100644
index 8dea002..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A implements I{
-	int x;
-}
-class B {
-	A f(){
-		A a= null;
-		return (a);	
-	}
-	void x(){
-		f().x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test84/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/in/A.java
deleted file mode 100644
index c55a5d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class T{
-	A[] cs;
-	void add(A c){
-		cs[0]= c;
-	}
-	void f(){
-		cs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/out/A.java
deleted file mode 100644
index a76fdcd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class T{
-	A[] cs;
-	void add(A c){
-		cs[0]= c;
-	}
-	void f(){
-		cs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test85/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/in/A.java
deleted file mode 100644
index c38d60a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class Y{
-	A[] cs;
-	void add(A c){
-		cs[0]= c;
-	}
-	void f(){
-		cs[0].x= 0;
-	}
-	void foo(){
-		A[] tab= null;
-		add(tab[0]);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/out/A.java
deleted file mode 100644
index d288692..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class Y{
-	A[] cs;
-	void add(A c){
-		cs[0]= c;
-	}
-	void f(){
-		cs[0].x= 0;
-	}
-	void foo(){
-		A[] tab= null;
-		add(tab[0]);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test86/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/in/A.java
deleted file mode 100644
index 58ba48d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	void add(A c){
-		new A[]{null}[0]= c;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/out/A.java
deleted file mode 100644
index be66523..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	void add(I c){
-		new I[]{null}[0]= c;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test87/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/in/A.java
deleted file mode 100644
index 30f5356..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	A[] cs;
-	void add(A c){
-		(cs= cs)[0]= c;
-		cs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/out/A.java
deleted file mode 100644
index ea14737..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	A[] cs;
-	void add(A c){
-		(cs= cs)[0]= c;
-		cs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test88/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/in/A.java
deleted file mode 100644
index befe09b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	A[] cs;
-	void add(A c){
-		((3 > 4) ? cs: cs)[0]= c;
-		cs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/out/A.java
deleted file mode 100644
index 7887c32..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	A[] cs;
-	void add(A c){
-		((3 > 4) ? cs: cs)[0]= c;
-		cs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test89/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/in/A.java
deleted file mode 100644
index 8dd8734..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	public void m(int i, boolean b, short s, char c, long l, double d){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/out/A.java
deleted file mode 100644
index 44f67ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public void m(int i, boolean b, short s, char c, long l, double d){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/out/I.java
deleted file mode 100644
index 873c79f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test9/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void m(int i, boolean b, short s, char c, long l, double d);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/in/A.java
deleted file mode 100644
index 082c5c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/in/A.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	void add(A c){
-		gm()[0]= c;
-		
-		gm1()[0]= c;
-		gm1()[0].x= 0;
-	}
-	A[] gm() {
-		return null;
-	}
-	A[] gm1() {
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/out/A.java
deleted file mode 100644
index a5ecb03..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/out/A.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	void add(A c){
-		gm()[0]= c;
-		
-		gm1()[0]= c;
-		gm1()[0].x= 0;
-	}
-	I[] gm() {
-		return null;
-	}
-	A[] gm1() {
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test90/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/in/A.java
deleted file mode 100644
index e30a0ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	static A[] scs;
-	void add(A c){
-		p.T.scs[0]= c;
-		p.T.scs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/out/A.java
deleted file mode 100644
index 5c9a871..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	static A[] scs;
-	void add(A c){
-		p.T.scs[0]= c;
-		p.T.scs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test91/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/in/A.java
deleted file mode 100644
index 8140b37..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	A[] cs;
-	void add(A c){
-		(cs)[0]= c;
-		cs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/out/A.java
deleted file mode 100644
index 9b94fae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class ST{
-}
-class T extends ST{
-	A[] cs;
-	void add(A c){
-		(cs)[0]= c;
-		cs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test92/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/in/A.java
deleted file mode 100644
index b936118..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class ST{
-	A[] supercs;
-}
-class T extends ST{
-	void add(A c){
-		super.supercs[0]= c;
-		super.supercs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/out/A.java
deleted file mode 100644
index 4bcd521..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class ST{
-	A[] supercs;
-}
-class T extends ST{
-	void add(A c){
-		super.supercs[0]= c;
-		super.supercs[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test93/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/in/A.java
deleted file mode 100644
index 919c0d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A {
-	int x;
-}
-class ST{
-	 A[] gm() {
-		return null;
-	}
-}
-class T extends ST{
-	void add(A c){
-		super.gm()[0]= c;
-		super.gm()[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/out/A.java
deleted file mode 100644
index 52e4ed8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A implements I {
-	int x;
-}
-class ST{
-	 A[] gm() {
-		return null;
-	}
-}
-class T extends ST{
-	void add(A c){
-		super.gm()[0]= c;
-		super.gm()[0].x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test94/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/in/A.java
deleted file mode 100644
index d12f48e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-	String x[]= {""};
-	A a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/out/A.java
deleted file mode 100644
index 2fe5c11..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A implements I {
-	String x[]= {""};
-	I a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test95/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/in/A.java
deleted file mode 100644
index 8e3ee8d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-	String[] x[]= {{""}, {}};
-	A a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/out/A.java
deleted file mode 100644
index 6491918..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A implements I {
-	String[] x[]= {{""}, {}};
-	I a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test96/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/in/A.java
deleted file mode 100644
index 2f12402..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-public class A {
-	public int foo() {
-		return 0;
-	}
-}
-
-class Tester {
-	void bar() {
-		A t= null;
-		int i= t.foo();
-		t.hashCode();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/out/A.java
deleted file mode 100644
index 57bcc12..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-public class A implements I {
-	public int foo() {
-		return 0;
-	}
-}
-
-class Tester {
-	void bar() {
-		I t= null;
-		int i= t.foo();
-		t.hashCode();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/out/I.java
deleted file mode 100644
index 5cc02cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test97/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	public abstract int foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/in/Bar.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/in/Bar.java
deleted file mode 100644
index fc032f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/in/Bar.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-public class Bar {
-
-  private Foo foo;
-  
-  public Foo getFoo() {
-	return foo;
-  }
-
-  public void setFoo(Foo foo) {
-	this.foo = foo;
-  }
-
-  public void useFoo() {
-	foo.foo();
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/in/Foo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/in/Foo.java
deleted file mode 100644
index b9a6a1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/in/Foo.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class Foo {
-  public void foo() {
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/Bar.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/Bar.java
deleted file mode 100644
index 0add8fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/Bar.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-public class Bar {
-
-  private IFoo foo;
-  
-  public IFoo getFoo() {
-	return foo;
-  }
-
-  public void setFoo(IFoo foo) {
-	this.foo = foo;
-  }
-
-  public void useFoo() {
-	foo.foo();
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/Foo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/Foo.java
deleted file mode 100644
index 6fe8417..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/Foo.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class Foo implements IFoo {
-  public void foo() {
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/IFoo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/IFoo.java
deleted file mode 100644
index ab2ea42..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/test98/out/IFoo.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface IFoo {
-	public abstract void foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/in/A.java
deleted file mode 100644
index 2e0193a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	public static final int X= 0;
-}
-class Test{
-	void f(A a){
-		int i= a.X;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/out/A.java
deleted file mode 100644
index cebf70c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-}
-class Test{
-	void f(I a){
-		int i= a.X;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/out/I.java
deleted file mode 100644
index c6bb871..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant80/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/in/A.java
deleted file mode 100644
index ccd75f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	public static final int X= 0;
-}
-class Test{
-	void f(){
-		int i= A.X;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/out/A.java
deleted file mode 100644
index 8d0c9cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-}
-class Test{
-	void f(){
-		int i= I.X;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/out/I.java
deleted file mode 100644
index c6bb871..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant81/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/in/A.java
deleted file mode 100644
index 1fa8e13..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	public static final int X= 0;
-	public static final int Y= 0;
-}
-class Test{
-	void f(){
-		int i= A.X;
-		i= A.Y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/out/A.java
deleted file mode 100644
index 4db9edd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A implements I {
-	public static final int Y= 0;
-}
-class Test{
-	void f(){
-		int i= I.X;
-		i= A.Y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/out/I.java
deleted file mode 100644
index c6bb871..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant82/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/in/A.java
deleted file mode 100644
index 35145b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	public static final int X= 0;
-	public static final int Y= 0;
-}
-class Test{
-	void f(A a){
-		int i= a.X;
-		i= a.Y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/out/A.java
deleted file mode 100644
index b6ef13d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A implements I {
-	public static final int Y= 0;
-}
-class Test{
-	void f(A a){
-		int i= a.X;
-		i= a.Y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/out/I.java
deleted file mode 100644
index c6bb871..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant83/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/in/A.java
deleted file mode 100644
index 82caf1c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/in/A.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package p;
-class A {
-	public static final int Y= 0;
-	public static final int X= 0;
-}
-class Test{
-	void f(){
-		A a= null;
-		int i= a.X;
-		u(a);
-
-		A a1= null;
-		int i1= a.X;
-		u1(a1);
-	}
-	void u(A a){
-		int u= a.X;
-	}
-	void u1(A a){
-		int u= a.Y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/out/A.java
deleted file mode 100644
index 74633ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/out/A.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-class A implements I {
-	public static final int Y= 0;
-}
-class Test{
-	void f(){
-		I a= null;
-		int i= a.X;
-		u(a);
-
-		A a1= null;
-		int i1= a.X;
-		u1(a1);
-	}
-	void u(I a){
-		int u= a.X;
-	}
-	void u1(A a){
-		int u= a.Y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/out/I.java
deleted file mode 100644
index c6bb871..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant84/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/in/A.java
deleted file mode 100644
index 6a6d112..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-
-class A extends ArrayList{
-	public static final int X= 0;
-}
-class Test{
-	void f(A a){
-		x(a);
-	}
-	void x(ArrayList o){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/out/A.java
deleted file mode 100644
index db15ce3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-
-class A extends ArrayList implements I{
-}
-class Test{
-	void f(A a){
-		x(a);
-	}
-	void x(ArrayList o){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/out/I.java
deleted file mode 100644
index c6bb871..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant85/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/in/A.java
deleted file mode 100644
index 12c8052..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	public static final int X= 0; /*constant comment*/
-
-	public static final int Y= 0; //constant line comment
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/out/A.java
deleted file mode 100644
index 707deb5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A implements I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/out/I.java
deleted file mode 100644
index d5db6f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant86/out/I.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0; /*constant comment*/
-
-	public static final int Y= 0; //constant line comment
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/in/A.java
deleted file mode 100644
index 12c8052..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	public static final int X= 0; /*constant comment*/
-
-	public static final int Y= 0; //constant line comment
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/out/A.java
deleted file mode 100644
index 707deb5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A implements I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/out/I.java
deleted file mode 100644
index d5db6f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant87/out/I.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0; /*constant comment*/
-
-	public static final int Y= 0; //constant line comment
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/in/A.java
deleted file mode 100644
index c0b0f53..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	public static final int X= 0;
-
-	public static final int Y= A.X + A.X;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/out/A.java
deleted file mode 100644
index 707deb5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A implements I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/out/I.java
deleted file mode 100644
index 758297c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testConstant88/out/I.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int X= 0;
-
-	public static final int Y= I.X + I.X;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail/in/A.java
deleted file mode 100644
index 6b249e3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-interface A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail0/in/A.java
deleted file mode 100644
index 6b249e3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail0/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-interface A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail1/in/A.java
deleted file mode 100644
index af50958..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testFail1/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{}
-interface I{}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/in/A.java
deleted file mode 100644
index 11361e5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/out/A.java
deleted file mode 100644
index 2e796c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface A extends I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface0/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/in/A.java
deleted file mode 100644
index 83e7e98..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A extends Cloneable{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/out/A.java
deleted file mode 100644
index 56853ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface A extends Cloneable, I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface1/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/in/A.java
deleted file mode 100644
index 1adef63..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-interface A{
-	public static final int i= 0;
-	int j= 1;
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/out/A.java
deleted file mode 100644
index 2e796c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface A extends I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/out/I.java
deleted file mode 100644
index 356c548..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface2/out/I.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public static final int i= 0;
-
-	int j= 1;
-
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/in/A.java
deleted file mode 100644
index d9a06e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/in/A.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package p;
-interface A{
-	/** method m javadoc comment */
-	void m();
-
-	/** field I javadoc comment */
-	int I= 9;
-
-	/* method m1 regular comment */
-	void m1();
-
-	/* field i1 regular comment */
-	int I1= 9;
-
-	// method m2 line comment
-	void m2();
-
-	// field i2 line comment
-	int I2= 9;
-
-	void m4(); /* method m4 regular comment */
-
-	int I4= 9; /* field i4 regular comment */
-
-	void m5(); // method m5 line comment
-
-	int I5= 9; // field i5 line comment
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/out/A.java
deleted file mode 100644
index 2e796c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface A extends I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/out/I.java
deleted file mode 100644
index 80242bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface3/out/I.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	/** method m javadoc comment */
-	void m();
-
-	/** field I javadoc comment */
-	int I= 9;
-
-	/* method m1 regular comment */
-	void m1();
-
-	/* field i1 regular comment */
-	int I1= 9;
-
-	// method m2 line comment
-	void m2();
-
-	// field i2 line comment
-	int I2= 9;
-
-	void m4(); /* method m4 regular comment */
-
-	int I4= 9; /* field i4 regular comment */
-
-	void m5(); // method m5 line comment
-
-	int I5= 9; // field i5 line comment
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/in/A.java
deleted file mode 100644
index dc11ee7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	A a(A a1, A a2);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/out/A.java
deleted file mode 100644
index 2e796c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface A extends I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/out/I.java
deleted file mode 100644
index 9ed2759..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface4/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	I a(I a1, I a2);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/in/A.java
deleted file mode 100644
index d01e517..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	A a();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/out/A.java
deleted file mode 100644
index 2e796c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface A extends I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/out/I.java
deleted file mode 100644
index eea1f32..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface5/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	I a();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/in/A.java
deleted file mode 100644
index 0aac8d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-interface A{
-	public abstract void foo0();
-	
-	abstract void foo1();
-	
-	public void foo2();	
-	
-	void foo3();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/out/A.java
deleted file mode 100644
index 2e796c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface A extends I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/out/I.java
deleted file mode 100644
index f9fbe86..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testInterface6/out/I.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	public abstract void foo0();
-
-	abstract void foo1();
-
-	public void foo2();
-
-	void foo3();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/in/A.java
deleted file mode 100644
index f8f8d57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/in/A.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package p;
-
-class A {
-	int size = 0;
-	Comparable[] elems = new Comparable[10];
-	public java.util.Iterator iterator() {
-		return new Iterator(this);
-	}
-	public A add(Comparable e) {
-		if (this.size + 1 == this.elems.length) {
-			Comparable[] newElems = new Comparable[2 * this.size];
-			System.arraycopy(this.elems, 0, newElems, 0, this.size);
-			this.elems = newElems;
-		}
-		this.elems[this.size++] = e;
-		return this;
-	}
-	public A addAll(A v1) {
-		java.util.Iterator i = v1.iterator();
-		for (; i.hasNext(); this.add((Comparable) i.next()));
-		return this;
-	}
-	public void sort() { /* insertion sort */
-		for (int i = 1; i < this.size; i++) {
-			Comparable e1 = this.elems[i];
-			int j = i;
-			while ((j > 0) && (this.elems[j - 1].compareTo(e1) > 0)) {
-				this.elems[j] = this.elems[j - 1];
-				j--;
-			}
-			this.elems[j] = e1;
-		}
-	}
-}
-class Iterator implements java.util.Iterator {
-	private int count = 0;
-	private A v2;
-	Iterator(A v3) {
-		this.v2 = v3;
-	}
-	public boolean hasNext() {
-		return this.count < this.v2.size;
-	}
-	public Object next() {
-		return this.v2.elems[this.count++];
-	}
-	public void remove() {
-		throw new UnsupportedOperationException();
-	}
-}
-class Client {
-	public static void main(String[] args) {
-		A v4 = createList();
-		populate(v4);
-		update(v4);
-		sortList(v4);
-		print(v4);
-	}
-	static A createList() {
-		return new A();
-	}
-	static void populate(A v5) {
-		v5.add("foo").add("bar");
-	}
-	static void update(A v6) {
-		A v7 = new A().add("zap").add("baz");
-		v6.addAll(v7);
-	}
-	static void sortList(A v8) {
-		v8.sort();
-	}
-	static void print(A v9) {
-		for (java.util.Iterator iter = v9.iterator(); iter.hasNext();)
-			System.out.println("Object: " + iter.next());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/out/A.java
deleted file mode 100644
index fd4e6df..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/out/A.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package p;
-
-class A implements Bag {
-	int size = 0;
-	Comparable[] elems = new Comparable[10];
-	public java.util.Iterator iterator() {
-		return new Iterator(this);
-	}
-	public Bag add(Comparable e) {
-		if (this.size + 1 == this.elems.length) {
-			Comparable[] newElems = new Comparable[2 * this.size];
-			System.arraycopy(this.elems, 0, newElems, 0, this.size);
-			this.elems = newElems;
-		}
-		this.elems[this.size++] = e;
-		return this;
-	}
-	public Bag addAll(Bag v1) {
-		java.util.Iterator i = v1.iterator();
-		for (; i.hasNext(); this.add((Comparable) i.next()));
-		return this;
-	}
-	public void sort() { /* insertion sort */
-		for (int i = 1; i < this.size; i++) {
-			Comparable e1 = this.elems[i];
-			int j = i;
-			while ((j > 0) && (this.elems[j - 1].compareTo(e1) > 0)) {
-				this.elems[j] = this.elems[j - 1];
-				j--;
-			}
-			this.elems[j] = e1;
-		}
-	}
-}
-class Iterator implements java.util.Iterator {
-	private int count = 0;
-	private A v2;
-	Iterator(A v3) {
-		this.v2 = v3;
-	}
-	public boolean hasNext() {
-		return this.count < this.v2.size;
-	}
-	public Object next() {
-		return this.v2.elems[this.count++];
-	}
-	public void remove() {
-		throw new UnsupportedOperationException();
-	}
-}
-class Client {
-	public static void main(String[] args) {
-		A v4 = createList();
-		populate(v4);
-		update(v4);
-		sortList(v4);
-		print(v4);
-	}
-	static A createList() {
-		return new A();
-	}
-	static void populate(Bag v5) {
-		v5.add("foo").add("bar");
-	}
-	static void update(Bag v6) {
-		Bag v7 = new A().add("zap").add("baz");
-		v6.addAll(v7);
-	}
-	static void sortList(A v8) {
-		v8.sort();
-	}
-	static void print(Bag v9) {
-		for (java.util.Iterator iter = v9.iterator(); iter.hasNext();)
-			System.out.println("Object: " + iter.next());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/out/Bag.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/out/Bag.java
deleted file mode 100644
index 4856a01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample0/out/Bag.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.Iterator;
-
-/** typecomment template*/
-interface Bag {
-	public abstract java.util.Iterator iterator();
-	public abstract Bag add(Comparable e);
-	public abstract Bag addAll(Bag v1);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/in/A.java
deleted file mode 100644
index 02d5d06..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/in/A.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package p;
-
-class A {
-	int size = 0;
-	Comparable[] elems = new Comparable[10];
-	public java.util.Iterator iterator() {
-		return new Iterator(this);
-	}
-	public A add(Comparable e) {
-		if (size + 1 == elems.length) {
-			Comparable[] newElems = new Comparable[2 * size];
-			System.arraycopy(elems, 0, newElems, 0, size);
-			elems = newElems;
-		}
-		elems[size++] = e;
-		return this;
-	}
-	public A addAll(A v1) {
-		java.util.Iterator i = v1.iterator();
-		for (; i.hasNext(); add((Comparable) i.next()));
-		return this;
-	}
-	public void sort() { /* insertion sort */
-		for (int i = 1; i < size; i++) {
-			Comparable e1 = elems[i];
-			int j = i;
-			while ((j > 0) && (elems[j - 1].compareTo(e1) > 0)) {
-				elems[j] = elems[j - 1];
-				j--;
-			}
-			elems[j] = e1;
-		}
-	}
-}
-class Iterator implements java.util.Iterator {
-	private int count = 0;
-	private A v2;
-	Iterator(A v3) {
-		v2 = v3;
-	}
-	public boolean hasNext() {
-		return count < v2.size;
-	}
-	public Object next() {
-		return v2.elems[count++];
-	}
-	public void remove() {
-		throw new UnsupportedOperationException();
-	}
-}
-class Client {
-	public static void main(String[] args) {
-		A v4 = createList();
-		populate(v4);
-		update(v4);
-		sortList(v4);
-		print(v4);
-	}
-	static A createList() {
-		return new A();
-	}
-	static void populate(A v5) {
-		v5.add("foo").add("bar");
-	}
-	static void update(A v6) {
-		A v7 = new A().add("zap").add("baz");
-		v6.addAll(v7);
-	}
-	static void sortList(A v8) {
-		v8.sort();
-	}
-	static void print(A v9) {
-		for (java.util.Iterator iter = v9.iterator(); iter.hasNext();)
-			System.out.println("Object: " + iter.next());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/out/A.java
deleted file mode 100644
index 386c09e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/out/A.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package p;
-
-class A implements Bag {
-	int size = 0;
-	Comparable[] elems = new Comparable[10];
-	public java.util.Iterator iterator() {
-		return new Iterator(this);
-	}
-	public Bag add(Comparable e) {
-		if (size + 1 == elems.length) {
-			Comparable[] newElems = new Comparable[2 * size];
-			System.arraycopy(elems, 0, newElems, 0, size);
-			elems = newElems;
-		}
-		elems[size++] = e;
-		return this;
-	}
-	public Bag addAll(Bag v1) {
-		java.util.Iterator i = v1.iterator();
-		for (; i.hasNext(); add((Comparable) i.next()));
-		return this;
-	}
-	public void sort() { /* insertion sort */
-		for (int i = 1; i < size; i++) {
-			Comparable e1 = elems[i];
-			int j = i;
-			while ((j > 0) && (elems[j - 1].compareTo(e1) > 0)) {
-				elems[j] = elems[j - 1];
-				j--;
-			}
-			elems[j] = e1;
-		}
-	}
-}
-class Iterator implements java.util.Iterator {
-	private int count = 0;
-	private A v2;
-	Iterator(A v3) {
-		v2 = v3;
-	}
-	public boolean hasNext() {
-		return count < v2.size;
-	}
-	public Object next() {
-		return v2.elems[count++];
-	}
-	public void remove() {
-		throw new UnsupportedOperationException();
-	}
-}
-class Client {
-	public static void main(String[] args) {
-		A v4 = createList();
-		populate(v4);
-		update(v4);
-		sortList(v4);
-		print(v4);
-	}
-	static A createList() {
-		return new A();
-	}
-	static void populate(Bag v5) {
-		v5.add("foo").add("bar");
-	}
-	static void update(Bag v6) {
-		Bag v7 = new A().add("zap").add("baz");
-		v6.addAll(v7);
-	}
-	static void sortList(A v8) {
-		v8.sort();
-	}
-	static void print(Bag v9) {
-		for (java.util.Iterator iter = v9.iterator(); iter.hasNext();)
-			System.out.println("Object: " + iter.next());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/out/Bag.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/out/Bag.java
deleted file mode 100644
index 4856a01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExample1/out/Bag.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.Iterator;
-
-/** typecomment template*/
-interface Bag {
-	public abstract java.util.Iterator iterator();
-	public abstract Bag add(Comparable e);
-	public abstract Bag addAll(Bag v1);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/in/A.java
deleted file mode 100644
index 5a77a02..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	int notExtracted= 0;
-	private A v2;
-	void f(A v3){
-		this.v2= v3;
-		this.v2.notExtracted= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/out/A.java
deleted file mode 100644
index 0f93cdc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements Bag {
-	int notExtracted= 0;
-	private A v2;
-	void f(A v3){
-		this.v2= v3;
-		this.v2.notExtracted= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/out/Bag.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/out/Bag.java
deleted file mode 100644
index 6e5fc34..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractInterface/testPaperExampleSimplified0/out/Bag.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface Bag {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/.cvsignore
deleted file mode 100644
index 9caf6f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.metadata
-bin
-*.class
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.classpath b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.classpath
deleted file mode 100644
index 5aeb3db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path=""/>
-    <classpathentry kind="var" path="JRE_LIB" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.cvsignore
deleted file mode 100644
index 4fdcfd7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-bin
-.classpath
-*.class
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.project b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.project
deleted file mode 100644
index c1e1775..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>ExtractMethodTests</name>
-	<comment></comment>
-	<projects>
-	</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/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/A.java
deleted file mode 100644
index d70a00b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-public class A{
-	public void foo() {
-		int i= 0;
-		int y= 0;
-		
-		int system= 0;
-		
-		System.out.println(i + y);
-
-		System.out.println("Dirk");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/A_test450.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/A_test450.java
deleted file mode 100644
index 3e31e3a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/A_test450.java
+++ /dev/null
@@ -1,10 +0,0 @@
-public class A_test450 {
-	public void foo() {
-		try {
-			/*]*/g();/*[*/
-		} catch (java.io.IOException e) {
-		}
-	}
-	public void g() throws java.io.IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/BBB.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/BBB.java
deleted file mode 100644
index 60e421a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/BBB.java
+++ /dev/null
@@ -1,46 +0,0 @@
-public class BBB {
-	public void foo() {
-		int i= 0;
-		BBB b= new BBB();
-		BBB[] bb= new BBB[10];
-		if (i == 0 && i == 10 && b instanceof BBB)
-			foo();
-		while(i++ == 10) {
-			foo();
-		}
-		i--;
-		
-		while(i++ == 10)
-			foo();
-		i--;
-		
-		do {
-		} while (i < 10);	
-		
-		for (int x= 0, o= 0; x < 10; x++, o++);
-		 {
-			foo();
-			int z;//= x;
-		}
-		
-		try {
-			foo();
-		} catch (Exception e) {
-		} finally {
-		}
-		
-		switch (i) {
-			case 10:
-				foo();
-			case 20:
-				foo();
-			default:
-				foo();
-		}
-	}
-	public int g() {
-		g();
-		return 1;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Bug_5690.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Bug_5690.java
deleted file mode 100644
index 559cf1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Bug_5690.java
+++ /dev/null
@@ -1,13 +0,0 @@
-public class Bug_5690 {
-	public void foo() {
-		Object runnable= null;
-		Object[] disposeList= null;
-		for (int i=0; i < disposeList.length; i++) {
-			if (disposeList [i] == null) {
-				disposeList [i] = runnable;
-				return;
-			}
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/C.java
deleted file mode 100644
index 5dbee96..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/C.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class C {
-	void f(){
-		C i= new /*[*/C/*]*/();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/D.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/D.java
deleted file mode 100644
index 35673b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/D.java
+++ /dev/null
@@ -1,29 +0,0 @@
-import java.io.IOException;
-import java.net.MalformedURLException;
-
-public class D {
-	public static class MyException extends Exception {
-	}
-	
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 10;
-		try {
-			try {
-				if (flag)
-					throw new IOException();
-				if (!flag)
-					throw new MyException();
-			} catch (IOException e) {
-			}
-			i= 10;
-		} catch (MyException e) {
-		}
-		read(i);
-	}
-
-	private void read(int i) {
-	}	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/E.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/E.java
deleted file mode 100644
index ad6960f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/E.java
+++ /dev/null
@@ -1,12 +0,0 @@
-public class E {
-	boolean flag;
-	public void foo() {
-		int i= 0;
-		if (flag) {
-			i= 1;
-		} else {
-			i= 2;
-		}
-		System.out.println(i);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/L.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/L.java
deleted file mode 100644
index 91d302c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/L.java
+++ /dev/null
@@ -1,20 +0,0 @@
-public class L {
-
-	public void foo() {
-		int x= 0;
-		
-		x++;
-		
-		// x= 10;
-		int y= x;
-	}
-	
-	public void g(int x) {
-	}
-	
-	public int bar() {
-		bar();
-		return 10;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/MyTest.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/MyTest.java
deleted file mode 100644
index 949aaa9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/MyTest.java
+++ /dev/null
@@ -1,8 +0,0 @@
-public class MyTest {
-  public void test() {
-    Object object = new Object() {
-      public void name() {
-      }
-    };
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Philippe.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Philippe.java
deleted file mode 100644
index f7df895..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Philippe.java
+++ /dev/null
@@ -1,13 +0,0 @@
-public class Philippe {
-	void foo(final int out){
-		String tab[] = /*START*/{"hello", "world" } /*END*/;       
-	}
-	
-	public void foo2(int i) {
-		String /*START*/str = "ggg"/*END*/;
-	}
-	
-	public void foo3() {
-		int i= 10, j= 30;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T10031.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T10031.java
deleted file mode 100644
index 5a65aed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T10031.java
+++ /dev/null
@@ -1,15 +0,0 @@
-public class T10031 {
-	private static Object fValue;
-	
-	public static void foo() {
-		setValue(null);
-	}
-
-	public static void setValue(Object value) {
-		fValue= value;
-	}
-
-	public static Object getValue() {
-		return fValue;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T10245.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T10245.java
deleted file mode 100644
index 9bd2ef6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T10245.java
+++ /dev/null
@@ -1,12 +0,0 @@
-public class T10245 {
-	T10245 f;
-	public T10245 a() {
-		a().f= a();
-		
-		/*[*/
-		int y= 0;
-		a().f= a(); /*[*/
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T11337.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T11337.java
deleted file mode 100644
index 8bbc782..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T11337.java
+++ /dev/null
@@ -1,6 +0,0 @@
-public class T11337 {
-	void f(byte bytes) {
-		String s= "k";
-		/*[*/System.out.println(s + " " + bytes); /*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T11337_1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T11337_1.java
deleted file mode 100644
index 2b17b7f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T11337_1.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class T11337_1 {
-	void f(byte bytes) {
-		/*[*/System.out.println(bytes); /*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T4165.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T4165.java
deleted file mode 100644
index c53aee0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T4165.java
+++ /dev/null
@@ -1,13 +0,0 @@
-public class T4165 {
-	void m(int i) {
-		for (;;) {
-			//---
-			if (i == 0)
-				continue;	
-			if (i != 5)	
-				continue;	
-			//---	
-		}
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T7368.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T7368.java
deleted file mode 100644
index a506c77..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T7368.java
+++ /dev/null
@@ -1,6 +0,0 @@
-public class T7368 {
-	public void foo() {
-		int f= (/*[*/2/*]*/);
-		// int u= new T7368[/*[*/1+ 3/*[*/].length;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T9815.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T9815.java
deleted file mode 100644
index c7e194e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/T9815.java
+++ /dev/null
@@ -1,10 +0,0 @@
-public class T9815 {
-	void f1() {
-		String j= ex();
-	}
-
-	String ex() {
-		return /*[*/"text"/*]*/;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Test.java
deleted file mode 100644
index 01c1179..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Test.java
+++ /dev/null
@@ -1,9 +0,0 @@
-public class Test {
-	public void foo() {
-		foo();
-		/* comment */int i= 0;/*[*/
-		// comment
-		/** comment */
-		foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Wcf.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Wcf.java
deleted file mode 100644
index 651c238..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Wcf.java
+++ /dev/null
@@ -1,13 +0,0 @@
-public class Wcf {
-	void hg(){
-		class A extends B {
-			void m(){
-				f();   //<<<<<<<<
-			}
-		}
-	}  
-}  
-
-class B {
-	void f(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/X.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/X.java
deleted file mode 100644
index c57bf9f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/X.java
+++ /dev/null
@@ -1,22 +0,0 @@
-public class X {
-	class Inner extends Exception {
-	}
-}
-class DD extends X.Inner {
-	DD() {
-		new X().super();
-	}
-	public final static boolean DEBUG= true;
-	public void foo0() {
-		try {
-			d();
-		} catch (X.Inner e) {
-		}
-	}
-
-	protected void d() throws X.Inner {
-		if (DEBUG)
-			throw new X().new Inner();//<<SELECT AND EXTRACT
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Z.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Z.java
deleted file mode 100644
index 167588f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/Z.java
+++ /dev/null
@@ -1,26 +0,0 @@
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-public abstract class Z {
-	public volatile boolean flag;
-	
-	public Object foo() throws NumberFormatException {
-		InputStreamReader in= null;
-		try {
-			bar();
-			return new Object();
-		} catch (IOException e) {
-			throw new NumberFormatException();
-		} finally {
-			if (in != null) {
-				try {
-					in.close();
-				} catch (IOException e) {
-				}
-			}
-		}
-	}
-	
-	public abstract void bar() throws IOException;
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test750.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test750.java
deleted file mode 100644
index 4c696e9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test750.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package branch_in;
-
-public class A_test750 {
-	public volatile boolean flag;
-
-	public void foo() {
-		/*[*/for (int i= 0; i < 10; i++) {
-			if (flag)
-				continue;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test751.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test751.java
deleted file mode 100644
index eefb9da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test751.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package branch_in;
-
-public class A_test751 {
-	public volatile boolean flag;
-
-	public void foo() {
-		/*[*/for (int i= 0; i < 10; i++) {
-			if (flag)
-				break;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test752.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test752.java
deleted file mode 100644
index f349591..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test752.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package branch_in;
-
-public class A_test752 {
-	public volatile boolean flag;
-
-	public void foo() {
-		/*[*/while (flag) {
-			if (flag)
-				continue;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test753.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test753.java
deleted file mode 100644
index f029505..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test753.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package branch_in;
-
-public class A_test753 {
-	public volatile boolean flag;
-
-	public void foo() {
-		/*[*/while (flag) {
-			if (flag)
-				break;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test754.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test754.java
deleted file mode 100644
index 7673402..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test754.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package branch_in;
-
-public class A_test754 {
-	public volatile boolean flag;
-
-	public void foo() {
-		/*[*/do {
-			if (flag)
-				continue;
-		} while (flag);/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test755.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test755.java
deleted file mode 100644
index 3de0c89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_in/A_test755.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package branch_in;
-
-public class A_test755 {
-	public volatile boolean flag;
-
-	public void foo() {
-		/*[*/do {
-			if (flag)
-				break;
-		} while (flag);/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test750.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test750.java
deleted file mode 100644
index c3b9ca3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test750.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package branch_out;
-
-public class A_test750 {
-	public volatile boolean flag;
-
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/for (int i= 0; i < 10; i++) {
-			if (flag)
-				continue;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test751.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test751.java
deleted file mode 100644
index b28abf6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test751.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package branch_out;
-
-public class A_test751 {
-	public volatile boolean flag;
-
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/for (int i= 0; i < 10; i++) {
-			if (flag)
-				break;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test752.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test752.java
deleted file mode 100644
index b2ec754..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test752.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package branch_out;
-
-public class A_test752 {
-	public volatile boolean flag;
-
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/while (flag) {
-			if (flag)
-				continue;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test753.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test753.java
deleted file mode 100644
index 13597d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test753.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package branch_out;
-
-public class A_test753 {
-	public volatile boolean flag;
-
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/while (flag) {
-			if (flag)
-				break;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test754.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test754.java
deleted file mode 100644
index 416e15e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test754.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package branch_out;
-
-public class A_test754 {
-	public volatile boolean flag;
-
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/do {
-			if (flag)
-				continue;
-		} while (flag);/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test755.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test755.java
deleted file mode 100644
index 0cd6867..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/branch_out/A_test755.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package branch_out;
-
-public class A_test755 {
-	public volatile boolean flag;
-
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/do {
-			if (flag)
-				break;
-		} while (flag);/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test950.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test950.java
deleted file mode 100644
index 131e7fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test950.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package duplicates_in;
-
-public class A_test950 {
-	void f(){
-		int i= 0;
-		int j= 1;
-		int k= /*[*/i+j/*]*/;
-
-		int i1= 0;
-		int j1= 1;
-		int k1= i+j;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test951.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test951.java
deleted file mode 100644
index 663aae4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test951.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package duplicates_in;
-
-public class A_test951 {
-	void foo() {
-		/*[*/System.out.println("Eclipse");/*]*/
-		System.out.println("Eclipse");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test952.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test952.java
deleted file mode 100644
index f018b9c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test952.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package duplicates_in;
-
-public class A_test952 {
-	void foo() {
-		/*[*/bar();/*]*/
-		bar();
-	}
-	
-	void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test953.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test953.java
deleted file mode 100644
index b25e79e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test953.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package duplicates_in;
-
-public class A_test953 {
-	void foo() {
-		int i =10;
-		/*[*/bar(i);/*]*/
-		
-		int j= 10;
-		bar(j);
-	}
-	
-	void bar(int x) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test954.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test954.java
deleted file mode 100644
index 5c2b645..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test954.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package duplicates_in;
-
-public class A_test954 {
-	void foo() {
-		/*[*/System.out.println("Eclipse");/*]*/
-		if (true)
-			System.out.println("Eclipse");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test955.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test955.java
deleted file mode 100644
index 5c1abb3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test955.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package duplicates_in;
-
-public class A_test955 {
-	void foo() {
-		/*[*/bar();
-		bar();/*]*/
-		bar();
-		bar();
-	}
-	void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test956.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test956.java
deleted file mode 100644
index 732a78a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_in/A_test956.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package duplicates_in;
-
-// don't extract second occurence of
-// 2 since it is in a inner class
-public class A_test956 {
-	void foo() {
-		int y= /*[*/2/*]*/;
-	}
-	class Inner {
-		void foo() {
-			int y1= 2;
-		}
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test950.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test950.java
deleted file mode 100644
index 80deedd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test950.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package duplicates_out;
-
-public class A_test950 {
-	void f(){
-		int i= 0;
-		int j= 1;
-		int k= extracted(i, j);
-
-		int i1= 0;
-		int j1= 1;
-		int k1= extracted(i, j);
-	}
-
-	protected int extracted(int i, int j) {
-		return /*[*/i+j/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test951.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test951.java
deleted file mode 100644
index 8642d43..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test951.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package duplicates_out;
-
-public class A_test951 {
-	void foo() {
-		extracted();
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/System.out.println("Eclipse");/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test952.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test952.java
deleted file mode 100644
index 1b2f373..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test952.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package duplicates_out;
-
-public class A_test952 {
-	void foo() {
-		extracted();
-		extracted();
-	}
-	
-	protected void extracted() {
-		/*[*/bar();/*]*/
-	}
-
-	void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test953.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test953.java
deleted file mode 100644
index 27a2952..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test953.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package duplicates_out;
-
-public class A_test953 {
-	void foo() {
-		int i =10;
-		extracted(i);
-		
-		int j= 10;
-		extracted(j);
-	}
-	
-	protected void extracted(int i) {
-		/*[*/bar(i);/*]*/
-	}
-
-	void bar(int x) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test954.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test954.java
deleted file mode 100644
index 07a7943..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test954.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package duplicates_out;
-
-public class A_test954 {
-	void foo() {
-		extracted();
-		if (true)
-			extracted();
-	}
-
-	protected void extracted() {
-		/*[*/System.out.println("Eclipse");/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test955.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test955.java
deleted file mode 100644
index 8bd14b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test955.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package duplicates_out;
-
-public class A_test955 {
-	void foo() {
-		extracted();
-		extracted();
-	}
-	protected void extracted() {
-		/*[*/bar();
-		bar();/*]*/
-	}
-	void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test956.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test956.java
deleted file mode 100644
index 7366904..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/duplicates_out/A_test956.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package duplicates_out;
-
-// don't extract second occurence of
-// 2 since it is in a inner class
-public class A_test956 {
-	void foo() {
-		int y= extracted();
-	}
-	protected int extracted() {
-		return /*[*/2/*]*/;
-	}
-	class Inner {
-		void foo() {
-			int y1= 2;
-		}
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test800.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test800.java
deleted file mode 100644
index e647199..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test800.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package error_in;
-
-public class A_test800 {
-	public void fails() {
-		foo()
-	}
-	public void foo() {
-		/*[*/foo();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test801.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test801.java
deleted file mode 100644
index ac121d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test801.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package error_in;
-
-public class A_test801 {
-	public void foo() {
-		List l;
-		/*[*/g(l);/*]*/
-	}
-
-	public void g(List l) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test802.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test802.java
deleted file mode 100644
index 0583ea8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_in/A_test802.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package error_in;
-
-public class A_test802 {
-	public List g() {
-		return null;
-	}
-	public void foo() {
-		/*]*/g()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test800.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test800.java
deleted file mode 100644
index d59faa0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test800.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package error_out;
-
-public class A_test800 {
-	public void fails() {
-		foo()
-	}
-	public void foo() {
-		extracted();
-	}
-	protected void extracted() {
-		/*[*/foo();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test801.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test801.java
deleted file mode 100644
index 7a4d01c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test801.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package error_out;
-
-public class A_test801 {
-	public void foo() {
-		List l;
-		extracted(l);
-	}
-
-	protected void extracted(List l) {
-		/*[*/g(l);/*]*/
-	}
-
-	public void g(List l) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test802.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test802.java
deleted file mode 100644
index 6990041..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/error_out/A_test802.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package error_out;
-
-public class A_test802 {
-	public List g() {
-		return null;
-	}
-	public void foo() {
-		/*]*/extracted();
-	}
-	protected void extracted() {
-		g()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A.java
deleted file mode 100644
index 1f00ac3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_in;
-
-import java.io.File;
-
-class A {
-	public File getFile() {
-		return null;
-	}
-	public void useFile(File file) {
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test600.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test600.java
deleted file mode 100644
index 94db936..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test600.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package expression_in;
-
-public class A_test600 {
-
-	public void foo() {
-		int i= 10;
-		if (/*[*/i < 10/*]*/)
-			foo();
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test601.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test601.java
deleted file mode 100644
index 193f07a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test601.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package expression_in;
-
-public class A_test601 {
-
-	public void foo() {
-		int i= 10;
-		if (/*[*/i < 10 && i < 20/*]*/)
-			foo();
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test602.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test602.java
deleted file mode 100644
index 0c46ee7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test602.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package expression_in;
-
-public class A_test602 {
-
-	public void foo() {
-		int i= 10;
-		if (/*[*/i < 10 || i < 20/*]*/)
-			foo();
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test603.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test603.java
deleted file mode 100644
index 21f20ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test603.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package expression_in;
-
-public class A_test603 {
-
-	public void foo() {
-		int i= 10;
-		if (/*[*/i == 10/*]*/)
-			foo();
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test604.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test604.java
deleted file mode 100644
index 58e04ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test604.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package expression_in;
-
-public class A_test604 {
-
-	public void foo() {
-		Object o= null;
-		if (/*[*/o == o/*]*/)
-			foo();
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test605.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test605.java
deleted file mode 100644
index 96abbb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test605.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_in;
-
-public class A_test605 {
-
-	public void foo() {
-		int i= 0;
-		while (/*[*/i <= 10/*]*/)
-			foo();
-		foo();	
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test606.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test606.java
deleted file mode 100644
index e719d72..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test606.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_in;
-
-public class A_test606 {
-
-	public void foo() {
-		int i= 0;
-		foo();
-		do {
-			foo();
-		} while (/*[*/i <= 10/*]*/);
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test607.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test607.java
deleted file mode 100644
index 16bdd6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test607.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package expression_in;
-
-public class A_test607 {
-
-	public void foo() {
-		for (int i= 0;/*[*/ i < 10/*]*/; i++)
-			foo();
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test608.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test608.java
deleted file mode 100644
index 8e07b6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test608.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package expression_in;
-
-public class A_test608 {
-
-	public static class Scanner {
-		public int x;
-		public int y;
-	}
-	public static class Selection {
-		public int start;
-		public int end;
-	}
-
-	public void foo(Selection selection) {
-		Scanner scanner= new Scanner();
-		
-		if (/*[*/scanner.x < selection.start && selection.start < scanner.y/*]*/) {
-			g();
-		}
-	}
-
-	public void g() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test609.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test609.java
deleted file mode 100644
index 0bbcf8b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test609.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package expression_in;
-
-public class A_test609 {
-	public void foo() {
-		boolean b;
-		b= 1 < 10 && /*[*/2 < 20/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test610.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test610.java
deleted file mode 100644
index c30d04d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test610.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package expression_in;
-
-public class A_test610 {
-	public void foo() {
-		int i= /*[*/0/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test611.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test611.java
deleted file mode 100644
index 5b94a30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test611.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package expression_in;
-
-public class A_test611 {
-	class Inner {
-	}
-	public void foo() {
-		Inner inner= /*[*/new Inner()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test612.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test612.java
deleted file mode 100644
index ce7e0d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test612.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package expression_in;
-
-public class A_test612 {
-	class Inner {
-	}
-	public void foo() {
-		Inner[] inner= /*[*/new Inner[10]/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test613.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test613.java
deleted file mode 100644
index 8009c6d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test613.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package expression_in;
-
-public class A_test613 {
-	public void foo() {
-		A a= null;
-		a.useFile(/*[*/a.getFile()/*]*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test614.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test614.java
deleted file mode 100644
index 523806d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test614.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package expression_in;
-
-import java.io.File;
-
-public class A_test614 {
-	public void foo() {
-		A a= null;
-		a.useFile(/*[*/a.getFile()/*]*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test615.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test615.java
deleted file mode 100644
index b81a13c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test615.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_in;
-
-public class A_test615 {
-	class Inner {
-	}
-	public void foo() {
-		Inner inner= null;
-		boolean b;
-		b= /*[*/inner instanceof Inner/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test616.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test616.java
deleted file mode 100644
index 8379887..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test616.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package expression_in;
-
-public class A_test616 {
-	public void foo() {
-		A a= null;
-		/*]*/a.getFile()/*]*/.getName();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test617.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test617.java
deleted file mode 100644
index 2e13e44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test617.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package expression_in;
-
-public class A_test617 {
-	public int foo() {
-		return 10 + /*[*/20 * 30/*]*/ + 10;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test618.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test618.java
deleted file mode 100644
index 48db0c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test618.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package expression_in;
-
-public class A_test618 {
-	public void foo() {
-		int i= 20 + /*[*/10 * 30/*]*/ + 10;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test619.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test619.java
deleted file mode 100644
index 54b0113..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test619.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package expression_in;
-
-public class A_test619 {
-	public void foo() {
-		int f= new A[/*[*/1 + 2/*]*/].length;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test620.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test620.java
deleted file mode 100644
index 304d772..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test620.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package expression_in;
-
-public class A_test620 {
-	public void foo() {
-		B b= new B();
-		Object o= /*[*/b.foo()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test621.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test621.java
deleted file mode 100644
index 5001b8f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test621.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package expression_in;
-
-public class A_test621 {
-	public A_test621() {
-		this(/*[*/5 + 6/*]*/);
-	}
-	public A_test621(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test622.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test622.java
deleted file mode 100644
index c9c9b83..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/A_test622.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_in;
-
-public class A_test622 {
-	public A_test622(int i) {
-	}
-	static class Inner extends A_test622 {
-		public Inner() {
-			super(/*[*/5 + 6/*]*/);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/B.java
deleted file mode 100644
index 368e3d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_in/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package expression_in;
-
-import java.util.List;
-
-public class B {
-	public List[] foo() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A.java
deleted file mode 100644
index 22a4113..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_out;
-
-import java.io.File;
-
-class A {
-	public File getFile() {
-		return null;
-	}
-	public void useFile(File file) {
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test600.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test600.java
deleted file mode 100644
index ea11d99..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test600.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-public class A_test600 {
-
-	public void foo() {
-		int i= 10;
-		if (extracted(i))
-			foo();
-	}
-
-	protected boolean extracted(int i) {
-		return /*[*/i < 10/*]*/;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test601.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test601.java
deleted file mode 100644
index d45a539..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test601.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-public class A_test601 {
-
-	public void foo() {
-		int i= 10;
-		if (extracted(i))
-			foo();
-	}
-
-	protected boolean extracted(int i) {
-		return /*[*/i < 10 && i < 20/*]*/;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test602.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test602.java
deleted file mode 100644
index f3e2cf7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test602.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-public class A_test602 {
-
-	public void foo() {
-		int i= 10;
-		if (extracted(i))
-			foo();
-	}
-
-	protected boolean extracted(int i) {
-		return /*[*/i < 10 || i < 20/*]*/;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test603.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test603.java
deleted file mode 100644
index dbd0213..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test603.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-public class A_test603 {
-
-	public void foo() {
-		int i= 10;
-		if (extracted(i))
-			foo();
-	}
-
-	protected boolean extracted(int i) {
-		return /*[*/i == 10/*]*/;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test604.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test604.java
deleted file mode 100644
index 1715431..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test604.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-public class A_test604 {
-
-	public void foo() {
-		Object o= null;
-		if (extracted(o))
-			foo();
-	}
-
-	protected boolean extracted(Object o) {
-		return /*[*/o == o/*]*/;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test605.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test605.java
deleted file mode 100644
index e6e12f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test605.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package expression_out;
-
-public class A_test605 {
-
-	public void foo() {
-		int i= 0;
-		while (extracted(i))
-			foo();
-		foo();	
-	}
-
-	protected boolean extracted(int i) {
-		return /*[*/i <= 10/*]*/;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test606.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test606.java
deleted file mode 100644
index f1a6c39..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test606.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package expression_out;
-
-public class A_test606 {
-
-	public void foo() {
-		int i= 0;
-		foo();
-		do {
-			foo();
-		} while (extracted(i));
-	}
-
-	protected boolean extracted(int i) {
-		return /*[*/i <= 10/*]*/;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test607.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test607.java
deleted file mode 100644
index 765271b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test607.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package expression_out;
-
-public class A_test607 {
-
-	public void foo() {
-		for (int i= 0;extracted(i); i++)
-			foo();
-	}
-
-	protected boolean extracted(int i) {
-		return /*[*/ i < 10/*]*/;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test608.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test608.java
deleted file mode 100644
index 23a3e43..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test608.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package expression_out;
-
-public class A_test608 {
-
-	public static class Scanner {
-		public int x;
-		public int y;
-	}
-	public static class Selection {
-		public int start;
-		public int end;
-	}
-
-	public void foo(Selection selection) {
-		Scanner scanner= new Scanner();
-		
-		if (extracted(selection, scanner)) {
-			g();
-		}
-	}
-
-	protected boolean extracted(Selection selection, Scanner scanner) {
-		return /*[*/scanner.x < selection.start && selection.start < scanner.y/*]*/;
-	}
-
-	public void g() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test609.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test609.java
deleted file mode 100644
index 859f641..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test609.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_out;
-
-public class A_test609 {
-	public void foo() {
-		boolean b;
-		b= 1 < 10 && extracted();
-	}
-
-	protected boolean extracted() {
-		return /*[*/2 < 20/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test610.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test610.java
deleted file mode 100644
index 89149ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test610.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_out;
-
-public class A_test610 {
-	public void foo() {
-		int i= extracted();
-	}
-
-	protected int extracted() {
-		return /*[*/0/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test611.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test611.java
deleted file mode 100644
index f30f669..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test611.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_out;
-
-public class A_test611 {
-	class Inner {
-	}
-	public void foo() {
-		Inner inner= extracted();
-	}
-	protected Inner extracted() {
-		return /*[*/new Inner()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test612.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test612.java
deleted file mode 100644
index 972f496..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test612.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_out;
-
-public class A_test612 {
-	class Inner {
-	}
-	public void foo() {
-		Inner[] inner= extracted();
-	}
-	protected Inner[] extracted() {
-		return /*[*/new Inner[10]/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test613.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test613.java
deleted file mode 100644
index 8425549..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test613.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-import java.io.File;
-
-public class A_test613 {
-	public void foo() {
-		A a= null;
-		a.useFile(extracted(a));
-	}
-
-	protected File extracted(A a) {
-		return /*[*/a.getFile()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test614.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test614.java
deleted file mode 100644
index 8a74345..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test614.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-import java.io.File;
-
-public class A_test614 {
-	public void foo() {
-		A a= null;
-		a.useFile(extracted(a));
-	}
-
-	protected File extracted(A a) {
-		return /*[*/a.getFile()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test615.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test615.java
deleted file mode 100644
index a5234e2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test615.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-public class A_test615 {
-	class Inner {
-	}
-	public void foo() {
-		Inner inner= null;
-		boolean b;
-		b= extracted(inner);
-	}
-	protected boolean extracted(Inner inner) {
-		return /*[*/inner instanceof Inner/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test616.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test616.java
deleted file mode 100644
index 327b460..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test616.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-import java.io.File;
-
-public class A_test616 {
-	public void foo() {
-		A a= null;
-		/*]*/extracted(a).getName();
-	}
-
-	protected File extracted(A a) {
-		return a.getFile()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test617.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test617.java
deleted file mode 100644
index 00d92a8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test617.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_out;
-
-public class A_test617 {
-	public int foo() {
-		return 10 + extracted() + 10;
-	}
-
-	protected int extracted() {
-		return /*[*/20 * 30/*]*/;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test618.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test618.java
deleted file mode 100644
index 304c5b9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test618.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_out;
-
-public class A_test618 {
-	public void foo() {
-		int i= 20 + extracted() + 10;
-	}
-
-	protected int extracted() {
-		return /*[*/10 * 30/*]*/;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test619.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test619.java
deleted file mode 100644
index 0d56542..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test619.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_out;
-
-public class A_test619 {
-	public void foo() {
-		int f= new A[extracted()].length;
-	}
-
-	protected int extracted() {
-		return /*[*/1 + 2/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test620.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test620.java
deleted file mode 100644
index e676e6b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test620.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_out;
-
-import java.util.List;
-
-public class A_test620 {
-	public void foo() {
-		B b= new B();
-		Object o= extracted(b);
-	}
-
-	protected List[] extracted(B b) {
-		return /*[*/b.foo()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test621.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test621.java
deleted file mode 100644
index 75966b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test621.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_out;
-
-public class A_test621 {
-	public A_test621() {
-		this(extracted());
-	}
-	protected static int extracted() {
-		return /*[*/5 + 6/*]*/;
-	}
-	public A_test621(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test622.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test622.java
deleted file mode 100644
index 3e0cb45..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/A_test622.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package expression_out;
-
-public class A_test622 {
-	public A_test622(int i) {
-	}
-	static class Inner extends A_test622 {
-		public Inner() {
-			super(extracted());
-		}
-
-		protected static int extracted() {
-			return /*[*/5 + 6/*]*/;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/B.java
deleted file mode 100644
index 2583a2a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/expression_out/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package expression_out;
-
-import java.util.List;
-
-public class B {
-	public List[] foo() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/handTests/Comments.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/handTests/Comments.java
deleted file mode 100644
index 8045ae2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/handTests/Comments.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package handTests;
-public class Comments {
-	/* comment */
-	public void foo() {
-		foo();
-		/* comment */
-		// comment
-		/** comment */
-		foo();
-	}
-	/* comment */
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1000.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1000.java
deleted file mode 100644
index 1a07c82..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1000.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package initializer_in;
-
-public class A_test1000 {
-	{
-		/*[*/System.out.println("Eclipse");/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1001.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1001.java
deleted file mode 100644
index 064ea8b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1001.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package initializer_in;
-
-public class A_test1001 {
-	static {
-		/*[*/System.out.println("Eclipse");/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1002.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1002.java
deleted file mode 100644
index 1257274..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1002.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package initializer_in;
-
-public class A_test1002 {
-	{
-		String s= "Eclipse";
-		/*[*/System.out.println(s);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1003.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1003.java
deleted file mode 100644
index 144b06f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_in/A_test1003.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package initializer_in;
-
-public class A_test1003 {
-	static {
-		int i= /*[*/bar()/*]*/;
-	}
-	
-	private static int bar() {
-		return 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1000.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1000.java
deleted file mode 100644
index fc95b7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1000.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package initializer_out;
-
-public class A_test1000 {
-	{
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/System.out.println("Eclipse");/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1001.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1001.java
deleted file mode 100644
index 8f22a51..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1001.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package initializer_out;
-
-public class A_test1001 {
-	static {
-		extracted();
-	}
-
-	protected static void extracted() {
-		/*[*/System.out.println("Eclipse");/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1002.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1002.java
deleted file mode 100644
index 3d52622..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1002.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package initializer_out;
-
-public class A_test1002 {
-	{
-		String s= "Eclipse";
-		extracted(s);
-	}
-
-	protected void extracted(String s) {
-		/*[*/System.out.println(s);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1003.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1003.java
deleted file mode 100644
index 782cba6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/initializer_out/A_test1003.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package initializer_out;
-
-public class A_test1003 {
-	static {
-		int i= extracted();
-	}
-	
-	protected static int extracted() {
-		return /*[*/bar()/*]*/;
-	}
-
-	private static int bar() {
-		return 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test010.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test010.java
deleted file mode 100644
index 880e1b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test010.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test010 {
-	public void /*]*/foo() {
-		foo();
-	}/*[*/
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test011.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test011.java
deleted file mode 100644
index 1adf115..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test011.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test011 {
-	public void foo() {
-		/*]*/foo(/*[*/);
-	}
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test012.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test012.java
deleted file mode 100644
index c89c75f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test012.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test012 {
-	public void foo() {
-		/*]*/f();
-		g(/*[*/);
-	}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test013.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test013.java
deleted file mode 100644
index b92d74d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test013.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test013 {
-	public void foo() {/*[*/
-		f();
-		g();
-	}/*[*/
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test014.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test014.java
deleted file mode 100644
index de28005..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test014.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test014 {
-	public void foo() /*]*/{
-		foo();
-	}/*[*/
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test015.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test015.java
deleted file mode 100644
index 32e0e13..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test015.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test015 {
-	public void foo() /*]*/{
-		f();
-		g();
-	/*]*/}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test020.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test020.java
deleted file mode 100644
index d99ed0f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test020.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package invalidSelection;
-
-public class A_test020 {
-	public void foo(int x) {
-		switch(x) {
-			/*]*/case 10:
-				f();
-				break;/*[*/
-			case 11:
-				g();
-				break;
-			default:
-				f();
-				g();		
-		}
-	}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test021.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test021.java
deleted file mode 100644
index a104c30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test021.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package invalidSelection;
-
-public class A_test021 {
-	public void foo(int x) {
-		/*]*/switch(x) {
-			case 10:
-				f();
-				break;/*[*/
-			case 11:
-				g();
-				break;
-			default:
-				f();
-				g();		
-		}
-	}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test022.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test022.java
deleted file mode 100644
index e256a20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test022.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package invalidSelection;
-
-public class A_test022 {
-	public void foo(int x) {
-		switch(x) {
-			/*]*/case 10:
-				f();
-				break;
-			case 11:
-				g();
-				break;
-			default:
-				f();
-				g();		
-		/*]*/}
-	}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test030.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test030.java
deleted file mode 100644
index 79812d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test030.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test030 {
-	public void foo(int x) {
-		{/*[*/
-			f();
-		}/*[*/
-	}	
-	public void f() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test031.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test031.java
deleted file mode 100644
index b8fc35b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test031.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test031 {
-	public void foo(int x) {
-		/*]*/{
-			f();
-		/*]*/}
-	}	
-	public void f() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test040.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test040.java
deleted file mode 100644
index f7a17c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test040.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test040 {
-	public void foo() {
-		for (int i= 0; i /*]*/</*[*/ 10; i++)
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test041.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test041.java
deleted file mode 100644
index e3219e2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test041.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test041 {
-	public void foo() {
-		for (/*]*/int i= 0/*[*/; i < 10; i++)
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test042.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test042.java
deleted file mode 100644
index 87baa6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test042.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test042 {
-	public void foo() {
-		for (int i= 0; i < 10; /*]*/i++/*[*/)
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test043.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test043.java
deleted file mode 100644
index 6782f44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test043.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test043 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)/*[*/
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test044.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test044.java
deleted file mode 100644
index eba8d19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test044.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test044 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)
-			foo(/*[*/);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test045.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test045.java
deleted file mode 100644
index 8553338..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test045.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test045 {
-	public void foo() {
-		for /*]*/(int i= 0; i < 10; i++)
-			foo();/*[*/
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test046.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test046.java
deleted file mode 100644
index ad867fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test046.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test046 {
-	public void foo() {
-		for (int i= 10; i < 10; i++)
-			for (int z= 10; z < 10; z++)
-				/*]*/foo();
-		foo()/*[*/;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test047.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test047.java
deleted file mode 100644
index a84e445..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test047.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test047 {
-	public void foo() {
-		for (int i= 10; i < 10; i++)
-			/*]*/for (int z= 10; z < 10; z++)
-				foo();
-		foo()/*[*/;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test048.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test048.java
deleted file mode 100644
index 69ae79b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test048.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package invalidSelection;
-
-import java.util.Enumeration;
-
-public class A_test048 {
-	public boolean flag;
-	public void foo() {
-		for (/*]*/Enumeration e= tests()/*[*/; e.hasMoreElements(); ) {
-			if (flag)
-				break;
-		}
-	}	
-	public Enumeration tests() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test050.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test050.java
deleted file mode 100644
index 1321a16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test050.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test050 {
-	public void foo() {
-		while(1 /*]*/</*[*/ 10)
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test051.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test051.java
deleted file mode 100644
index e91b2d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test051.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test051 {
-	public void foo() {
-		/*]*/while(1 < 10)/*[*/
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test052.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test052.java
deleted file mode 100644
index b374911..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test052.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package invalidSelection;
-
-public class A_test052 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		while(b())/*[*/
-			while(b())
-				foo();
-		foo()/*[*/;		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test060.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test060.java
deleted file mode 100644
index e1b6bdd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test060.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test060 {
-	public void foo() {
-		do 
-			foo();
-		while(100 /*]*/>/*[*/  10);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test061.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test061.java
deleted file mode 100644
index a1e56d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test061.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test061 {
-	public void foo() {
-		do 
-			/*]*/foo();
-		while(1 < 10);/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test062.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test062.java
deleted file mode 100644
index 4913526..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test062.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test062 {
-	public void foo() {
-		/*]*/do 
-			foo();/*[*/
-		while(1 < 10);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test063.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test063.java
deleted file mode 100644
index d834943..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test063.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test063 {
-	public void foo() {
-		do/*[*/
-			foo();
-		/*]*/while(1 < 10);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test070.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test070.java
deleted file mode 100644
index f2b6365..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test070.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package invalidSelection;
-
-public class A_test070 {
-	public int foo() {
-		int i= foo();
-		switch/*[*/ (i) {
-			case 1:
-				foo();
-			case 2:
-				foo();
-				foo();
-			case 3:
-				foo();
-			default:
-				foo();	
-		}/*[*/
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test071.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test071.java
deleted file mode 100644
index 1e29c19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test071.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package invalidSelection;
-
-public class A_test071 {
-	public int foo() {
-		int i= foo();
-		/*]*/switch (i) {
-			case 1:
-				foo();
-			case 2:
-				foo();
-				foo();
-			case 3:
-				foo();
-			default:
-				foo();	
-		/*]*/}
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test072.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test072.java
deleted file mode 100644
index 786a188..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test072.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package invalidSelection;
-
-public class A_test072 {
-	public int foo() {
-		int i= foo();
-		switch (i) {
-			case 1/*]*/:
-				foo()/*[*/;
-			case 2:
-				foo();
-				foo();
-			case 3:
-				foo();
-			default:
-				foo();	
-		}
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test073.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test073.java
deleted file mode 100644
index 921196e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test073.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package invalidSelection;
-
-public class A_test073 {
-	public int foo() {
-		int i= foo();
-		switch (i) {
-			case 1:/*[*/
-				foo();
-			case/*[*/2:
-				foo();
-				foo();
-			case 3:
-				foo();
-			default:
-				foo();	
-		}
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test080.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test080.java
deleted file mode 100644
index 148661a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test080.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test080 {
-	public boolean fBoolean;
-	public void foo() {
-		if /*]*/(fBoolean/*[*/)
-			foo();
-		else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test081.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test081.java
deleted file mode 100644
index 088e444..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test081.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test081 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();
-		else
-			/*]*/foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test082.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test082.java
deleted file mode 100644
index 8e1e3bc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test082.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test082 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();/*[*/
-		else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test083.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test083.java
deleted file mode 100644
index 05af41d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test083.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test083 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();
-		/*]*/else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test084.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test084.java
deleted file mode 100644
index 42cf868..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test084.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test084 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();
-		else/*[*/
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test085.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test085.java
deleted file mode 100644
index 7969c16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test085.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test085 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			foo();
-		/*]*/else
-			foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test090.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test090.java
deleted file mode 100644
index 18c6c71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test090.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test090 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			/*]*/break/*[*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test091.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test091.java
deleted file mode 100644
index a2e5c4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test091.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test091 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			/*]*/continue/*[*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test092.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test092.java
deleted file mode 100644
index ccaed03..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test092.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test092 {
-	public void foo() {
-		while (true)
-			/*]*/break/*[*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test093.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test093.java
deleted file mode 100644
index 165eb67..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test093.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test093 {
-	public void foo() {
-		while (true)
-			/*]*/continue/*[*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test094.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test094.java
deleted file mode 100644
index d3c0b17..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test094.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test094 {
-	public void foo() {
-		do
-			/*]*/break/*[*/;
-		while(true);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test095.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test095.java
deleted file mode 100644
index e330d16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test095.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test095 {
-	public void foo() {
-		do
-			/*]*/continue/*[*/;
-		while(true);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test096.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test096.java
deleted file mode 100644
index 4b0fe42..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test096.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package invalidSelection;
-
-public class A_test096 {
-	public void foo() {
-		int i= 10;
-		switch(i) {
-			case 10:
-				foo();
-				/*]*/break/*[*/;
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test100.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test100.java
deleted file mode 100644
index 8113e0b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test100.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test100 {
-	public void foo() {
-		try /*]*/{
-			foo();
-		}/*[*/ catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test101.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test101.java
deleted file mode 100644
index 26e171f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test101.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test101 {
-	public void foo() {
-		try /*]*/{
-			foo();
-		/*]*/} catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test102.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test102.java
deleted file mode 100644
index 39fd3ff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test102.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test102 {
-	public void foo() {
-		try {/*[*/
-			foo();
-		}/*[*/ catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test103.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test103.java
deleted file mode 100644
index ffe0310..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test103.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test103 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) /*]*/{
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test104.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test104.java
deleted file mode 100644
index 6bb367b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test104.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test104 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {/*[*/
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test105.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test105.java
deleted file mode 100644
index d8f6c1f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test105.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test105 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) /*]*/{
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test106.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test106.java
deleted file mode 100644
index d5c166f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test106.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test106 {
-	public void foo() {
-		try {
-			foo();
-		} finally /*]*/{
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test107.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test107.java
deleted file mode 100644
index 4d8f1bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test107.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test107 {
-	public void foo() {
-		try {
-			foo();
-		} finally {/*[*/
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test108.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test108.java
deleted file mode 100644
index 4c79c88..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test108.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test108 {
-	public void foo() {
-		try {
-			foo();
-		} finally /*]*/{
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test109.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test109.java
deleted file mode 100644
index fa68c05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test109.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test109 {
-	public void foo() {
-		/*]*/try {
-			foo();
-		} finally {
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test110.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test110.java
deleted file mode 100644
index 6ecade3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test110.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test110 {
-	public void foo() {
-		try/*[*/{
-			foo();
-		} finally {
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test111.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test111.java
deleted file mode 100644
index c9903ff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test111.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test111 {
-	public void foo() {
-		try {
-			foo();
-		} catch (/*]*/Exception e/*[*/) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test112.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test112.java
deleted file mode 100644
index 689f857..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test112.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test112 {
-	public void foo() {
-		try {
-			foo();
-		} /*]*/catch (Exception e) {
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test113.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test113.java
deleted file mode 100644
index 2c2db9b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test113.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test113 {
-	public void foo() {
-		/*]*/try {
-			foo();
-		}/*[*/ catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test114.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test114.java
deleted file mode 100644
index 1cfce05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test114.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test114 {
-	public void foo() {
-		try {
-			foo();
-		} /*]*/finally {
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test115.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test115.java
deleted file mode 100644
index 37a6af2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test115.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test115 {
-	public void foo() {
-		try {
-			foo();
-		} catch /*]*/(Exception e)/*[*/ {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test116.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test116.java
deleted file mode 100644
index 02f8ef4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test116.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test116 {
-	public void foo() {
-		try {
-			foo();
-		} catch (/*]*/Exception e/*[*/) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test120.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test120.java
deleted file mode 100644
index a5fad98..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test120.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test120 {
-	public boolean foo() {
-		/*]*/return/*[*/ false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test121.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test121.java
deleted file mode 100644
index bd734f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test121.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package invalidSelection;
-
-public class A_test121 {
-	public void foo() {
-		int x= 1;
-		int y= 2;
-		
-		/*]*/x= y + x;
-		y= x + y;/*[*/
-		
-		x++;
-		y++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test122.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test122.java
deleted file mode 100644
index c322a8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test122.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package invalidSelection;
-
-public class A_test122 {
-	public void foo() {
-		int x= 1;
-
-		/*]*/x= x + 2;
-		int y= 10;/*[*/
-		
-		x+= y + 20;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test123.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test123.java
deleted file mode 100644
index ace8f56..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test123.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test123 {
-	public void foo() {
-		Object /*]*/temp/*[*/= null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test130.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test130.java
deleted file mode 100644
index b9b833d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test130.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test130 {
-	public void foo() {
-		class Inner {
-		}
-		
-		/*]*/Inner inner= new Inner();
-		foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test131.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test131.java
deleted file mode 100644
index 4bcbf44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test131.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test131 {
-	public void foo() {
-		
-		/*]*/foo();
-		class Inner {
-		}
-		foo();/*[*/
-		
-		Inner inner= new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test140.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test140.java
deleted file mode 100644
index 19a5f90..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test140.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package invalidSelection;
-
-public class A_test140 {
-	public boolean flag;
-	public int foo() {
-		int i= 10;
-		/*]*/switch(i) {
-			case 1:
-				if (flag)
-					break;
-				foo();	
-			case 2:
-				return 10;
-			default:
-				throw new NullPointerException();
-		}/*[*/
-			
-		return 10;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test141.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test141.java
deleted file mode 100644
index c2d0f50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test141.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test141 {
-	private boolean flag;
-	public int foo() {
-		/*]*/while(flag)
-			return 20;/*[*/
-		return 10;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test142.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test142.java
deleted file mode 100644
index 127f394..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test142.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package invalidSelection;
-
-public class A_test142 {
-	private boolean flag;
-	public int foo() {
-		int i= 10;
-		/*]*/if (flag) {
-			i++;
-			return i;
-		}/*[*/
-		int y= i + 10;
-		return y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test143.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test143.java
deleted file mode 100644
index b5719da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test143.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test143 {
-	public boolean foo() {
-		/*]*/try {
-			return true;
-		} catch (Exception e) {
-		}/*[*/
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test144.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test144.java
deleted file mode 100644
index a53244b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test144.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test144 {
-	public boolean foo() {
-		/*]*/try {
-		} catch (Exception e) {
-			return true;
-		}/*[*/
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test145.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test145.java
deleted file mode 100644
index effe0d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test145.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test145 {
-	boolean flag;
-	public boolean foo() {
-		/*]*/do {
-			if (flag)
-				break;
-			return false;
-		} while (flag);/*[*/
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test146.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test146.java
deleted file mode 100644
index d1076db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test146.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package invalidSelection;
-
-public class A_test146 {
-	boolean flag;
-	public boolean foo() {
-		while (flag) {
-			/*]*/for (int i= 0; i < 10; i++) {
-				if (flag)
-					break;
-			}
-			if (flag)
-				break;
-			return false;/*[*/
-		}
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test147.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test147.java
deleted file mode 100644
index 43470ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test147.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package invalidSelection;
-
-public class A_test147 {
-	boolean flag;
-	public boolean foo() {
-		/*]*/target: {
-			for (int i= 0; i < 10; i++) {
-				if (flag)
-					break;
-				else
-					break target;
-			}
-			return false;
-		}/*[*/
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test148.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test148.java
deleted file mode 100644
index f030140..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test148.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package invalidSelection;
-
-public class A_test148 {
-	boolean flag;
-	public boolean foo() {
-		int i= 0;
-		/*]*/switch (i) {
-			case 1:
-				return false;
-			case 2:
-				return true;
-		}/*[*/
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test149.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test149.java
deleted file mode 100644
index adfbf99..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test149.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package invalidSelection;
-
-public class A_test149 {
-	boolean flag;
-	public boolean foo() {
-		int i= 0;
-		/*]*/switch (i) {
-			case 1:
-				break;
-			case 2:
-				return true;
-			default:
-				return false;
-		}/*[*/
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test150.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test150.java
deleted file mode 100644
index e469082..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test150.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test150 {
-
-	public void foo() {
-		/*]*/synchronized (this) {
-			foo();
-		/*]*/}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test151.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test151.java
deleted file mode 100644
index b175d5e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test151.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test151 {
-
-	public void foo() {
-		synchronized/*[*/ (this) {
-			foo();
-		}/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test152.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test152.java
deleted file mode 100644
index 9a29fd8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test152.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test152 {
-
-	public void foo() {
-		synchronized (this) /*]*/{
-			foo();
-		/*]*/}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test153.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test153.java
deleted file mode 100644
index 477b5d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test153.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test153 {
-
-	public void foo() {
-		synchronized(this) {/*[*/
-			foo();
-		}/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test160.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test160.java
deleted file mode 100644
index 965967c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test160.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package invalidSelection;
-
-public class A_test160 {
-	/*]*/public static class Inner {
-	}/*[*/
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test161.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test161.java
deleted file mode 100644
index ee94548..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test161.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test161 {
-	public void foo() {
-		class /*]*/Inner {
-		}/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test170.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test170.java
deleted file mode 100644
index bda6db9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test170.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test170 {
-	public void foo() {
-		String tab[] = /*]*/{"hello", "world" } /*[*/;       
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test171.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test171.java
deleted file mode 100644
index cac9b44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test171.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test171 {
-	public void foo() {
-		String /*]*/str = "ggg"/*[*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test172.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test172.java
deleted file mode 100644
index eca6057..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test172.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test172 {
-	public void foo() {
-		/*]*/int i= 10/*[*/, j= 20;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test173.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test173.java
deleted file mode 100644
index e9364fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test173.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test173 {
-	public void foo() {
-		/*]*/int i= 10, j= 20;/*[*/
-		g(j);
-		g(i);
-	}
-	public void g(int i) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test180.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test180.java
deleted file mode 100644
index 6998bd8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test180.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test180 {
-	public A_test180() {
-		/*]*/this(10);
-		foo();/*[*/
-	}
-	public A_test180(int i) {
-		super();
-	}
-	public void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test181.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test181.java
deleted file mode 100644
index e2ba0ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test181.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test181 {
-	public A_test181() {
-		/*]*/super();
-		foo();/*[*/
-	}
-	public void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test190.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test190.java
deleted file mode 100644
index a3972fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test190.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package invalidSelection;
-
-public class A_test190 {
-	public int foo() {
-		int i= 10;
-		/*]*/switch(i) {
-			case 1:
-				foo();
-				break;
-			case 2:
-				foo();
-			default:
-				return 10;
-		}/*[*/
-		
-		return 20;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test191.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test191.java
deleted file mode 100644
index 8bdbd9d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test191.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package invalidSelection;
-
-public class A_test191 {
-	private boolean foo(){
-		A_test191 m= new A_test191();
-		/*[*/if (m == null)
-			return true;
-		A_test191 d= m;/*]*/
-		if (d == null)
-			return true;	
-		return true;
-	}
-
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test192.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test192.java
deleted file mode 100644
index 228d9ea..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test192.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test192 {
-	private void foo(){
-		int i;
-		/*]*/i/*[*/= 10;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test193.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test193.java
deleted file mode 100644
index 736a228..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/invalidSelection/A_test193.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test193 {
-	private void foo(int i, int j){
-		foo(/*]*/10, 10/*[*/);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test500.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test500.java
deleted file mode 100644
index 1bad125..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test500.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package locals_in;
-
-public class A_test500 {
-	public void foo() {
-		int x= 10;
-		
-		/*[*/int y= x;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test501.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test501.java
deleted file mode 100644
index 6edae6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test501.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package locals_in;
-
-public class A_test501 {
-	public void foo() {
-		int x= 10;
-		
-		/*[*/x= 20;
-		int y= x;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test502.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test502.java
deleted file mode 100644
index d7fed07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test502.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test502 {
-	public void foo() {
-		int x= 0;
-		int y= 0;
-
-		/*[*/x= 10;
-		y= x;
-		x= y;/*]*/		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test503.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test503.java
deleted file mode 100644
index 21e1ef3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test503.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package locals_in;
-
-public class A_test503 {
-	public void foo() {
-		int x= 10;
-		
-		/*[*/x++;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test504.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test504.java
deleted file mode 100644
index d9992f8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test504.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package locals_in;
-
-public class A_test504 {
-	public void foo() {
-		int x= 10;
-		
-		/*[*/--x;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test505.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test505.java
deleted file mode 100644
index b444a5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test505.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package locals_in;
-
-public class A_test505 {
-	public void foo() {
-		int x= 0;
-		
-		/*[*/x+= 1;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test506.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test506.java
deleted file mode 100644
index f6baf0d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test506.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test506 {
-	public void foo() {
-		int x= 0;
-		
-		/*[*/bar(x);/*]*/
-	}
-
-	public void bar(int i) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test507.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test507.java
deleted file mode 100644
index d2d5ad8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test507.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test507 {
-	public void foo() {
-		int x= 0;
-		
-		/*[*/x= 10;/*]*/
-		
-		int y= x;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test508.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test508.java
deleted file mode 100644
index efc46fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test508.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_in;
-
-public class A_test508 {
-	public void foo() {
-		int x= 0;
-		int y= 0;
-		
-		/*[*/x= 10;
-		y= 20;/*]*/
-		
-		y= x;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test509.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test509.java
deleted file mode 100644
index 9b40179..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test509.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test509 {
-	public void foo() {
-		int x= 0;
-		int y= 0;
-
-		/*[*/y= x;
-		x= 0;/*]*/		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test510.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test510.java
deleted file mode 100644
index fb32dd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test510.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package locals_in;
-
-public class A_test510 {
-	public void foo() {
-		/*[*/int x= 0;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test511.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test511.java
deleted file mode 100644
index f623029..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test511.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package locals_in;
-
-public class A_test511 {
-	public void foo() {
-		/*[*/int x= 0;/*]*/
-		
-		x++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test512.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test512.java
deleted file mode 100644
index d7792d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test512.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package locals_in;
-
-public class A_test512 {
-	public void foo() {
-		/*[*/int x= 0;
-		int y= x;/*]*/
-		
-		x++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test513.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test513.java
deleted file mode 100644
index de84ff8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test513.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package locals_in;
-
-public class A_test513 {
-	public void foo() {
-		/*[*/int x= 0;
-		int y= 0;/*]*/
-		x++;
-		y= 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test514.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test514.java
deleted file mode 100644
index b1d18f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test514.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package locals_in;
-
-public class A_test514 {
-	public void foo() {
-		/*[*/int x;/*]*/
-		x= 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test515.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test515.java
deleted file mode 100644
index 091b116..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test515.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test515 {
-	public void foo() {
-		int y= 10;
-		
-		/*[*/int x= y;/*]*/
-		
-		x++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test516.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test516.java
deleted file mode 100644
index 7d393fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test516.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package locals_in;
-
-public class A_test516 {
-	public void foo() {
-		/*[*/int i= 10, j= 20;/*]*/
-		
-		j++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test517.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test517.java
deleted file mode 100644
index 9d6d133..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test517.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package locals_in;
-
-public class A_test517 {
-	public void foo() {
-		/*[*/int i;
-		int j;
-		j= 20;/*]*/
-		i= j + 10;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test518.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test518.java
deleted file mode 100644
index 05a2a55..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test518.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package locals_in;
-
-public class A_test518 {
-	public void foo() {
-		int i;
-		
-		/*[*/i= 10;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test519.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test519.java
deleted file mode 100644
index 6a9996d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test519.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test519 {
-	public void foo() {
-		int i;
-
-		/*[*/i= 10;/*]*/
-		
-		i= 20;		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test520.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test520.java
deleted file mode 100644
index cfb352b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test520.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test520 {
-	public void foo() {
-		int i= 0;
-
-		/*[*/int y= i;/*]*/
-		
-		i= 20;		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test521.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test521.java
deleted file mode 100644
index adb0c44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test521.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_in;
-
-public class A_test521 {
-	public volatile boolean flag;
-	
-	public void foo() {
-		int i= 5;
-		/*[*/if (flag)
-			i= 10;/*]*/
-		i--;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test522.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test522.java
deleted file mode 100644
index 6307a55..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test522.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_in;
-
-public class A_test522 {
-	public volatile boolean flag;
-	
-	public void foo() {
-		int i= 20;
-		/*[*/target: {
-			if (flag)
-				break target;
-			i= 10;
-		}/*]*/
-		i--;
-	}	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test523.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test523.java
deleted file mode 100644
index cff2b9c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test523.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package locals_in;
-
-public class A_test523 {
-	public volatile boolean flag;
-
-	protected void foo() {
-		int i= 0;
-		/*[*/try {
-			if (flag)
-				throw new Exception();
-			i= 10;
-		} catch (Exception e) {
-		}/*]*/
-		read(i);
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test524.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test524.java
deleted file mode 100644
index d693e97..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test524.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package locals_in;
-
-public class A_test524 {
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 0;
-		try {
-			/*[*/if (flag)
-				throw new Exception();
-			i= 10;/*]*/
-		} catch (Exception e) {
-		}
-		read(i);
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test525.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test525.java
deleted file mode 100644
index 21c33dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test525.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package locals_in;
-
-public class A_test525 {
-	private static class Exception1 extends Exception {
-	}
-	private static class Exception2 extends Exception {
-	}
-	
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 10;
-		try {
-			/*[*/try {
-				if (flag)
-					throw new Exception1();
-				if (!flag)
-					throw new Exception2();
-			} catch (Exception1 e) {
-			}
-			i= 10;/*]*/
-		} catch (Exception2 e) {
-		}
-		read(i);
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test526.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test526.java
deleted file mode 100644
index aa98e4f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test526.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package locals_in;
-
-public class A_test526 {
-	private static class Exception1 extends Exception {
-	}
-	private static class Exception2 extends Exception {
-	}
-	
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 10;
-		/*[*/try {
-			try {
-				if (flag)
-					throw new Exception1();
-				if (!flag)
-					throw new Exception2();
-			} catch (Exception1 e) {
-			}
-			i= 10;
-		} catch (Exception2 e) {
-		}/*]*/
-		read(i);
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test527.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test527.java
deleted file mode 100644
index 5ab2be7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test527.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package locals_in;
-
-public class A_test527 {
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 0;
-		/*[*/try {
-			if (flag)
-				throwException();
-			i= 10;
-		} catch (Exception e) {
-		}/*]*/
-		read(i);
-	}
-
-	private void read(int i) {
-	}
-	
-	private void throwException() throws Exception {
-		throw new Exception();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test528.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test528.java
deleted file mode 100644
index abb347c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test528.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_in;
-
-import java.io.IOException;
-
-public class A_test528 {
-	public void foo() throws IOException {
-	}
-
-	static class B extends A_test528 {
-		public void bar() throws IOException {
-			/*[*/super.foo();/*]*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test530.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test530.java
deleted file mode 100644
index 2b0b447..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test530.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_in;
-
-public class A_test530 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner= null;
-		
-		/*[*/inner= new Inner();/*]*/
-		
-		inner.x= 10;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test531.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test531.java
deleted file mode 100644
index 0d864f8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test531.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_in;
-
-public class A_test531 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner= new Inner();
-		
-		/*[*/inner.x= 10;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test532.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test532.java
deleted file mode 100644
index 03c692b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test532.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_in;
-
-public class A_test532 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner= new Inner();
-		
-		/*[*/inner.x= 10;/*]*/
-		
-		int y= inner.x;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test533.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test533.java
deleted file mode 100644
index 40bd1ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test533.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_in;
-
-public class A_test533 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		/*[*/Inner inner= new Inner();/*]*/
-
-		Inner inner2= inner;		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test534.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test534.java
deleted file mode 100644
index 2e3ce26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test534.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_in;
-
-public class A_test534 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner= new Inner();
-		
-		/*[*/inner.x= 10;/*]*/
-		
-		int y= inner.x;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test535.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test535.java
deleted file mode 100644
index 830b650..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test535.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_in;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class A_test535 {
-
-	public void bar() {
-		List allElements= new ArrayList();
-		Iterator iter= allElements.iterator();		
-
-		/*[*/while (iter.hasNext()) {
-			allElements.add(iter.next());
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test536.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test536.java
deleted file mode 100644
index 0a9f4c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test536.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_in;
-
-public class A_test536 {
-
-	public void bar() {
-		{ int k= 27; k++; }
-		int i= 37;
-		if (i == 0) {
-			int k= 17;
-			/*[*/k= k + 1;
-			k += 2;
-			i += 2;
-			k++;/*]*/
-		}
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test537.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test537.java
deleted file mode 100644
index cca81a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test537.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_in;
-
-public class A_test537 {
-	public void foo() {
-		final int i= 10;
-		
-		/*[*/Runnable run= new Runnable() {
-			public void run() {
-				System.out.println("" + i);
-			}
-		};/*]*/
-		
-		run.run();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test538.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test538.java
deleted file mode 100644
index f65bab6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test538.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package locals_in;
-
-public class A_test538 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		
-		/*[*/array[i]= 10;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test539.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test539.java
deleted file mode 100644
index cdcdcd6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test539.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test539 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		int[] index= new int[1];
-		
-		/*[*/array[index[i]]= 10;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test540.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test540.java
deleted file mode 100644
index cb9f85e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test540.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test540 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		int[] index= new int[1];
-		
-		/*[*/array[0]= index[0];/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test541.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test541.java
deleted file mode 100644
index 9f2fbd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test541.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_in;
-
-public class A_test541 {
-	class Inner {
-		public int x;
-	}
-	public void foo() {
-		int[] array= new int[10];
-		Inner inner= new Inner();
-		
-		/*[*/array[inner.x]= 10;
-		inner.x= 20;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test542.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test542.java
deleted file mode 100644
index 48c4832..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test542.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package locals_in;
-
-public class A_test542 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		
-		/*[*/array[i++]= 10;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test543.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test543.java
deleted file mode 100644
index 80b6783..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test543.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test543 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		
-		/*[*/array[i++]= 10;/*]*/
-		
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test550.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test550.java
deleted file mode 100644
index b7a3f12..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test550.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test550 {
-
-	public void foo() {
-		int i= 0;
-		while(true) {
-			/*[*/i++;/*]*/
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test551.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test551.java
deleted file mode 100644
index d3e0350..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test551.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test551 {
-
-	public void foo() {
-		int i= 0;
-		do {
-			/*[*/i++;/*]*/
-		} while (true);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test552.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test552.java
deleted file mode 100644
index f1629bc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test552.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test552 {
-
-	public void foo() {
-		int i= 0;
-		for (;true;) {
-			/*[*/i++;/*]*/
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test553.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test553.java
deleted file mode 100644
index fc2f2f8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test553.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test553 {
-
-	public void foo() {
-		int i= 0;
-		for (int x= i++, y= x;true;) {
-			/*[*/x= i;/*]*/
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test554.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test554.java
deleted file mode 100644
index 61bf2a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test554.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test554 {
-	public boolean flag;
-	public void foo() {
-		int x;
-		/*[*/if (flag)
-			x= 10;/*]*/
-		x= 20;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test555.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test555.java
deleted file mode 100644
index e0015a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test555.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_in;
-
-public class A_test555 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		while (true) {
-			for (int y= x; true; ) {
-				/*[*/x= 20;/*]*/
-			}
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test556.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test556.java
deleted file mode 100644
index ac6c310..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test556.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_in;
-
-public class A_test556 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		while (true) {
-			for (int y= 0; true; y= x) {
-				/*[*/x= 20;/*]*/
-			}
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test557.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test557.java
deleted file mode 100644
index 2bef61c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test557.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test557 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		for (int y= x; true;) {
-			/*[*/x= 20;/*]*/
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test558.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test558.java
deleted file mode 100644
index 33ed604..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test558.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test558 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		for (int y= 0; (x= 20) < 10; y= x) {
-			/*[*/x= 20;/*]*/
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test559.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test559.java
deleted file mode 100644
index ee8f0e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test559.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test559 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		for (int y= 0; x < 10; x= 20) {
-			/*[*/x= 20;/*]*/
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test560.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test560.java
deleted file mode 100644
index 8f76dee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test560.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test560 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		while (x < 10) {
-			/*[*/x= 20;/*]*/
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test561.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test561.java
deleted file mode 100644
index 6dee2ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test561.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test561 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		do {
-			/*[*/x= 20;/*]*/
-		} while (x < 10);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test562.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test562.java
deleted file mode 100644
index 216e4a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test562.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_in;
-
-public class A_test562 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		do {
-			int y= x;
-			/*[*/x= 20;/*]*/
-		} while (true);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test563.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test563.java
deleted file mode 100644
index b50218b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test563.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_in;
-
-public class A_test563 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		do {
-			int y= x;
-			/*[*/x= 20;/*]*/
-		} while ((x= 20) < 10);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test564.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test564.java
deleted file mode 100644
index a0dbe93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test564.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_in;
-
-public class A_test564 {
-	void foo(final int out){
-		int i;
-		if (out > 5){
-			/*[*/i= 1;/*]*/
-		} else {
-			i= 2;
-		}
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test565.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test565.java
deleted file mode 100644
index 250c46d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test565.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package locals_in;
-
-public class A_test565 {
-	void f(byte bytes) {
-		String s= "k";
-		/*[*/System.out.println(s + " " + bytes); /*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test566.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test566.java
deleted file mode 100644
index 508705b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test566.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test566 {
-	public void foo() {
-		String args[]= null;
-		/*[*/for (int i = 0; i < args.length; i++) {
-			args[i]= "";
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test567.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test567.java
deleted file mode 100644
index d3510f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test567.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test567 {
-	public void foo() {
-		String args[]= null;
-		
-		/*[*/args= new String[4];/*]*/
-		
-		args[0]= args[1];
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test568.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test568.java
deleted file mode 100644
index 59ce55b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test568.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_in;
-
-public class A_test568 {
-	public void foo() {
-		String[] args[]= null;
-		/*[*/for (int i = 0; i < args.length; i++) {
-			args[i]= null;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test569.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test569.java
deleted file mode 100644
index 9392123..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_in/A_test569.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_in;
-
-public class A_test569 {
-	public void foo() {
-		String[] args[]= null;
-		
-		/*[*/args= new String[1][4];/*]*/
-		
-		args[0]= args[1];
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test500.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test500.java
deleted file mode 100644
index 477a376..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test500.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_out;
-
-public class A_test500 {
-	public void foo() {
-		int x= 10;
-		
-		extracted(x);
-	}
-
-	protected void extracted(int x) {
-		/*[*/int y= x;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test501.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test501.java
deleted file mode 100644
index e28911f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test501.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_out;
-
-public class A_test501 {
-	public void foo() {
-		int x= 10;
-		
-		extracted();
-	}
-
-	protected void extracted() {
-		int x;
-		/*[*/x= 20;
-		int y= x;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test502.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test502.java
deleted file mode 100644
index ba1eb89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test502.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package locals_out;
-
-public class A_test502 {
-	public void foo() {
-		int x= 0;
-		int y= 0;
-
-		extracted();		
-	}
-
-	protected void extracted() {
-		int x;
-		int y;
-		/*[*/x= 10;
-		y= x;
-		x= y;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test503.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test503.java
deleted file mode 100644
index 99e9d5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test503.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_out;
-
-public class A_test503 {
-	public void foo() {
-		int x= 10;
-		
-		extracted(x);
-	}
-
-	protected void extracted(int x) {
-		/*[*/x++;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test504.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test504.java
deleted file mode 100644
index 5d2c633..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test504.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_out;
-
-public class A_test504 {
-	public void foo() {
-		int x= 10;
-		
-		extracted(x);
-	}
-
-	protected void extracted(int x) {
-		/*[*/--x;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test505.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test505.java
deleted file mode 100644
index 59cd11c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test505.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_out;
-
-public class A_test505 {
-	public void foo() {
-		int x= 0;
-		
-		extracted(x);
-	}
-
-	protected void extracted(int x) {
-		/*[*/x+= 1;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test506.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test506.java
deleted file mode 100644
index a20ea9a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test506.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_out;
-
-public class A_test506 {
-	public void foo() {
-		int x= 0;
-		
-		extracted(x);
-	}
-
-	protected void extracted(int x) {
-		/*[*/bar(x);/*]*/
-	}
-
-	public void bar(int i) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test507.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test507.java
deleted file mode 100644
index 38b7d00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test507.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test507 {
-	public void foo() {
-		int x= 0;
-		
-		x = extracted();
-		
-		int y= x;
-	}
-
-	protected int extracted() {
-		int x;
-		/*[*/x= 10;/*]*/
-		return x;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test508.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test508.java
deleted file mode 100644
index 5f75344..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test508.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package locals_out;
-
-public class A_test508 {
-	public void foo() {
-		int x= 0;
-		int y= 0;
-		
-		x = extracted();
-		
-		y= x;
-	}
-
-	protected int extracted() {
-		int x;
-		int y;
-		/*[*/x= 10;
-		y= 20;/*]*/
-		return x;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test509.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test509.java
deleted file mode 100644
index 9c78abd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test509.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_out;
-
-public class A_test509 {
-	public void foo() {
-		int x= 0;
-		int y= 0;
-
-		extracted(x);		
-	}
-
-	protected void extracted(int x) {
-		int y;
-		/*[*/y= x;
-		x= 0;/*]*/
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test510.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test510.java
deleted file mode 100644
index 5422943..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test510.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package locals_out;
-
-public class A_test510 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/int x= 0;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test511.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test511.java
deleted file mode 100644
index 3cd1888..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test511.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_out;
-
-public class A_test511 {
-	public void foo() {
-		int x = extracted();
-		
-		x++;
-	}
-
-	protected int extracted() {
-		/*[*/int x= 0;/*]*/
-		return x;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test512.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test512.java
deleted file mode 100644
index 040704c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test512.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_out;
-
-public class A_test512 {
-	public void foo() {
-		int x = extracted();
-		
-		x++;
-	}
-
-	protected int extracted() {
-		/*[*/int x= 0;
-		int y= x;/*]*/
-		return x;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test513.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test513.java
deleted file mode 100644
index eab0b20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test513.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_out;
-
-public class A_test513 {
-	public void foo() {
-		int y;
-		int x = extracted();
-		x++;
-		y= 10;
-	}
-
-	protected int extracted() {
-		/*[*/int x= 0;
-		int y= 0;/*]*/
-		return x;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test514.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test514.java
deleted file mode 100644
index e84c033..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test514.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package locals_out;
-
-public class A_test514 {
-	public void foo() {
-		int x;
-		extracted();
-		x= 10;
-	}
-
-	protected void extracted() {
-		/*[*/int x;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test515.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test515.java
deleted file mode 100644
index 0da8459..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test515.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_out;
-
-public class A_test515 {
-	public void foo() {
-		int y= 10;
-		
-		int x = extracted(y);
-		
-		x++;
-	}
-
-	protected int extracted(int y) {
-		/*[*/int x= y;/*]*/
-		return x;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test516.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test516.java
deleted file mode 100644
index 4db76df..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test516.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_out;
-
-public class A_test516 {
-	public void foo() {
-		int j = extracted();
-		
-		j++;
-	}
-
-	protected int extracted() {
-		/*[*/int i= 10, j= 20;/*]*/
-		return j;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test517.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test517.java
deleted file mode 100644
index 50824b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test517.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_out;
-
-public class A_test517 {
-	public void foo() {
-		int i;
-		int j = extracted();
-		i= j + 10;
-	}
-
-	protected int extracted() {
-		/*[*/int i;
-		int j;
-		j= 20;/*]*/
-		return j;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test518.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test518.java
deleted file mode 100644
index 161986d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test518.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_out;
-
-public class A_test518 {
-	public void foo() {
-		int i;
-		
-		extracted();
-	}
-
-	protected void extracted() {
-		int i;
-		/*[*/i= 10;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test519.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test519.java
deleted file mode 100644
index 84f6a85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test519.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_out;
-
-public class A_test519 {
-	public void foo() {
-		int i;
-
-		extracted();
-		
-		i= 20;		
-	}
-
-	protected void extracted() {
-		int i;
-		/*[*/i= 10;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test520.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test520.java
deleted file mode 100644
index 9114828..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test520.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_out;
-
-public class A_test520 {
-	public void foo() {
-		int i= 0;
-
-		extracted(i);
-		
-		i= 20;		
-	}
-
-	protected void extracted(int i) {
-		/*[*/int y= i;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test521.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test521.java
deleted file mode 100644
index af631f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test521.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package locals_out;
-
-public class A_test521 {
-	public volatile boolean flag;
-	
-	public void foo() {
-		int i= 5;
-		i = extracted(i);
-		i--;
-	}
-
-	protected int extracted(int i) {
-		/*[*/if (flag)
-			i= 10;/*]*/
-		return i;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test522.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test522.java
deleted file mode 100644
index 5b71f59..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test522.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package locals_out;
-
-public class A_test522 {
-	public volatile boolean flag;
-	
-	public void foo() {
-		int i= 20;
-		i = extracted(i);
-		i--;
-	}
-
-	protected int extracted(int i) {
-		/*[*/target: {
-			if (flag)
-				break target;
-			i= 10;
-		}/*]*/
-		return i;
-	}	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test523.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test523.java
deleted file mode 100644
index 5c679b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test523.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package locals_out;
-
-public class A_test523 {
-	public volatile boolean flag;
-
-	protected void foo() {
-		int i= 0;
-		i = extracted(i);
-		read(i);
-	}
-
-	protected int extracted(int i) {
-		/*[*/try {
-			if (flag)
-				throw new Exception();
-			i= 10;
-		} catch (Exception e) {
-		}/*]*/
-		return i;
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test524.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test524.java
deleted file mode 100644
index 197089d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test524.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package locals_out;
-
-public class A_test524 {
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 0;
-		try {
-			i = extracted();
-		} catch (Exception e) {
-		}
-		read(i);
-	}
-
-	protected int extracted() throws Exception {
-		int i;
-		/*[*/if (flag)
-			throw new Exception();
-		i= 10;/*]*/
-		return i;
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test525.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test525.java
deleted file mode 100644
index b1b6665..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test525.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package locals_out;
-
-public class A_test525 {
-	private static class Exception1 extends Exception {
-	}
-	private static class Exception2 extends Exception {
-	}
-	
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 10;
-		try {
-			i = extracted();
-		} catch (Exception2 e) {
-		}
-		read(i);
-	}
-
-	protected int extracted() throws Exception2 {
-		int i;
-		/*[*/try {
-			if (flag)
-				throw new Exception1();
-			if (!flag)
-				throw new Exception2();
-		} catch (Exception1 e) {
-		}
-		i= 10;/*]*/
-		return i;
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test526.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test526.java
deleted file mode 100644
index 33694e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test526.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package locals_out;
-
-public class A_test526 {
-	private static class Exception1 extends Exception {
-	}
-	private static class Exception2 extends Exception {
-	}
-	
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 10;
-		i = extracted(i);
-		read(i);
-	}
-
-	protected int extracted(int i) {
-		/*[*/try {
-			try {
-				if (flag)
-					throw new Exception1();
-				if (!flag)
-					throw new Exception2();
-			} catch (Exception1 e) {
-			}
-			i= 10;
-		} catch (Exception2 e) {
-		}/*]*/
-		return i;
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test527.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test527.java
deleted file mode 100644
index 0f0b169..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test527.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package locals_out;
-
-public class A_test527 {
-	public volatile boolean flag;
-	
-	protected void foo() {
-		int i= 0;
-		i = extracted(i);
-		read(i);
-	}
-
-	protected int extracted(int i) {
-		/*[*/try {
-			if (flag)
-				throwException();
-			i= 10;
-		} catch (Exception e) {
-		}/*]*/
-		return i;
-	}
-
-	private void read(int i) {
-	}
-	
-	private void throwException() throws Exception {
-		throw new Exception();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test528.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test528.java
deleted file mode 100644
index 1168c9c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test528.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package locals_out;
-
-import java.io.IOException;
-
-public class A_test528 {
-	public void foo() throws IOException {
-	}
-
-	static class B extends A_test528 {
-		public void bar() throws IOException {
-			extracted();
-		}
-
-		protected void extracted() throws IOException {
-			/*[*/super.foo();/*]*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test530.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test530.java
deleted file mode 100644
index a07c7b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test530.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package locals_out;
-
-public class A_test530 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner= null;
-		
-		inner = extracted();
-		
-		inner.x= 10;
-	}
-
-	protected Inner extracted() {
-		Inner inner;
-		/*[*/inner= new Inner();/*]*/
-		return inner;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test531.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test531.java
deleted file mode 100644
index c44b08a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test531.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test531 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner= new Inner();
-		
-		extracted(inner);
-	}
-
-	protected void extracted(Inner inner) {
-		/*[*/inner.x= 10;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test532.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test532.java
deleted file mode 100644
index c451260..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test532.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package locals_out;
-
-public class A_test532 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner= new Inner();
-		
-		extracted(inner);
-		
-		int y= inner.x;
-	}
-
-	protected void extracted(Inner inner) {
-		/*[*/inner.x= 10;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test533.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test533.java
deleted file mode 100644
index 284574b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test533.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package locals_out;
-
-public class A_test533 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner = extracted();
-
-		Inner inner2= inner;		
-	}
-
-	protected Inner extracted() {
-		/*[*/Inner inner= new Inner();/*]*/
-		return inner;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test534.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test534.java
deleted file mode 100644
index ecb9979..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test534.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package locals_out;
-
-public class A_test534 {
-	class Inner {
-		public int x;
-	}
-	
-	public void foo() {
-		Inner inner= new Inner();
-		
-		extracted(inner);
-		
-		int y= inner.x;
-	}
-
-	protected void extracted(Inner inner) {
-		/*[*/inner.x= 10;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test535.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test535.java
deleted file mode 100644
index 78df88b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test535.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package locals_out;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-public class A_test535 {
-
-	public void bar() {
-		List allElements= new ArrayList();
-		Iterator iter= allElements.iterator();		
-
-		extracted(allElements, iter);
-	}
-
-	protected void extracted(List allElements, Iterator iter) {
-		/*[*/while (iter.hasNext()) {
-			allElements.add(iter.next());
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test536.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test536.java
deleted file mode 100644
index 9109a9b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test536.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package locals_out;
-
-public class A_test536 {
-
-	public void bar() {
-		{ int k= 27; k++; }
-		int i= 37;
-		if (i == 0) {
-			int k= 17;
-			i = extracted(i, k);
-		}
-		i++;
-	}
-
-	protected int extracted(int i, int k) {
-		/*[*/k= k + 1;
-		k += 2;
-		i += 2;
-		k++;/*]*/
-		return i;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test537.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test537.java
deleted file mode 100644
index 6c8a274..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test537.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package locals_out;
-
-public class A_test537 {
-	public void foo() {
-		final int i= 10;
-		
-		Runnable run = extracted(i);
-		
-		run.run();
-	}
-
-	protected Runnable extracted(final int i) {
-		/*[*/Runnable run= new Runnable() {
-			public void run() {
-				System.out.println("" + i);
-			}
-		};/*]*/
-		return run;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test538.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test538.java
deleted file mode 100644
index 9e39979..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test538.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_out;
-
-public class A_test538 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		
-		extracted(i, array);
-	}
-
-	protected void extracted(int i, int[] array) {
-		/*[*/array[i]= 10;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test539.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test539.java
deleted file mode 100644
index 746757f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test539.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_out;
-
-public class A_test539 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		int[] index= new int[1];
-		
-		extracted(i, array, index);
-	}
-
-	protected void extracted(int i, int[] array, int[] index) {
-		/*[*/array[index[i]]= 10;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test540.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test540.java
deleted file mode 100644
index 7f2a9c3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test540.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_out;
-
-public class A_test540 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		int[] index= new int[1];
-		
-		extracted(array, index);
-	}
-
-	protected void extracted(int[] array, int[] index) {
-		/*[*/array[0]= index[0];/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test541.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test541.java
deleted file mode 100644
index d855112..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test541.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test541 {
-	class Inner {
-		public int x;
-	}
-	public void foo() {
-		int[] array= new int[10];
-		Inner inner= new Inner();
-		
-		extracted(array, inner);
-	}
-	protected void extracted(int[] array, Inner inner) {
-		/*[*/array[inner.x]= 10;
-		inner.x= 20;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test542.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test542.java
deleted file mode 100644
index 2b40ed6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test542.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package locals_out;
-
-public class A_test542 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		
-		extracted(i, array);
-	}
-
-	protected void extracted(int i, int[] array) {
-		/*[*/array[i++]= 10;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test543.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test543.java
deleted file mode 100644
index 9c35329..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test543.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test543 {
-	public void foo() {
-		int i= 0;
-		int[] array= new int[10];
-		
-		i = extracted(i, array);
-		
-		i++;
-	}
-
-	protected int extracted(int i, int[] array) {
-		/*[*/array[i++]= 10;/*]*/
-		return i;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test550.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test550.java
deleted file mode 100644
index 5c9239e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test550.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test550 {
-
-	public void foo() {
-		int i= 0;
-		while(true) {
-			i = extracted(i);
-		}
-	}
-
-	protected int extracted(int i) {
-		/*[*/i++;/*]*/
-		return i;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test551.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test551.java
deleted file mode 100644
index 5bbdb39..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test551.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test551 {
-
-	public void foo() {
-		int i= 0;
-		do {
-			i = extracted(i);
-		} while (true);
-	}
-
-	protected int extracted(int i) {
-		/*[*/i++;/*]*/
-		return i;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test552.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test552.java
deleted file mode 100644
index b9cf77e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test552.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test552 {
-
-	public void foo() {
-		int i= 0;
-		for (;true;) {
-			i = extracted(i);
-		}
-	}
-
-	protected int extracted(int i) {
-		/*[*/i++;/*]*/
-		return i;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test553.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test553.java
deleted file mode 100644
index 7b1a264..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test553.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test553 {
-
-	public void foo() {
-		int i= 0;
-		for (int x= i++, y= x;true;) {
-			extracted(i);
-		}
-	}
-
-	protected void extracted(int i) {
-		int x;
-		/*[*/x= i;/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test554.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test554.java
deleted file mode 100644
index 0513731..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test554.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_out;
-
-public class A_test554 {
-	public boolean flag;
-	public void foo() {
-		int x;
-		extracted();
-		x= 20;
-	}
-	protected void extracted() {
-		int x;
-		/*[*/if (flag)
-			x= 10;/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test555.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test555.java
deleted file mode 100644
index f41884a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test555.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package locals_out;
-
-public class A_test555 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		while (true) {
-			for (int y= x; true; ) {
-				x = extracted();
-			}
-		}
-	}
-	protected int extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-		return x;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test556.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test556.java
deleted file mode 100644
index 429b007..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test556.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package locals_out;
-
-public class A_test556 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		while (true) {
-			for (int y= 0; true; y= x) {
-				x = extracted();
-			}
-		}
-	}
-	protected int extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-		return x;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test557.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test557.java
deleted file mode 100644
index 384cc2d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test557.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package locals_out;
-
-public class A_test557 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		for (int y= x; true;) {
-			extracted();
-		}
-	}
-	protected void extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test558.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test558.java
deleted file mode 100644
index 57fa418..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test558.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test558 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		for (int y= 0; (x= 20) < 10; y= x) {
-			x = extracted();
-		}
-	}
-	protected int extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-		return x;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test559.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test559.java
deleted file mode 100644
index 049228c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test559.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test559 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		for (int y= 0; x < 10; x= 20) {
-			x = extracted();
-		}
-	}
-	protected int extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-		return x;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test560.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test560.java
deleted file mode 100644
index 36f3839..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test560.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test560 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		while (x < 10) {
-			x = extracted();
-		}
-	}
-	protected int extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-		return x;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test561.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test561.java
deleted file mode 100644
index 40951a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test561.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test561 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		do {
-			x = extracted();
-		} while (x < 10);
-	}
-	protected int extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-		return x;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test562.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test562.java
deleted file mode 100644
index f444bfb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test562.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package locals_out;
-
-public class A_test562 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		do {
-			int y= x;
-			x = extracted();
-		} while (true);
-	}
-	protected int extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-		return x;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test563.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test563.java
deleted file mode 100644
index bc13078..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test563.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package locals_out;
-
-public class A_test563 {
-	public boolean flag;
-	public void foo() {
-		int x= 0;
-		do {
-			int y= x;
-			extracted();
-		} while ((x= 20) < 10);
-	}
-	protected void extracted() {
-		int x;
-		/*[*/x= 20;/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test564.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test564.java
deleted file mode 100644
index 30f68fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test564.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package locals_out;
-
-public class A_test564 {
-	void foo(final int out){
-		int i;
-		if (out > 5){
-			i = extracted();
-		} else {
-			i= 2;
-		}
-		i++;
-	}
-
-	protected int extracted() {
-		int i;
-		/*[*/i= 1;/*]*/
-		return i;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test565.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test565.java
deleted file mode 100644
index 4063f28..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test565.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package locals_out;
-
-public class A_test565 {
-	void f(byte bytes) {
-		String s= "k";
-		extracted(bytes, s);
-	}
-
-	protected void extracted(byte bytes, String s) {
-		/*[*/System.out.println(s + " " + bytes); /*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test566.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test566.java
deleted file mode 100644
index 8c96b2f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test566.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_out;
-
-public class A_test566 {
-	public void foo() {
-		String args[]= null;
-		extracted(args);
-	}
-
-	protected void extracted(String[] args) {
-		/*[*/for (int i = 0; i < args.length; i++) {
-			args[i]= "";
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test567.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test567.java
deleted file mode 100644
index 687d7af..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test567.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package locals_out;
-
-public class A_test567 {
-	public void foo() {
-		String args[]= null;
-		
-		args = extracted();
-		
-		args[0]= args[1];
-	}
-
-	protected String[] extracted() {
-		String[] args;
-		/*[*/args= new String[4];/*]*/
-		return args;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test568.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test568.java
deleted file mode 100644
index eb7f47c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test568.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package locals_out;
-
-public class A_test568 {
-	public void foo() {
-		String[] args[]= null;
-		extracted(args);
-	}
-
-	protected void extracted(String[][] args) {
-		/*[*/for (int i = 0; i < args.length; i++) {
-			args[i]= null;
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test569.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test569.java
deleted file mode 100644
index a18bbaf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/locals_out/A_test569.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package locals_out;
-
-public class A_test569 {
-	public void foo() {
-		String[] args[]= null;
-		
-		args = extracted();
-		
-		args[0]= args[1];
-	}
-
-	protected String[][] extracted() {
-		String[][] args;
-		/*[*/args= new String[1][4];/*]*/
-		return args;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test650.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test650.java
deleted file mode 100644
index 71c96a8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test650.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package nested_in;
-
-public class A_test650 {
-	public class Inner {
-		public void foo() {
-			/*[*/foo();/*]*/
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test651.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test651.java
deleted file mode 100644
index 52f2c0b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test651.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package nested_in;
-
-public class A_test651 {
-	public void foo() {
-		Runnable run= new Runnable() {
-			public void run() {
-				/*[*/foo();/*]*/
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test652.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test652.java
deleted file mode 100644
index 243b33b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test652.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package nested_in;
-
-public class A_test652 {
-	public void foo() {
-		Runnable run= new Runnable() {
-			public void run() {
-				foo();
-			}
-		};
-		
-		/*[*/foo();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test653.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test653.java
deleted file mode 100644
index 3064141..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test653.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package nested_in;
-
-public class A_test653 {
-	public A_test653() {
-		/*[*/foo();/*]*/
-	}
-	public void foo() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test654.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test654.java
deleted file mode 100644
index bbe1547..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_in/A_test654.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package nested_in;
-
-public class A_test654 {
-	public void foo() {
-		class Inner {
-			public void foo() {
-				/*[*/foo();/*]*/
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test650.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test650.java
deleted file mode 100644
index 07036b9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test650.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package nested_out;
-
-public class A_test650 {
-	public class Inner {
-		public void foo() {
-			extracted();
-		}
-
-		protected void extracted() {
-			/*[*/foo();/*]*/
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test651.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test651.java
deleted file mode 100644
index efc2c90..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test651.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package nested_out;
-
-public class A_test651 {
-	public void foo() {
-		Runnable run= new Runnable() {
-			public void run() {
-				extracted();
-			}
-
-			protected void extracted() {
-				/*[*/foo();/*]*/
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test652.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test652.java
deleted file mode 100644
index 0483b5a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test652.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package nested_out;
-
-public class A_test652 {
-	public void foo() {
-		Runnable run= new Runnable() {
-			public void run() {
-				foo();
-			}
-		};
-		
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/foo();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test653.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test653.java
deleted file mode 100644
index 49c179b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test653.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package nested_out;
-
-public class A_test653 {
-	public A_test653() {
-		extracted();
-	}
-	protected void extracted() {
-		/*[*/foo();/*]*/
-	}
-	public void foo() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test654.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test654.java
deleted file mode 100644
index 8dc1bf7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/nested_out/A_test654.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package nested_out;
-
-public class A_test654 {
-	public void foo() {
-		class Inner {
-			public void foo() {
-				extracted();
-			}
-
-			protected void extracted() {
-				/*[*/foo();/*]*/
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test900.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test900.java
deleted file mode 100644
index 29b4951..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test900.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package parameterName_in;
-
-public class A_test900 {
-	public void foo() {
-		int i= 0;
-		int y= 0;
-		
-		/*]*/System.out.println(i + y);/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test901.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test901.java
deleted file mode 100644
index 64d1eca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test901.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package parameterName_in;
-
-public class A_test901 {
-	public void foo() {
-		int i= 0;
-		int y= 0;
-		
-		/*]*/System.out.println(i + y);/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test902.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test902.java
deleted file mode 100644
index 11fb646..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test902.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package parameterName_in;
-
-public class A_test902 {
-	public void foo() {
-		int i= 0;
-		int y= 0;
-		
-		/*]*/System.out.println(i + y);/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test903.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test903.java
deleted file mode 100644
index abebe1c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test903.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package parameterName_in;
-
-public class A_test903 {
-	public void foo() {
-		int i= 0;
-		float y= 0;
-		
-		/*[*/System.out.println(i + y);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test904.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test904.java
deleted file mode 100644
index 99e4f15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test904.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package parameterName_in;
-
-public class A_test904 {
-	public void foo() {
-		int i= 0;
-		float y= 0;
-		
-		/*[*/System.out.println(i + y);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test905.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test905.java
deleted file mode 100644
index 4f728be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_in/A_test905.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package parameterName_in;
-
-public class A_test905 {
-	public void foo() {
-		String x = "x";
-		/*[*/String y = "a" + x;
-		System.out.println(x);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test903.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test903.java
deleted file mode 100644
index 861fdc5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test903.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package parameterName_out;
-
-public class A_test903 {
-	public void foo() {
-		int i= 0;
-		float y= 0;
-		
-		extracted(i, y);
-	}
-
-	protected void extracted(int xxx, float yyyy) {
-		/*[*/System.out.println(xxx + yyyy);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test904.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test904.java
deleted file mode 100644
index 696e22e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test904.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package parameterName_out;
-
-public class A_test904 {
-	public void foo() {
-		int i= 0;
-		float y= 0;
-		
-		extracted(y, i);
-	}
-
-	protected void extracted(float zz, int xx) {
-		/*[*/System.out.println(xx + zz);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test905.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test905.java
deleted file mode 100644
index bf9710c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/parameterName_out/A_test905.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package parameterName_out;
-
-public class A_test905 {
-	public void foo() {
-		String x = "x";
-		extracted(x);
-	}
-
-	protected void extracted(String message) {
-		/*[*/String y = "a" + message;
-		System.out.println(message);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test700.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test700.java
deleted file mode 100644
index 4293ac7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test700.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package return_in;
-
-public class A_test700 {
-	public void foo() {
-		/*[*/return;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test701.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test701.java
deleted file mode 100644
index 5c9c07c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test701.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package return_in;
-
-public class A_test701 {
-	public boolean foo() {
-		/*[*/return true;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test702.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test702.java
deleted file mode 100644
index 0365888..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test702.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package return_in;
-
-public class A_test702 {
-	public boolean foo() {
-		/*[*/if (10 == 10)
-			return true;
-		else
-			return false;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test703.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test703.java
deleted file mode 100644
index 5b44050..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test703.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package return_in;
-
-public class A_test703 {
-	public boolean foo() {
-		/*[*/if (0 == 0) {
-			if (10 == 10)
-				return true;
-			else
-				return false;
-		}
-		foo();
-		return false;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test704.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test704.java
deleted file mode 100644
index d4cb577..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test704.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package return_in;
-
-public class A_test704 {
-	private boolean flag;
-	public boolean foo() {
-		/*[*/do {
-			return true;
-		} while (flag);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test705.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test705.java
deleted file mode 100644
index f9d02a2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test705.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package return_in;
-
-public class A_test705 {
-	public boolean foo() {
-		/*[*/try {
-			foo();
-		} catch(Exception e) {
-		} finally {
-			return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test706.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test706.java
deleted file mode 100644
index 260a393..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test706.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package return_in;
-
-public class A_test706 {
-	public boolean foo() {
-		/*[*/try {
-			foo();
-			return true;
-		} catch(Exception e) {
-			return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test707.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test707.java
deleted file mode 100644
index c727af6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test707.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package return_in;
-
-public class A_test707 {
-	boolean flag;
-	public boolean foo() {
-		/*[*/target: {
-			do {
-				if (flag)
-					break target;
-				return false;
-			} while (flag);
-		}
-		return true;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test708.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test708.java
deleted file mode 100644
index 0d80514..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test708.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package return_in;
-
-public class A_test708 {
-	boolean flag;
-	public boolean foo() {
-		/*[*/do {
-			if (flag)
-				foo();
-			return true;
-		} while(flag);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test709.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test709.java
deleted file mode 100644
index 79db65f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test709.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package return_in;
-
-public class A_test709 {
-	public boolean foo() {
-		int i= 0;
-		/*[*/switch (i) {
-			case 1:
-				return true;
-			default:
-				return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test710.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test710.java
deleted file mode 100644
index 9243e89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test710.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package return_in;
-
-public class A_test710 {
-	public boolean foo() {
-		int i= 0;
-		/*[*/switch (i) {
-			case 1:
-			case 2:
-				return true;
-			default:
-				return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test711.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test711.java
deleted file mode 100644
index 8cff14c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test711.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package return_in;
-
-public class A_test711 {
-	public boolean foo() {
-		int i= 0;
-		/*[*/switch (i) {
-			case 1:
-				foo();
-			case 2:
-				return true;
-			default:
-				return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test712.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test712.java
deleted file mode 100644
index 6346f21..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test712.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package return_in;
-
-import java.util.List;
-
-public class A_test712 {
-	public List foo() {
-		/*[*/return null;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test713.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test713.java
deleted file mode 100644
index 6a4488c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test713.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package return_in;
-
-public class A_test713 {
-	public java.util.List foo() {
-		/*[*/return null;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test714.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test714.java
deleted file mode 100644
index 8eb6e1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test714.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package return_in;
-
-public class A_test714 {
-	public boolean foo() {
-		/*[*/boolean b= false;
-		foo();
-		return (b == true);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test715.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test715.java
deleted file mode 100644
index ff32407..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test715.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package return_in;
-
-public class A_test715 {
-	public interface I {
-		public boolean run();
-	}
-	public void foo() {
-		/*[*/bar (this, new I() {
-			public boolean run() {
-				return true;
-			}
-		});/*]*/
-	}
-	public void bar(A_test715 a, I i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test716.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test716.java
deleted file mode 100644
index 0ef56eb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test716.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package return_in;
-
-public class A_test716 {
-	public boolean flag;
-	public boolean foo() {
-		/*[*/if (flag)
-			return false;
-		else
-			throw new NullPointerException();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test717.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test717.java
deleted file mode 100644
index 671ac2f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test717.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package return_in;
-
-public class A_test717 {
-	public boolean foo() {
-		int i= 0;
-		/*[*/switch(i) {
-			case 10:
-				return false;
-			default:
-				throw new NullPointerException();	
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test718.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test718.java
deleted file mode 100644
index 3db6861..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test718.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package return_in;
-
-public class A_test718 {
-	public boolean foo() {
-		int i= 0;
-		/*[*/switch(i) {
-			case 10:
-				throw new NullPointerException();	
-			default:
-				return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test719.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test719.java
deleted file mode 100644
index a8dfced..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test719.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package return_in;
-public class A_test719 {
-	public boolean foo() {
-		/*[*/if (foo())
-			return true;
-		if (foo())
-			return true;
-		else
-			return false;/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test720.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test720.java
deleted file mode 100644
index 83632b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test720.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package return_in;
-
-public class A_test720 {
-	private boolean flag;
-	public boolean foo() {
-		if (flag) {
-			/*[*/try {
-				foo();
-			} catch(Exception e) {
-			}
-			return false;/*]*/
-		}
-		return true;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test721.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test721.java
deleted file mode 100644
index bab478d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test721.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package return_in;
-
-public class A_test721 {
-	public volatile boolean flag;
-	
-	public void foo() {
-		int i;
-		/*[*/i= 10;/*]*/
-		if (flag)
-			i= 20;
-		i--;
-	}
-
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test722.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test722.java
deleted file mode 100644
index c46db8e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test722.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package return_in;
-
-public class A_test722 {
-	void f(){
-		for (int i = 0; i < 10; i++) {
-			/*[*/for (int j = 0; j < 10; j++) {
-			}/*]*/
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test723.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test723.java
deleted file mode 100644
index 40223ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test723.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package return_in;
-
-public class A_test723 {
-	public void foo() {
-		{
-			int i= 0;
-			/*[*/i--;/*]*/
-			i++;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test724.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test724.java
deleted file mode 100644
index e2565c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test724.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package return_in;
-
-public class A_test724 {
-	protected void foo() {
-		int i= 0;
-		int j= 1;
-		switch (j) {
-			case 1 :
-				/*[*/
-				i= 1;/*]*/
-				break;
-			default :
-				i= -1;
-				break;
-		}
-		System.out.println(i);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test725.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test725.java
deleted file mode 100644
index 9b3d2a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test725.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package return_in;
-
-public class A_test725 {
-	private boolean flag;
-	protected void foo() {
-		int i= 0;
-		if (flag) {
-			/*[*/i= 10;/*]*/
-			i= 20;
-		} else {
-			read(i);
-		}
-		read(i);
-	}
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test726.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test726.java
deleted file mode 100644
index 93713db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test726.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package return_in;
-
-public class A_test726 {
-
-	boolean flag;
-
-	protected void foo() {
-		int j= 0;
-		for(int i= 0; i < 10; i++) {
-			if (flag) {
-				/*[*/j= 10;/*]*/
-			} else {
-				read(j);
-			}
-		}
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test727.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test727.java
deleted file mode 100644
index c58037d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test727.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package return_in;
-
-public class A_test727 {
-	public void foo() {
-		/*[*/if (true) return;
-		bar();/*]*/
-	}
-
-	public void bar() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test728.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test728.java
deleted file mode 100644
index 73b63e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_in/A_test728.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package return_in;
-
-public class A_test728 {
-	public void foo() {
-		Object runnable= null;
-		Object[] disposeList= null;
-		/*[*/for (int i=0; i < disposeList.length; i++) {
-			if (disposeList [i] == null) {
-				disposeList [i] = runnable;
-				return;
-			}
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test700.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test700.java
deleted file mode 100644
index 07feb81..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test700.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package return_out;
-
-public class A_test700 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/return;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test701.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test701.java
deleted file mode 100644
index 9f106b9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test701.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package return_out;
-
-public class A_test701 {
-	public boolean foo() {
-		return extracted();
-	}
-
-	protected boolean extracted() {
-		/*[*/return true;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test702.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test702.java
deleted file mode 100644
index e7953fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test702.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package return_out;
-
-public class A_test702 {
-	public boolean foo() {
-		return extracted();
-	}
-
-	protected boolean extracted() {
-		/*[*/if (10 == 10)
-			return true;
-		else
-			return false;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test703.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test703.java
deleted file mode 100644
index e773bc2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test703.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package return_out;
-
-public class A_test703 {
-	public boolean foo() {
-		return extracted();
-	}
-
-	protected boolean extracted() {
-		/*[*/if (0 == 0) {
-			if (10 == 10)
-				return true;
-			else
-				return false;
-		}
-		foo();
-		return false;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test704.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test704.java
deleted file mode 100644
index daca0c9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test704.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package return_out;
-
-public class A_test704 {
-	private boolean flag;
-	public boolean foo() {
-		return extracted();
-	}
-	protected boolean extracted() {
-		/*[*/do {
-			return true;
-		} while (flag);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test705.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test705.java
deleted file mode 100644
index 65f912d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test705.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package return_out;
-
-public class A_test705 {
-	public boolean foo() {
-		return extracted();
-	}
-
-	protected boolean extracted() {
-		/*[*/try {
-			foo();
-		} catch(Exception e) {
-		} finally {
-			return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test706.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test706.java
deleted file mode 100644
index fc41c2a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test706.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package return_out;
-
-public class A_test706 {
-	public boolean foo() {
-		return extracted();
-	}
-
-	protected boolean extracted() {
-		/*[*/try {
-			foo();
-			return true;
-		} catch(Exception e) {
-			return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test707.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test707.java
deleted file mode 100644
index 5e0a282..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test707.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package return_out;
-
-public class A_test707 {
-	boolean flag;
-	public boolean foo() {
-		return extracted();
-	}
-	protected boolean extracted() {
-		/*[*/target: {
-			do {
-				if (flag)
-					break target;
-				return false;
-			} while (flag);
-		}
-		return true;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test708.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test708.java
deleted file mode 100644
index 7537b00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test708.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package return_out;
-
-public class A_test708 {
-	boolean flag;
-	public boolean foo() {
-		return extracted();
-	}
-	protected boolean extracted() {
-		/*[*/do {
-			if (flag)
-				foo();
-			return true;
-		} while(flag);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test709.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test709.java
deleted file mode 100644
index 2bcc6c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test709.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package return_out;
-
-public class A_test709 {
-	public boolean foo() {
-		int i= 0;
-		return extracted(i);
-	}
-
-	protected boolean extracted(int i) {
-		/*[*/switch (i) {
-			case 1:
-				return true;
-			default:
-				return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test710.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test710.java
deleted file mode 100644
index b84ceb8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test710.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package return_out;
-
-public class A_test710 {
-	public boolean foo() {
-		int i= 0;
-		return extracted(i);
-	}
-
-	protected boolean extracted(int i) {
-		/*[*/switch (i) {
-			case 1:
-			case 2:
-				return true;
-			default:
-				return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test711.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test711.java
deleted file mode 100644
index cc6dc61..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test711.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package return_out;
-
-public class A_test711 {
-	public boolean foo() {
-		int i= 0;
-		return extracted(i);
-	}
-
-	protected boolean extracted(int i) {
-		/*[*/switch (i) {
-			case 1:
-				foo();
-			case 2:
-				return true;
-			default:
-				return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test712.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test712.java
deleted file mode 100644
index 7232b99..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test712.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package return_out;
-
-import java.util.List;
-
-public class A_test712 {
-	public List foo() {
-		return extracted();
-	}
-
-	protected List extracted() {
-		/*[*/return null;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test713.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test713.java
deleted file mode 100644
index ad35cb8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test713.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package return_out;
-
-public class A_test713 {
-	public java.util.List foo() {
-		return extracted();
-	}
-
-	protected java.util.List extracted() {
-		/*[*/return null;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test714.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test714.java
deleted file mode 100644
index 3915c5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test714.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package return_out;
-
-public class A_test714 {
-	public boolean foo() {
-		return extracted();
-	}
-
-	protected boolean extracted() {
-		/*[*/boolean b= false;
-		foo();
-		return (b == true);/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test715.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test715.java
deleted file mode 100644
index ac3631e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test715.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package return_out;
-
-public class A_test715 {
-	public interface I {
-		public boolean run();
-	}
-	public void foo() {
-		extracted();
-	}
-	protected void extracted() {
-		/*[*/bar (this, new I() {
-			public boolean run() {
-				return true;
-			}
-		});/*]*/
-	}
-	public void bar(A_test715 a, I i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test716.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test716.java
deleted file mode 100644
index e274375..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test716.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package return_out;
-
-public class A_test716 {
-	public boolean flag;
-	public boolean foo() {
-		return extracted();
-	}
-	protected boolean extracted() {
-		/*[*/if (flag)
-			return false;
-		else
-			throw new NullPointerException();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test717.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test717.java
deleted file mode 100644
index ac4d5e4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test717.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package return_out;
-
-public class A_test717 {
-	public boolean foo() {
-		int i= 0;
-		return extracted(i);
-	}
-
-	protected boolean extracted(int i) {
-		/*[*/switch(i) {
-			case 10:
-				return false;
-			default:
-				throw new NullPointerException();	
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test718.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test718.java
deleted file mode 100644
index ea2c57b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test718.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package return_out;
-
-public class A_test718 {
-	public boolean foo() {
-		int i= 0;
-		return extracted(i);
-	}
-
-	protected boolean extracted(int i) {
-		/*[*/switch(i) {
-			case 10:
-				throw new NullPointerException();	
-			default:
-				return false;
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test719.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test719.java
deleted file mode 100644
index a9dae13..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test719.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package return_out;
-public class A_test719 {
-	public boolean foo() {
-		return extracted();
-	}
-
-	protected boolean extracted() {
-		/*[*/if (foo())
-			return true;
-		if (foo())
-			return true;
-		else
-			return false;/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test720.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test720.java
deleted file mode 100644
index 5678855..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test720.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package return_out;
-
-public class A_test720 {
-	private boolean flag;
-	public boolean foo() {
-		if (flag) {
-			return extracted();
-		}
-		return true;
-	}
-	protected boolean extracted() {
-		/*[*/try {
-			foo();
-		} catch(Exception e) {
-		}
-		return false;/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test721.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test721.java
deleted file mode 100644
index 37d1e54..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test721.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package return_out;
-
-public class A_test721 {
-	public volatile boolean flag;
-	
-	public void foo() {
-		int i;
-		i = extracted();
-		if (flag)
-			i= 20;
-		i--;
-	}
-
-	protected int extracted() {
-		int i;
-		/*[*/i= 10;/*]*/
-		return i;
-	}
-
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test722.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test722.java
deleted file mode 100644
index e084401..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test722.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package return_out;
-
-public class A_test722 {
-	void f(){
-		for (int i = 0; i < 10; i++) {
-			extracted();
-		}
-	}
-
-	protected void extracted() {
-		/*[*/for (int j = 0; j < 10; j++) {
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test723.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test723.java
deleted file mode 100644
index 61b28ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test723.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package return_out;
-
-public class A_test723 {
-	public void foo() {
-		{
-			int i= 0;
-			i = extracted(i);
-			i++;
-		}
-	}
-
-	protected int extracted(int i) {
-		/*[*/i--;/*]*/
-		return i;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test724.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test724.java
deleted file mode 100644
index cebc248..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test724.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package return_out;
-
-public class A_test724 {
-	protected void foo() {
-		int i= 0;
-		int j= 1;
-		switch (j) {
-			case 1 :
-				i = extracted();
-				break;
-			default :
-				i= -1;
-				break;
-		}
-		System.out.println(i);
-	}
-
-	protected int extracted() {
-		int i;
-		/*[*/
-		i= 1;/*]*/
-		return i;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test725.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test725.java
deleted file mode 100644
index 88fc12e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test725.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package return_out;
-
-public class A_test725 {
-	private boolean flag;
-	protected void foo() {
-		int i= 0;
-		if (flag) {
-			extracted();
-			i= 20;
-		} else {
-			read(i);
-		}
-		read(i);
-	}
-	protected void extracted() {
-		int i;
-		/*[*/i= 10;/*]*/
-	}
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test726.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test726.java
deleted file mode 100644
index 2d5b986..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test726.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package return_out;
-
-public class A_test726 {
-
-	boolean flag;
-
-	protected void foo() {
-		int j= 0;
-		for(int i= 0; i < 10; i++) {
-			if (flag) {
-				j = extracted();
-			} else {
-				read(j);
-			}
-		}
-	}
-
-	protected int extracted() {
-		int j;
-		/*[*/j= 10;/*]*/
-		return j;
-	}
-
-	private void read(int i) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test727.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test727.java
deleted file mode 100644
index 7b1f6d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test727.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package return_out;
-
-public class A_test727 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/if (true) return;
-		bar();/*]*/
-	}
-
-	public void bar() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test728.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test728.java
deleted file mode 100644
index 5db468b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/return_out/A_test728.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package return_out;
-
-public class A_test728 {
-	public void foo() {
-		Object runnable= null;
-		Object[] disposeList= null;
-		extracted(runnable, disposeList);
-	}
-
-	protected void extracted(Object runnable, Object[] disposeList) {
-		/*[*/for (int i=0; i < disposeList.length; i++) {
-			if (disposeList [i] == null) {
-				disposeList [i] = runnable;
-				return;
-			}
-		}/*]*/
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test1.java
deleted file mode 100644
index c12b372..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package selection;
-
-public class A_test1 {
-	public void foo() {
-		/*[*/foo()/*]*/;
-	}
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test2.java
deleted file mode 100644
index 06787fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package selection;
-
-public class A_test2 {
-	public void foo() {
-		/*[*/foo()/*[*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test3.java
deleted file mode 100644
index b8e0567..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test3.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package selection;
-
-public class A_test3 {
-	public void foo() {
-		/*]*/foo()/*]*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test4.java
deleted file mode 100644
index 5f984e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/selection/A_test4.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package selection;
-
-public class A_test4 {
-	public void foo() {
-		/*]*/foo()/*[*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test400.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test400.java
deleted file mode 100644
index a378122..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test400.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package semicolon_in;
-
-public class A_test400 {
-	public void foo() {
-		/*]*/foo()/*]*/;
-	} 
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test401.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test401.java
deleted file mode 100644
index 636ae43..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test401.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package semicolon_in;
-
-public class A_test401 {
-	public void foo() {
-		/*[*/foo();/*]*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test402.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test402.java
deleted file mode 100644
index d3368f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test402.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package semicolon_in;
-
-public class A_test402 {
-	public void foo() {
-		/*[*/{
-			foo();
-		}/*]*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test403.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test403.java
deleted file mode 100644
index 495cf26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test403.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package semicolon_in;
-
-public class A_test403 {
-	public void foo() {
-		/*[*/try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		}/*]*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test404.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test404.java
deleted file mode 100644
index e99c15d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test404.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package semicolon_in;
-
-public class A_test404 {
-	public void foo() {
-		/*[*/int x= 0;/*]*/
-		x= 10;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test406.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test406.java
deleted file mode 100644
index 88f12d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test406.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package semicolon_in;
-
-public class A_test406 {
-	public void foo() {
-		if (/*[*/1 == 10/*]*/)
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test407.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test407.java
deleted file mode 100644
index 64a071a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test407.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package semicolon_in;
-
-public class A_test407 {
-	public void foo() {
-		boolean b;
-		b= /*[*/10 == 20/*]*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test409.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test409.java
deleted file mode 100644
index a76ecca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test409.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package semicolon_in;
-
-public class A_test409 {
-	public void foo() {
-		/*[*/synchronized (this) {
-			foo();
-		}/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test410.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test410.java
deleted file mode 100644
index b36e847..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_in/A_test410.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package semicolon_in;
-
-public class A_test410 {
-	public void foo() {
-		/*[*/switch (10) {
-			case 1:
-				foo();
-		}/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test400.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test400.java
deleted file mode 100644
index 316cc33..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test400.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package semicolon_out;
-
-public class A_test400 {
-	public void foo() {
-		/*]*/extracted();
-	}
-
-	protected void extracted() {
-		foo()/*]*/;
-	} 
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test401.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test401.java
deleted file mode 100644
index 57a3b8d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test401.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package semicolon_out;
-
-public class A_test401 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/foo();/*]*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test402.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test402.java
deleted file mode 100644
index 9172545..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test402.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package semicolon_out;
-
-public class A_test402 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/{
-			foo();
-		}/*]*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test403.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test403.java
deleted file mode 100644
index 1d28f69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test403.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package semicolon_out;
-
-public class A_test403 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		}/*]*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test404.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test404.java
deleted file mode 100644
index a495ae6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test404.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package semicolon_out;
-
-public class A_test404 {
-	public void foo() {
-		int x;
-		extracted();
-		x= 10;
-	}
-
-	protected void extracted() {
-		/*[*/int x= 0;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test406.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test406.java
deleted file mode 100644
index 5897d37..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test406.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package semicolon_out;
-
-public class A_test406 {
-	public void foo() {
-		if (extracted())
-			foo();
-	}
-
-	protected boolean extracted() {
-		return /*[*/1 == 10/*]*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test407.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test407.java
deleted file mode 100644
index 07e2b35..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test407.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package semicolon_out;
-
-public class A_test407 {
-	public void foo() {
-		boolean b;
-		b= extracted();
-	}
-
-	protected boolean extracted() {
-		return /*[*/10 == 20/*]*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test409.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test409.java
deleted file mode 100644
index 7d9b74b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test409.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package semicolon_out;
-
-public class A_test409 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/synchronized (this) {
-			foo();
-		}/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test410.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test410.java
deleted file mode 100644
index f46a656..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/semicolon_out/A_test410.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package semicolon_out;
-
-public class A_test410 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/switch (10) {
-			case 1:
-				foo();
-		}/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/testing/E.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/testing/E.java
deleted file mode 100644
index 4b3d789..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/testing/E.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package testing;
-
-import java.awt.peer.LabelPeer;
-
-public class E {
-	private F f;
-	public void foo() {
-		try {
-			f.fun();
-		} catch (Exception e) {
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/testing/F.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/testing/F.java
deleted file mode 100644
index e26e596..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/testing/F.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package testing;
-
-import java.lang.reflect.InvocationTargetException;
-
-public class F {
-	public void fun() throws InvocationTargetException {
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test450.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test450.java
deleted file mode 100644
index b709019..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test450.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package try_in;
-
-public class A_test450 {
-	public void foo() {
-		try {
-			/*[*/g();/*]*/
-		} catch (java.io.IOException e) {
-		}
-	}
-	public void g() throws java.io.IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test451.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test451.java
deleted file mode 100644
index e776b0b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test451.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package try_in;
-
-public class A_test451 {
-	public void foo() {
-		/*[*/try {
-			g();
-		} catch (java.io.IOException e) {
-		}/*]*/
-	}
-
-	public void g() throws java.io.IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test452.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test452.java
deleted file mode 100644
index d244cd7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test452.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-
-public class A_test452 {
-	public void foo() {
-		try {
-			/*[*/g();/*]*/
-		} catch (IOException e) {
-		}
-	}
-
-	public void g() throws IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test453.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test453.java
deleted file mode 100644
index 0b9fe6a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test453.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-
-public class A_test453 {
-
-	public void foo() {
-		/*[*/try {
-			g();
-		} catch (Exception e) {
-		}/*]*/
-	}
-
-	public void g() throws IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test454.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test454.java
deleted file mode 100644
index 1989417..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test454.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-
-public class A_test454 {
-
-	public void foo() {
-		try {
-			/*[*/throw new IOException("Message");/*]*/
-		} catch (Exception e) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test455.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test455.java
deleted file mode 100644
index f0b3898..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test455.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-
-public class A_test455 {
-
-	public void foo() {
-		try {
-			/*[*/throw createException();/*]*/
-		} catch (Exception e) {
-		}
-	}
-
-	public IOException createException() {
-		return new IOException("Message");
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test456.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test456.java
deleted file mode 100644
index 418338d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test456.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-
-public class A_test456 {
-
-	public void foo() {
-		Exception e= new IOException("Message");
-		try {
-			/*[*/throw e;/*]*/
-		} catch (Exception x) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test457.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test457.java
deleted file mode 100644
index 19cdfac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test457.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-
-public class A_test457 {
-
-	public void foo() {
-		Exception[] e= new Exception[] { new IOException("Message") };
-		try {
-			/*[*/throw e[0];/*]*/
-		} catch (Exception x) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test458.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test458.java
deleted file mode 100644
index e59f3c2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test458.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package try_in;
-
-public class A_test458 {
-	public void foo() throws Throwable{
-		try{
-			new A_test458();
-		} catch (Throwable t){
-			/*[*/throw t;/*]*/
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test459.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test459.java
deleted file mode 100644
index b75c53a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test459.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package try_in;
-
-public class A_test459 {
-	public abstract class Protectable {
-		public abstract void protect() throws Exception;
-		public void setUp() throws Exception {
-		}
-	}
-	public void foo() {
-		/*[*/Protectable p= new Protectable() {
-			public void protect() throws Exception {
-				setUp();
-			}
-		};/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test460.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test460.java
deleted file mode 100644
index f3ce449..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test460.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.lang.reflect.InvocationTargetException;
-
-public abstract class A_test460 {
-	public void foo() throws InvocationTargetException {
-		/*[*/InputStreamReader in= null;
-		try {
-			bar();
-		} catch (IOException e) {
-			throw new InvocationTargetException(null);
-		} finally {
-			if (in != null) {
-				try {
-					in.close();
-				} catch (IOException e) {
-				}
-			}
-		}/*]*/
-	}
-
-	public abstract void bar() throws IOException;
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test461.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test461.java
deleted file mode 100644
index 42a0cbe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test461.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-
-public class A_test461 {
-	void f() throws IOException{
-		/*[*/try{
-			f();
-		} catch (IOException e){
-			throw new IOException();
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test462.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test462.java
deleted file mode 100644
index 6c61375..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_in/A_test462.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package try_in;
-
-import java.io.IOException;
-
-public class A_test462 {
-	void f() throws IOException{
-		/*[*/try{
-			f();
-		} catch (IOException e){
-		} finally {
-			throw new IOException();
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test450.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test450.java
deleted file mode 100644
index 3bd431a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test450.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test450 {
-	public void foo() {
-		try {
-			extracted();
-		} catch (java.io.IOException e) {
-		}
-	}
-	protected void extracted() throws IOException {
-		/*[*/g();/*]*/
-	}
-	public void g() throws java.io.IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test451.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test451.java
deleted file mode 100644
index 39dcc7b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test451.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package try_out;
-
-public class A_test451 {
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/try {
-			g();
-		} catch (java.io.IOException e) {
-		}/*]*/
-	}
-
-	public void g() throws java.io.IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test452.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test452.java
deleted file mode 100644
index deb4660..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test452.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test452 {
-	public void foo() {
-		try {
-			extracted();
-		} catch (IOException e) {
-		}
-	}
-
-	protected void extracted() throws IOException {
-		/*[*/g();/*]*/
-	}
-
-	public void g() throws IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test453.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test453.java
deleted file mode 100644
index 67492b1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test453.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test453 {
-
-	public void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/try {
-			g();
-		} catch (Exception e) {
-		}/*]*/
-	}
-
-	public void g() throws IOException {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test454.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test454.java
deleted file mode 100644
index 31f72c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test454.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test454 {
-
-	public void foo() {
-		try {
-			extracted();
-		} catch (Exception e) {
-		}
-	}
-
-	protected void extracted() throws IOException {
-		/*[*/throw new IOException("Message");/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test455.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test455.java
deleted file mode 100644
index 5e9d028..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test455.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test455 {
-
-	public void foo() {
-		try {
-			extracted();
-		} catch (Exception e) {
-		}
-	}
-
-	protected void extracted() throws IOException {
-		/*[*/throw createException();/*]*/
-	}
-
-	public IOException createException() {
-		return new IOException("Message");
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test456.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test456.java
deleted file mode 100644
index bc4702e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test456.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test456 {
-
-	public void foo() {
-		Exception e= new IOException("Message");
-		try {
-			extracted(e);
-		} catch (Exception x) {
-		}
-	}
-
-	protected void extracted(Exception e) throws Exception {
-		/*[*/throw e;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test457.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test457.java
deleted file mode 100644
index f1f3b0f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test457.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test457 {
-
-	public void foo() {
-		Exception[] e= new Exception[] { new IOException("Message") };
-		try {
-			extracted(e);
-		} catch (Exception x) {
-		}
-	}
-
-	protected void extracted(Exception[] e) throws Exception {
-		/*[*/throw e[0];/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test458.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test458.java
deleted file mode 100644
index 408275c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test458.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package try_out;
-
-public class A_test458 {
-	public void foo() throws Throwable{
-		try{
-			new A_test458();
-		} catch (Throwable t){
-			extracted(t);
-		}
-	}
-
-	protected void extracted(Throwable t) throws Throwable {
-		/*[*/throw t;/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test459.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test459.java
deleted file mode 100644
index ff79ebf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test459.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package try_out;
-
-public class A_test459 {
-	public abstract class Protectable {
-		public abstract void protect() throws Exception;
-		public void setUp() throws Exception {
-		}
-	}
-	public void foo() {
-		extracted();
-	}
-	protected void extracted() {
-		/*[*/Protectable p= new Protectable() {
-			public void protect() throws Exception {
-				setUp();
-			}
-		};/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test460.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test460.java
deleted file mode 100644
index c5a0e01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test460.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.lang.reflect.InvocationTargetException;
-
-public abstract class A_test460 {
-	public void foo() throws InvocationTargetException {
-		extracted();
-	}
-
-	protected void extracted() throws InvocationTargetException {
-		/*[*/InputStreamReader in= null;
-		try {
-			bar();
-		} catch (IOException e) {
-			throw new InvocationTargetException(null);
-		} finally {
-			if (in != null) {
-				try {
-					in.close();
-				} catch (IOException e) {
-				}
-			}
-		}/*]*/
-	}
-
-	public abstract void bar() throws IOException;
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test461.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test461.java
deleted file mode 100644
index 05f761c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test461.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test461 {
-	void f() throws IOException{
-		extracted();
-	}
-
-	protected void extracted() throws IOException {
-		/*[*/try{
-			f();
-		} catch (IOException e){
-			throw new IOException();
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test462.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test462.java
deleted file mode 100644
index ba7009c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/try_out/A_test462.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package try_out;
-
-import java.io.IOException;
-
-public class A_test462 {
-	void f() throws IOException{
-		extracted();
-	}
-
-	protected void extracted() throws IOException {
-		/*[*/try{
-			f();
-		} catch (IOException e){
-		} finally {
-			throw new IOException();
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test200.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test200.java
deleted file mode 100644
index 8d570be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test200.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package validSelection;
-
-public class A_test200 {
-	public void foo() {
-		/*]*/foo();/*[*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test201.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test201.java
deleted file mode 100644
index 62c304e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test201.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package validSelection;
-
-public class A_test201 {
-	public void foo() {/*[*/
-		foo();
-	/*]*/} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test202.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test202.java
deleted file mode 100644
index d8733ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test202.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test202 {
-	public void foo() {
-		/*]*/foo();
-		foo();/*[*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test203.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test203.java
deleted file mode 100644
index 2edb220..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test203.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test203 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)
-			foo();
-		foo();/*[*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test230.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test230.java
deleted file mode 100644
index 3035340..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test230.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test230 {
-	public void foo() {
-		{/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test231.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test231.java
deleted file mode 100644
index 3d61594..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test231.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test231 {
-	public void foo() {
-		{
-			/*]*/foo()/*[*/;
-		}
-		{
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test232.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test232.java
deleted file mode 100644
index a3b5456..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test232.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test232 {
-	public void foo() {
-		/*]*/{
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test233.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test233.java
deleted file mode 100644
index 75b3868..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test233.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test233 {
-	public void foo() {
-		{
-			foo();
-		}
-		{
-			/*]*/foo()/*[*/;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test234.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test234.java
deleted file mode 100644
index 265b903..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test234.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test234 {
-	public void foo() {
-		{
-			foo();
-		}
-		{/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test235.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test235.java
deleted file mode 100644
index 876b188..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test235.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test235 {
-	public void foo() {
-		{/*[*/
-			foo();
-		/*]*/}
-		{
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test240.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test240.java
deleted file mode 100644
index 00c0091..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test240.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test240 {
-	public void foo() {/*[*/
-		for (int i= 0; i < 10; i++)
-			foo();
-	/*]*/}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test241.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test241.java
deleted file mode 100644
index b3bb0e2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test241.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test241 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)
-			foo();/*[*/
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test244.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test244.java
deleted file mode 100644
index 897ade3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test244.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test244 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			/*]*/foo()/*]*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test245.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test245.java
deleted file mode 100644
index af752d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test245.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test245 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			/*]*/foo();/*[*/
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test246.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test246.java
deleted file mode 100644
index 40a1cd1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test246.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test246 {
-	public void foo() {
-		for (int i= 0; i < 10; i++) {
-			/*]*/foo();/*[*/
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test247.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test247.java
deleted file mode 100644
index 4d5b6aa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test247.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test247 {
-	public void foo() {
-		for (int i= 10; i < 10; i++)/*[*/
-			for (int z= 10; z < 10; z++)
-				foo();
-		/*]*/foo();	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test248.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test248.java
deleted file mode 100644
index 205fb31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test248.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test248 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			foo();
-			
-		/*]*/foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test249.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test249.java
deleted file mode 100644
index 2428f11..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test249.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test249 {
-	public void foo() {
-		/*]*/foo();/*[*/
-		
-		for (int i= 0; i < 10; i++)
-			foo();	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test250.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test250.java
deleted file mode 100644
index 18755cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test250.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test250 {
-	public void foo() {
-		while(1 < 10)/*[*/
-			foo();
-	/*]*/}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test251.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test251.java
deleted file mode 100644
index 7a6d6e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test251.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test251 {
-	public void foo() {
-		/*]*/while(1 < 10)
-			foo();/*]*/
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test252.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test252.java
deleted file mode 100644
index 7358876..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test252.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test252 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		while(b())
-			while(b())/*[*/
-				foo();
-		/*]*/foo();		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test253.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test253.java
deleted file mode 100644
index dffc377..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test253.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test253 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		while(b())
-			/*]*/while(b())
-				foo();
-		/*]*/foo();		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test254.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test254.java
deleted file mode 100644
index e22bdc9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test254.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test254 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		while(b())
-			foo();
-			
-		/*]*/foo();/*[*/		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test255.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test255.java
deleted file mode 100644
index d7c8458..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test255.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test255 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		/*]*/foo();/*[*/
-		
-		while(b())
-			foo();	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test260.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test260.java
deleted file mode 100644
index 31a00b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test260.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test260 {
-	public void foo() {
-		/*]*/do
-			foo();
-		while(1 < 10);/*[*/	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test261.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test261.java
deleted file mode 100644
index 1ce96b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test261.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test261 {
-	public void foo() {
-		do /*[*/
-			foo();
-		/*]*/while(1 < 10);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test262.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test262.java
deleted file mode 100644
index 0df5d91..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test262.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test262 {
-	public boolean fBoolean;
-	public void foo() {
-		do 
-			foo();
-		while(fBoolean);
-		
-		/*]*/foo()/*[*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test263.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test263.java
deleted file mode 100644
index 7af8e45..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test263.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test263 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/foo()/*[*/;
-		
-		do 
-			foo();
-		while(fBoolean);		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test270.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test270.java
deleted file mode 100644
index f9446bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test270.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test270 {
-	public void foo() {
-		/*]*/switch(1) {
-			case 1:
-				foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test271.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test271.java
deleted file mode 100644
index d99c995..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test271.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test271 {
-	public void foo() {
-		switch(1) {
-			case 1:/*[*/
-				foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test272.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test272.java
deleted file mode 100644
index 0648fc5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test272.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test272 {
-	public void foo() {
-		switch(1) {
-			case 1:
-				foo();
-				/*]*/foo()/*[*/;
-				foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test273.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test273.java
deleted file mode 100644
index 191695b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test273.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test273 {
-	public void foo() {
-		switch(1) {
-			case 1:/*[*/
-				foo();
-			/*]*/case 2:
-				foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test274.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test274.java
deleted file mode 100644
index 2f916a8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test274.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test274 {
-	public void foo() {
-		switch(1) {
-			case 1:
-				foo();
-			case 2:
-				foo();
-		}
-		
-		/*]*/foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test275.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test275.java
deleted file mode 100644
index 80511ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test275.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test275 {
-	public void foo() {
-		/*]*/foo();/*[*/
-		
-		switch(1) {
-			case 1:
-				foo();
-			case 2:
-				foo();
-		}		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test280.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test280.java
deleted file mode 100644
index 33d1996..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test280.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test280 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();
-		else
-			foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test281.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test281.java
deleted file mode 100644
index 7048e9e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test281.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test281 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			/*]*/foo()/*[*/;
-		else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test282.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test282.java
deleted file mode 100644
index 4bd8856..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test282.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test282 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)/*[*/
-			foo();
-		/*]*/else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test283.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test283.java
deleted file mode 100644
index e060d6d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test283.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test283 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean) {
-		} else {
-			/*]*/foo();/*[*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test284.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test284.java
deleted file mode 100644
index 06eab56..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test284.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test284 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			foo();
-			
-		if (fBoolean) {
-		} else {
-			/*]*/foo();/*[*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test285.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test285.java
deleted file mode 100644
index 89b939d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test285.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test285 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			/*[*/foo();/*]*/
-			
-		if (fBoolean) {
-		} else {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test286.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test286.java
deleted file mode 100644
index dc0c3de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test286.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test286 {
-	public boolean fBoolean;
-	public void foo() {
-		/*[*/foo();/*]*/	
-		if (fBoolean)
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test287.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test287.java
deleted file mode 100644
index 45e4f08..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test287.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test287 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			foo();
-		/*[*/foo();/*]*/	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test300.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test300.java
deleted file mode 100644
index e95eda5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test300.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test300 {
-	public void foo() {
-		try {/*[*/
-			foo();
-		/*]*/} catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test301.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test301.java
deleted file mode 100644
index 84b93a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test301.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test301 {
-	public void foo() {
-		try {
-			/*]*/foo()/*[*/;
-		} catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test302.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test302.java
deleted file mode 100644
index 5e0f55f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test302.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test302 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test303.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test303.java
deleted file mode 100644
index 003b7b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test303.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test303 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			/*]*/foo()/*[*/;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test304.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test304.java
deleted file mode 100644
index 23cc5fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test304.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package validSelection;
-
-public class A_test304 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		} catch (Throwable t) {
-			/*]*/foo();/*[*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test305.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test305.java
deleted file mode 100644
index aa531b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test305.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package validSelection;
-
-public class A_test305 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			/*]*/foo();/*[*/
-		} catch (Throwable t) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test306.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test306.java
deleted file mode 100644
index 45338ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test306.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package validSelection;
-
-public class A_test306 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		} catch (Error e) {
-			/*]*/foo();/*[*/
-		} catch (Throwable t) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test307.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test307.java
deleted file mode 100644
index 141a152..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test307.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test307 {
-	public void foo() {
-		try {
-			foo();
-		} finally {/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test308.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test308.java
deleted file mode 100644
index 5e598b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test308.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test308 {
-	public void foo() {
-		try {
-			foo();
-		} finally {/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test309.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test309.java
deleted file mode 100644
index f0dc5b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test309.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package validSelection;
-
-public class A_test309 {
-	public void foo() {
-		/*]*/try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		} finally {
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test310.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test310.java
deleted file mode 100644
index 3499da6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test310.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test310 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		}
-		/*]*/foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test311.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test311.java
deleted file mode 100644
index ce222e8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test311.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test311 {
-	public void foo() {
-		/*]*/foo();/*[*/
-		try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test350.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test350.java
deleted file mode 100644
index d358f5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test350.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test350 {
-
-	public void foo() {
-		/*]*/synchronized (this) {
-			foo();
-		}/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test351.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test351.java
deleted file mode 100644
index 521eb6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test351.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test351 {
-
-	public void foo() {
-		foo();/*[*/
-		synchronized (this) {
-			foo();
-		}
-		/*]*/foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test352.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test352.java
deleted file mode 100644
index 97540b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test352.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test352 {
-
-	public void foo() {
-		synchronized (this) {/*[*/
-			foo();
-		/*]*/}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test353.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test353.java
deleted file mode 100644
index eee7d64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection/A_test353.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test353 {
-
-	public void foo() {
-		synchronized (this) {
-			/*]*/foo();/*[*/
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test360.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test360.java
deleted file mode 100644
index 35d4adb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test360.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection_in;
-
-public class A_test360 {
-	void f(){
-		/*[*/class AA extends A_test360 {
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test361.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test361.java
deleted file mode 100644
index 7a27e8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test361.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection_in;
-
-public class A_test361 {
-	void f(){
-		/*[*/class AA extends A_test361 {
-		};/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test362.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test362.java
deleted file mode 100644
index 0bdc0aa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test362.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection_in;
-
-public class A_test362 {
-	A_test362(int i){
-	}
-	void n(){
-		final int y= 0;
-		/*[*/new A_test362(y){
-			void f(){
-				int y= 9;
-			}
-		};/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test363.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test363.java
deleted file mode 100644
index 1506cb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test363.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package validSelection_in;
-
-public class A_test363 {
-	public Object foo() {
-		return /*[*/A_test363.class/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test364.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test364.java
deleted file mode 100644
index 5e46159..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test364.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection_in;
-
-// http://dev.eclipse.org/bugs/show_bug.cgi?id=6680
-public class A_test364 {
-	public int i(){ 
-		return 0;
-	}
-	public void m(){
-		/*[*/i();
-		m();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test365.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test365.java
deleted file mode 100644
index 9cbc7c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_in/A_test365.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection_in;
-
-public class A_test365 {
-	public void bar() throws NullPointerException {
-	}
-	
-	protected void foo() {
-		/*[*/bar();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test360.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test360.java
deleted file mode 100644
index 6e6cf48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test360.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection_out;
-
-public class A_test360 {
-	void f(){
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/class AA extends A_test360 {
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test361.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test361.java
deleted file mode 100644
index b514b10..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test361.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection_out;
-
-public class A_test361 {
-	void f(){
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/class AA extends A_test361 {
-		};/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test362.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test362.java
deleted file mode 100644
index c598978..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test362.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package validSelection_out;
-
-public class A_test362 {
-	A_test362(int i){
-	}
-	void n(){
-		final int y= 0;
-		extracted(y);
-	}
-	protected void extracted(final int y) {
-		/*[*/new A_test362(y){
-			void f(){
-				int y= 9;
-			}
-		};/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test363.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test363.java
deleted file mode 100644
index 5a4a0cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test363.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection_out;
-
-public class A_test363 {
-	public Object foo() {
-		return extracted();
-	}
-
-	protected Class extracted() {
-		return /*[*/A_test363.class/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test364.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test364.java
deleted file mode 100644
index 34e72a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test364.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package validSelection_out;
-
-// http://dev.eclipse.org/bugs/show_bug.cgi?id=6680
-public class A_test364 {
-	public int i(){ 
-		return 0;
-	}
-	public void m(){
-		extracted();
-	}
-	protected void extracted() {
-		/*[*/i();
-		m();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test365.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test365.java
deleted file mode 100644
index 3395e39..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/validSelection_out/A_test365.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection_out;
-
-public class A_test365 {
-	public void bar() throws NullPointerException {
-	}
-	
-	protected void foo() {
-		extracted();
-	}
-
-	protected void extracted() {
-		/*[*/bar();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2001.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2001.java
deleted file mode 100644
index bb74eed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2001.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package wiki_in;
-
-public class A_test2001 {
-
-	int field= 0;
-
-	void fun() {
-		int i;
-		/*[*/
-		i= 0;
-		System.out.println("i, field == " + i++ +", " + field);
-		/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2002.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2002.java
deleted file mode 100644
index d9b468b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2002.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package wiki_in;
-
-public class A_test2002 {
-
-	int field= 0;
-	void fun() {
-		int i= 0;
-		/*[*/
-		System.out.println("i, field == " + i++ +", " + field);
-		/*]*/
-		System.out.println("i == " + i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2003.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2003.java
deleted file mode 100644
index e56f190..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2003.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package wiki_in;
-
-public class A_test2003 {
-
-	int field= 0;
-
-	void fun() {
-		int i= 0;
-		/*[*/
-		if (field == 1) {
-			i= 1;
-			System.out.println("i, field == " + i + ", " + field);
-		} else {
-			System.out.println("i, field == " + i + ", " + field);
-		}
-		/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2004.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2004.java
deleted file mode 100644
index 4078d56..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2004.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package wiki_in;
-
-public class A_test2004 {
-
-	int field= 0;
-
-	void fun() {
-		int i= 0;
-		while (field < 2) {
-			field++;
-			/*[*/
-			System.out.println("i, field == " + i++ +", " + field);
-			/*]*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2005.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2005.java
deleted file mode 100644
index 1fcf97c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_in/A_test2005.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package wiki_in;
-
-import java.io.IOException;
-
-public class A_test2005 {
-
-	static void fun() throws IOException {
-	}
-
-	public static void main(String args[]) {
-		try {
-			/*[*/
-			fun();
-			/*]*/
-		} catch (Exception e) {
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2001.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2001.java
deleted file mode 100644
index f0fe986..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2001.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package wiki_out;
-
-public class A_test2001 {
-
-	int field= 0;
-
-	void fun() {
-		int i;
-		extracted();
-	}
-
-	protected void extracted() {
-		int i;
-		/*[*/
-		i= 0;
-		System.out.println("i, field == " + i++ +", " + field);
-		/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2002.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2002.java
deleted file mode 100644
index b235ac3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2002.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package wiki_out;
-
-public class A_test2002 {
-
-	int field= 0;
-	void fun() {
-		int i= 0;
-		i = extracted(i);
-		System.out.println("i == " + i);
-	}
-	protected int extracted(int i) {
-		/*[*/
-		System.out.println("i, field == " + i++ +", " + field);
-		/*]*/
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2003.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2003.java
deleted file mode 100644
index 54a8756..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2003.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package wiki_out;
-
-public class A_test2003 {
-
-	int field= 0;
-
-	void fun() {
-		int i= 0;
-		extracted(i);
-	}
-
-	protected void extracted(int i) {
-		/*[*/
-		if (field == 1) {
-			i= 1;
-			System.out.println("i, field == " + i + ", " + field);
-		} else {
-			System.out.println("i, field == " + i + ", " + field);
-		}
-		/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2004.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2004.java
deleted file mode 100644
index 05fd90f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2004.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package wiki_out;
-
-public class A_test2004 {
-
-	int field= 0;
-
-	void fun() {
-		int i= 0;
-		while (field < 2) {
-			field++;
-			i = extracted(i);
-		}
-	}
-
-	protected int extracted(int i) {
-		/*[*/
-		System.out.println("i, field == " + i++ +", " + field);
-		/*]*/
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2005.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2005.java
deleted file mode 100644
index de527bc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/wiki_out/A_test2005.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package wiki_out;
-
-import java.io.IOException;
-
-public class A_test2005 {
-
-	static void fun() throws IOException {
-	}
-
-	public static void main(String args[]) {
-		try {
-			extracted();
-		} catch (Exception e) {
-		}
-	}
-
-	protected static void extracted() throws IOException {
-		/*[*/
-		fun();
-		/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test0_in.java
deleted file mode 100644
index b49e010..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test0_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test0_out.java
deleted file mode 100644
index 90eaa10..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test0_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int temp= 0;
-		int x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test10_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test10_in.java
deleted file mode 100644
index b4d0cbd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test10_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		while(y==0){
-			int x= 1 + 2;
-		}
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test10_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test10_out.java
deleted file mode 100644
index 8d610a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test10_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		int temp= 1 + 2;
-		while(y==0){
-			int x= temp;
-		}
-		return temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test11_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test11_in.java
deleted file mode 100644
index a2ba64a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test11_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		do{
-			int x= 1 + 2;
-		} while(y==0);
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test11_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test11_out.java
deleted file mode 100644
index ef4264a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test11_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		int temp= 1 + 2;
-		do{
-			int x= temp;
-		} while(y==0);
-		return temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test12_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test12_in.java
deleted file mode 100644
index 2a1b58d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test12_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		{
-		 int x= 1 + 2;
-		}
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test12_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test12_out.java
deleted file mode 100644
index f2c09ff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test12_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		int temp= 1 + 2;
-		{
-		 int x= temp;
-		}
-		return temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test13_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test13_in.java
deleted file mode 100644
index 06d276f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test13_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-
-class A{
-	int m(int y){
-		int e= new ArrayList().iterator().hashCode();
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test13_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test13_out.java
deleted file mode 100644
index 6552bb2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test13_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-class A{
-	int m(int y){
-		Iterator temp= new ArrayList().iterator();
-		int e= temp.hashCode();
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test14_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test14_in.java
deleted file mode 100644
index 95e7fdb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test14_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-	int m(int y){
-		while(y==0)
-			m(1 + 2);
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test14_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test14_out.java
deleted file mode 100644
index 26bcb60..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test14_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A{
-	int m(int y){
-		int temp= 1 + 2;
-		while(y==0)
-			m(temp);
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test15_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test15_in.java
deleted file mode 100644
index ad9a09e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test15_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		while(y==0)
-			while(y==0)
-				while(y==0) 
-					m(1 + 2);
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test15_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test15_out.java
deleted file mode 100644
index bfe96e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test15_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		int temp= 1 + 2;
-		while(y==0)
-			while(y==0)
-				while(y==0) 
-					m(temp);
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test16_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test16_in.java
deleted file mode 100644
index 24587e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test16_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		while(y==0){
-			while(y==0)
-				while(y==0)
-					m(1 + 2);
-		}
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test16_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test16_out.java
deleted file mode 100644
index d91c927..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test16_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		while(y==0){
-			int temp= 1 + 2;
-			while(y==0)
-				while(y==0)
-					m(temp);
-		}
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test17_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test17_in.java
deleted file mode 100644
index 1031cf4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test17_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(){
-		{
-			int i= 1 + 2;
-		}
-		{
-			int i= 1 + 2;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test17_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test17_out.java
deleted file mode 100644
index 1f280d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test17_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	void m(){
-		int temp= 1 + 2;
-		{
-			int i= temp;
-		}
-		{
-			int i= temp;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test18_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test18_in.java
deleted file mode 100644
index 9fb2c98..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test18_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		m(0);
-		{
-			int x= 1 + 2;
-		}
-		{
-			{
-				int x= 1 + 2;
-			}
-		}
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test18_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test18_out.java
deleted file mode 100644
index a1627c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test18_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		m(0);
-		int temp= 1 + 2;
-		{
-			int x= temp;
-		}
-		{
-			{
-				int x= temp;
-			}
-		}
-		return temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test19_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test19_in.java
deleted file mode 100644
index 87976fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test19_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		if (f() == 0){
-			int t= f();
-		}
-	}
-	int f(){
-		return 5;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test19_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test19_out.java
deleted file mode 100644
index 301d1ed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test19_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int temp= f();
-		if (temp == 0){
-			int t= temp;
-		}
-	}
-	int f(){
-		return 5;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test1_in.java
deleted file mode 100644
index b49e010..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test1_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test1_out.java
deleted file mode 100644
index 90eaa10..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test1_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int temp= 0;
-		int x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test20_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test20_in.java
deleted file mode 100644
index 45f1b71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test20_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class T {
-	int r(){return 4;}
-	void f(){
-		r();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test20_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test20_out.java
deleted file mode 100644
index 233ae43..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test20_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class T {
-	int r(){return 4;}
-	void f(){
-		int temp= r();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test21_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test21_in.java
deleted file mode 100644
index 1a076d1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test21_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int f;
-	void m(int i){
-		int x= f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test21_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test21_out.java
deleted file mode 100644
index 8f7a8c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test21_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int f;
-	void m(int i){
-		int temp= f;
-		int x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test22_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test22_in.java
deleted file mode 100644
index ab4dc5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test22_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class T {
-	int r(){return 4;}
-	void f(){
-		{
-			r();
-		}	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test22_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test22_out.java
deleted file mode 100644
index 102b633..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test22_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class T {
-	int r(){return 4;}
-	void f(){
-		{
-			int temp= r();
-		}	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test23_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test23_in.java
deleted file mode 100644
index d0d19e3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test23_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int r(){return 4;}
-	boolean b(){return true;}
-	void f(int fd){
-		do {
-		} while(b());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test23_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test23_out.java
deleted file mode 100644
index c3af208..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test23_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int r(){return 4;}
-	boolean b(){return true;}
-	void f(int fd){
-		boolean temp= b();
-		do {
-		} while(temp);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test24_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test24_in.java
deleted file mode 100644
index b49e010..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test24_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test24_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test24_out.java
deleted file mode 100644
index 90eaa10..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test24_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int temp= 0;
-		int x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test25_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test25_in.java
deleted file mode 100644
index 2052c0a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test25_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	boolean f(){
-		return (1 + 1 == 1 + 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test25_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test25_out.java
deleted file mode 100644
index 1ea95d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test25_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	boolean f(){
-		int temp= 1 + 1;
-		return (temp == temp);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test26_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test26_in.java
deleted file mode 100644
index 7b57dda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test26_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A {
-	void f(){
-		try{
-			int j=0 +0;
-		} finally {
-			int j=0 +0;
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test26_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test26_out.java
deleted file mode 100644
index 194f19e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test26_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	void f(){
-		int temp= 0 +0;
-		try{
-			int j=temp;
-		} finally {
-			int j=temp;
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test27_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test27_in.java
deleted file mode 100644
index 3d56e98..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test27_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 0+0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test27_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test27_out.java
deleted file mode 100644
index fb11151..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test27_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int temp= 0+0;
-		int x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test28_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test28_in.java
deleted file mode 100644
index 27ccd79..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test28_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	boolean m(){
-		return a().length != 3;
-	}
-	int[] a(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test28_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test28_out.java
deleted file mode 100644
index 850bf40..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test28_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	boolean m(){
-		boolean temp= a().length != 3;
-		return temp;
-	}
-	int[] a(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test29_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test29_in.java
deleted file mode 100644
index a579350..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test29_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void f(){
-		String f= "k";
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test29_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test29_out.java
deleted file mode 100644
index 907f09e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test29_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	void f(){
-		String temp= "k";
-		String f= temp;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test2_in.java
deleted file mode 100644
index b49e010..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test2_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test2_out.java
deleted file mode 100644
index e047293..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test2_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		final int temp= 0;
-		int x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test30_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test30_in.java
deleted file mode 100644
index 1f7cbd1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test30_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	static final int FF= 2;
-	void f(){
-		int t= A.FF;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test30_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test30_out.java
deleted file mode 100644
index fd329fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test30_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	static final int FF= 2;
-	void f(){
-		int temp= A.FF;
-		int t= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test31_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test31_in.java
deleted file mode 100644
index e7dd7d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test31_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		int i;
-		int y= i =1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test31_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test31_out.java
deleted file mode 100644
index 5980b1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test31_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void f(){
-		int i;
-		int temp= i =1;
-		int y= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test32_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test32_in.java
deleted file mode 100644
index cb4def5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test32_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(int i){
-		int y= (i= 1) + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test32_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test32_out.java
deleted file mode 100644
index 4dd8ae4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test32_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(int i){
-		int temp= (i= 1);
-		int y= temp + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test33_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test33_in.java
deleted file mode 100644
index 5de9404..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test33_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void m(){
-		Object u= new Object(){};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test33_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test33_out.java
deleted file mode 100644
index 07de471..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test33_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	void m(){
-		Object temp= new Object(){};
-		Object u= temp;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test34_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test34_in.java
deleted file mode 100644
index 697251b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test34_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void m(){
-		Object a= new java.util.ArrayList(){};
-	}
-} 
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test34_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test34_out.java
deleted file mode 100644
index db61fe2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test34_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-
-class A {
-	void m(){
-		java.util.ArrayList temp= new java.util.ArrayList(){};
-		Object a= temp;
-	}
-} 
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test35_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test35_in.java
deleted file mode 100644
index 78cb2db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test35_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-import java.util.List;
-
-class A {
-	void f(){
-		C b= new C();
-		Object x= b.lists();
-	}
-} 
-class C{
-	public List[] lists(){
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test35_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test35_out.java
deleted file mode 100644
index 54ecb2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test35_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-import java.util.List;
-
-class A {
-	void f(){
-		C b= new C();
-		List[] temp= b.lists();
-		Object x= temp;
-	}
-} 
-class C{
-	public List[] lists(){
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test36_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test36_in.java
deleted file mode 100644
index 7be7a80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test36_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-
-class Test {
-
-  public int[] foo() {
-    return null;
-  }  
-  
-  public void bar(Test test) {
-    int[] i = test.foo(); // refactor this
-  }
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test36_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test36_out.java
deleted file mode 100644
index 51c3017..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test36_out.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-
-class Test {
-
-  public int[] foo() {
-    return null;
-  }  
-  
-  public void bar(Test test) {
-    int[] temp= test.foo();
-	int[] i = temp; // refactor this
-  }
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test37_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test37_in.java
deleted file mode 100644
index 48441fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test37_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	void f(int i) {
-		if (i == 0) {
-			int temp= 0;
-		}
-		if (i == 1) {
-			int x= 0 + 0;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test37_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test37_out.java
deleted file mode 100644
index 70b064a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test37_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A {
-	void f(int i) {
-		if (i == 0) {
-			int temp= 0;
-		}
-		if (i == 1) {
-			int temp= 0 + 0;
-			int x= temp;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test38_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test38_in.java
deleted file mode 100644
index b6325ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test38_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	private static void foo() {
-		int temp= 4;
-		System.out.println(temp);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test38_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test38_out.java
deleted file mode 100644
index 1ec04cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test38_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private static void foo() {
-		int temp= 4;
-		int temp1= temp;
-		System.out.println(temp1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test39_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test39_in.java
deleted file mode 100644
index 6dc1bad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test39_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	public Object foo(String text) {
-		if (((Object)null).toString() == null) {
-			return (Object)null;
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test39_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test39_out.java
deleted file mode 100644
index 664a9ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test39_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	public Object foo(String text) {
-		Object temp= (Object)null;
-		if ((temp).toString() == null) {
-			return temp;
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test3_in.java
deleted file mode 100644
index b49e010..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test3_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test3_out.java
deleted file mode 100644
index e047293..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test3_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		final int temp= 0;
-		int x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test40_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test40_in.java
deleted file mode 100644
index 875e180..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test40_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test40_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test40_out.java
deleted file mode 100644
index 5067667..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test40_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		A temp= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test41_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test41_in.java
deleted file mode 100644
index 411b0ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test41_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int f(){
-		new String("fred").length();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test41_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test41_out.java
deleted file mode 100644
index 1e91d70..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test41_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int f(){
-		int temp= new String("fred").length();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test42_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test42_in.java
deleted file mode 100644
index 1754f84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test42_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int getLength(){return 0;}
-	int f(){
-		int i= new A().getLength();
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test42_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test42_out.java
deleted file mode 100644
index f22f055..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test42_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int getLength(){return 0;}
-	int f(){
-		int temp= new A().getLength();
-		int i= temp;
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test43_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test43_in.java
deleted file mode 100644
index dace8a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test43_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	boolean isFred(){return false;}
-	int f(){
-		boolean i= new A().isFred();
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test43_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test43_out.java
deleted file mode 100644
index aea56c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test43_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	boolean isFred(){return false;}
-	int f(){
-		boolean temp= new A().isFred();
-		boolean i= temp;
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test44_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test44_in.java
deleted file mode 100644
index 76b3b7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test44_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	boolean isFred(){return false;}
-	int f(){
-		boolean i= isFred();
-		isFred();
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test44_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test44_out.java
deleted file mode 100644
index 46707d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test44_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	boolean isFred(){return false;}
-	int f(){
-		boolean temp= isFred();
-		boolean i= temp;
-		isFred();
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test45_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test45_in.java
deleted file mode 100644
index 4ea20cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test45_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	int f(){
-		int t= f();
-		f();
-		return 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test45_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test45_out.java
deleted file mode 100644
index 037d1e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test45_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	int f(){
-		int temp= f();
-		int t= temp;
-		f();
-		return 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test46_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test46_in.java
deleted file mode 100644
index 479d52b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test46_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	int f(){
-		f();
-		int u= f();
-		return 0;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test46_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test46_out.java
deleted file mode 100644
index 27e827d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test46_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	int f(){
-		int temp= f();
-		int u= temp;
-		return 0;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test47_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test47_in.java
deleted file mode 100644
index 45f1b71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test47_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class T {
-	int r(){return 4;}
-	void f(){
-		r();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test47_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test47_out.java
deleted file mode 100644
index b3d22d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test47_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class T {
-	int r(){return 4;}
-	void f(){
-		int temp= r();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test48_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test48_in.java
deleted file mode 100644
index 352bdaa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test48_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class T {
-	public String toString() {
-		return super.toString() + new Integer(1).toString();	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test48_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test48_out.java
deleted file mode 100644
index 41ec83c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test48_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class T {
-	public String toString() {
-		String temp= super.toString();
-		return temp + new Integer(1).toString();	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test49_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test49_in.java
deleted file mode 100644
index 2ca0166..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test49_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void f(boolean flag){
-		for (int i= 0; i < 10; i++) {
-			f(i==1);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test49_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test49_out.java
deleted file mode 100644
index cd01cd6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test49_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	void f(boolean flag){
-		for (int i= 0; i < 10; i++) {
-			boolean temp= i==1;
-			f(temp);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test4_in.java
deleted file mode 100644
index b6585d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test4_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= 1 + 2;
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test4_out.java
deleted file mode 100644
index d2b9d84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test4_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int temp= 1 + 2;
-		int x= temp;
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test50_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test50_in.java
deleted file mode 100644
index 0154887..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test50_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void f(boolean flag){
-		for (int i= 0; i < 10; i++) {
-			f(i==1);
-		}
-		for (int i= 0; i < 10; i++) {
-			f(i==1);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test50_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test50_out.java
deleted file mode 100644
index be22200..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test50_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	void f(boolean flag){
-		for (int i= 0; i < 10; i++) {
-			boolean temp= i==1;
-			f(temp);
-		}
-		for (int i= 0; i < 10; i++) {
-			f(i==1);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test51_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test51_in.java
deleted file mode 100644
index cb1dd9b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test51_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	void f(boolean flag){
-		if (flag){
-			f(3+5==8); 
-		} else 
-			f(3+5!=8); 
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test51_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test51_out.java
deleted file mode 100644
index cb15af2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test51_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	void f(boolean flag){
-		int temp= 3+5;
-		if (flag){
-			f(temp==8); 
-		} else 
-			f(temp!=8); 
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test52_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test52_in.java
deleted file mode 100644
index 34d9bba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test52_in.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package p;
-
-import java.math.BigDecimal;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.Vector;
-
-class A {
-	private SortedMap fillSortedMap(Vector values, boolean byValue) {
-		TreeMap map= new TreeMap();
-		for (int i= 0; i < values.size(); i += 2) {
-			if (byValue) {
-				map.put(
-					values.get(i + 1),
-					new Integer(((BigDecimal) values.get(i)).intValue()));
-			} else {
-				map.put(
-					new Integer(((BigDecimal) values.get(i)).intValue()),
-					values.get(i + 1));
-			}
-		}
-		return map;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test52_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test52_out.java
deleted file mode 100644
index e74c63f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test52_out.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package p;
-
-import java.math.BigDecimal;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.Vector;
-
-class A {
-	private SortedMap fillSortedMap(Vector values, boolean byValue) {
-		TreeMap map= new TreeMap();
-		for (int i= 0; i < values.size(); i += 2) {
-			Object valueOnIndexI= values.get(i);
-			if (byValue) {
-				map.put(
-					values.get(i + 1),
-					new Integer(((BigDecimal) valueOnIndexI).intValue()));
-			} else {
-				map.put(
-					new Integer(((BigDecimal) valueOnIndexI).intValue()),
-					values.get(i + 1));
-			}
-		}
-		return map;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test53_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test53_in.java
deleted file mode 100644
index ec47354..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test53_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// 6, 17 -> 6, 22
-package p;
-
-class A {
-	void foob() {
-		int e= (2 + 2) * 3 * 1;
-		int c= 2 + 2 * 4 + (28 + 2 + 2) + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test53_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test53_out.java
deleted file mode 100644
index 8e406ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test53_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 6, 17 -> 6, 22
-package p;
-
-class A {
-	void foob() {
-		int temp= 2 + 2;
-		int e= (temp) * 3 * 1;
-		int c= 2 + 2 * 4 + (28 + temp) + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test54_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test54_in.java
deleted file mode 100644
index 3d72343..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test54_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 6, 37 -> 6, 43
-package p;
-
-class A {
-	void foob() {
-		int e= (2 + 2) * (27 + 2 * (2+2* 4+1*2));
-		
-		int c= 3 * (2 + 1) + 2 + 2 * 4 + 28;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test54_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test54_out.java
deleted file mode 100644
index 80f0b30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test54_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 6, 37 -> 6, 43
-package p;
-
-class A {
-	void foob() {
-		int temp= 2+2* 4;
-		int e= (2 + 2) * (27 + 2 * (temp+1*2));
-		
-		int c= 3 * (2 + 1) + temp + 28;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test55_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test55_in.java
deleted file mode 100644
index 105114f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test55_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// 6, 19 -> 6, 24
-package p;
-
-class A {
-	void foob() {
-		int f= 5 *3*  1 *(1 + 1);		
-		int e= (2 + 2) * 3 * 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test55_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test55_out.java
deleted file mode 100644
index 08e0e3c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test55_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 6, 19 -> 6, 24
-package p;
-
-class A {
-	void foob() {
-		int temp= 3*  1;
-		int f= 5 *temp *(1 + 1);		
-		int e= (2 + 2) * temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test56_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test56_in.java
deleted file mode 100644
index 87db857..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test56_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 6, 24 -> 6, 29
-package p;
-
-class A {
-	void foob() {
-		int a= 2 * 3 + 3 + 1;
-
-		int b= (3 + 1) + 1*1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test56_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test56_out.java
deleted file mode 100644
index 14afcdd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test56_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 6, 24 -> 6, 29
-package p;
-
-class A {
-	void foob() {
-		int temp= 3 + 1;
-		int a= 2 * 3 + temp;
-
-		int b= (temp) + 1*1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test57_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test57_in.java
deleted file mode 100644
index de863ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test57_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 30 -> 8, 54
-package p;
-
-
-class A {
-	private void test() {
-        String fdFontName= null;
-        String tmpFileName = "/tmp"+fdFontName+".cff"+".txt";
-    }	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test57_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test57_out.java
deleted file mode 100644
index d7b7aba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test57_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 8, 30 -> 8, 54
-package p;
-
-
-class A {
-	private void test() {
-        String fdFontName= null;
-        String newVariable= "/tmp"+fdFontName+".cff";
-		String tmpFileName = newVariable+".txt";
-    }	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test58_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test58_in.java
deleted file mode 100644
index e5bccf3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test58_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//7, 14 -> 7, 30
-package p;
-
-class A {
-	private void foo() {
-		Object str= null; 
-		if(! str.equals(null));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test58_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test58_out.java
deleted file mode 100644
index ecc1a1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test58_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//7, 14 -> 7, 30
-package p;
-
-class A {
-	private void foo() {
-		Object str= null; 
-		boolean temp= str.equals(null);
-		if(! temp);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test59_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test59_in.java
deleted file mode 100644
index 92d3e26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test59_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//7, 17 -> 7, 18
-package p;
-
-class A {
-	private void foo() {
-		int s= 0;
-		int z= +s;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test59_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test59_out.java
deleted file mode 100644
index 530e6b9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test59_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//7, 17 -> 7, 18
-package p;
-
-class A {
-	private void foo() {
-		int s= 0;
-		int temp= s;
-		int z= +temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test5_in.java
deleted file mode 100644
index b6585d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test5_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= 1 + 2;
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test5_out.java
deleted file mode 100644
index 32e6cb1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test5_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int temp= 1 + 2;
-		int x= temp;
-		return temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test60_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test60_in.java
deleted file mode 100644
index c83e913..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test60_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//7, 17 -> 7, 18
-package p;
-
-class A {
-	private void foo() {
-		int s= 0;
-		int z= -s;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test60_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test60_out.java
deleted file mode 100644
index 8b9382c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test60_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//7, 17 -> 7, 18
-package p;
-
-class A {
-	private void foo() {
-		int s= 0;
-		int temp= s;
-		int z= -temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test61_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test61_in.java
deleted file mode 100644
index 4d7b9b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test61_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//7, 17 -> 7, 18
-package p;
-
-class A {
-	private void foo() {
-		int s= 0;
-		int z= ~s;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test61_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test61_out.java
deleted file mode 100644
index abe61ae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test61_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//7, 17 -> 7, 18
-package p;
-
-class A {
-	private void foo() {
-		int s= 0;
-		int temp= s;
-		int z= ~temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test62_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test62_in.java
deleted file mode 100644
index edce7b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test62_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;//10, 17 - 10, 28
-
-
-class A  {
-	void f() {
-		String x;
-		boolean test= false, test2= false, test3= false;
-		if (test) {
-		} else if (test2) {
-			x = "ExtractMe";
-		} else if (test3) {
-			x = "ExtractMe";
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test62_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test62_out.java
deleted file mode 100644
index 489feb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test62_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;//10, 17 - 10, 28
-
-
-class A  {
-	void f() {
-		String x;
-		boolean test= false, test2= false, test3= false;
-		String temp= "ExtractMe";
-		if (test) {
-		} else if (test2) {
-			x = temp;
-		} else if (test3) {
-			x = temp;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test63_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test63_in.java
deleted file mode 100644
index 893bf8d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test63_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;//9, 20 - 9, 23
-
-
-class A  {
-	void f() {
-		String x;
-		if (true)
-			try{
-				x= "i";
-			} catch (Exception e){
-				x= "i";
-			}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test63_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test63_out.java
deleted file mode 100644
index f73e9d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test63_out.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;//9, 20 - 9, 23
-
-
-class A  {
-	void f() {
-		String x;
-		String temp= "i";
-		if (true)
-			try{
-				x= temp;
-			} catch (Exception e){
-				x= temp;
-			}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test64_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test64_in.java
deleted file mode 100644
index 7ba78c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test64_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;//10, 17 - 10, 28
-
-
-class A  {
-	void f() {
-		String x;
-		boolean test= false, test2= false, test3= false;
-		if (test) {
-		} else if (test2)
-			x = "ExtractMe";
-		else if (test3)
-			x = "ExtractMe";
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test64_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test64_out.java
deleted file mode 100644
index b3272f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test64_out.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;//10, 17 - 10, 28
-
-
-class A  {
-	void f() {
-		String x;
-		boolean test= false, test2= false, test3= false;
-		String temp= "ExtractMe";
-		if (test) {
-		} else if (test2)
-			x = temp;
-		else if (test3)
-			x = temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test65_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test65_in.java
deleted file mode 100644
index fa45f12..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test65_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;//6, 19 - 6, 22
-
-
-class A  {
-	void f(String bar) {
-		String x= bar;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test65_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test65_out.java
deleted file mode 100644
index 5035ca3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test65_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;//6, 19 - 6, 22
-
-
-class A  {
-	void f(String bar) {
-		String temp= bar;
-		String x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test66_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test66_in.java
deleted file mode 100644
index 7b51a58..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test66_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p; //7, 32 - 7, 33
-
-class A {
-	void f(String bar) {
-		try {
-		} catch (Exception e) {
-			Exception another= e;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test66_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test66_out.java
deleted file mode 100644
index f47735f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test66_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p; //7, 32 - 7, 33
-
-class A {
-	void f(String bar) {
-		try {
-		} catch (Exception e) {
-			Exception temp= e;
-			Exception another= temp;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test67_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test67_in.java
deleted file mode 100644
index 202b4a2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test67_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p; //6, 16 - 6, 21
-
-class A {
-	void f() {
-		Integer[] is= null;
-		int k= is[0].intValue();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test67_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test67_out.java
deleted file mode 100644
index 8b9ceec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test67_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p; //6, 16 - 6, 21
-
-class A {
-	void f() {
-		Integer[] is= null;
-		Integer temp= is[0];
-		int k= temp.intValue();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test68_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test68_in.java
deleted file mode 100644
index a541626..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test68_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p; //6, 14 - 6, 21
-
-class A {
-	void f() {
-		class D{}
-		D d= new D();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test68_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test68_out.java
deleted file mode 100644
index c270754..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test68_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p; //6, 14 - 6, 21
-
-class A {
-	void f() {
-		class D{}
-		D temp= new D();
-		D d= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test69_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test69_in.java
deleted file mode 100644
index 7730f66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test69_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p; //5, 24 - 5, 26
-
-class A {
-	void f() {
-		String string= "";
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test69_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test69_out.java
deleted file mode 100644
index b3af49e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test69_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p; //5, 24 - 5, 26
-
-class A {
-	void f() {
-		String temp= "";
-		String string= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test6_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test6_in.java
deleted file mode 100644
index b6585d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test6_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= 1 + 2;
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test6_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test6_out.java
deleted file mode 100644
index 4d6f43d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test6_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		final int temp= 1 + 2;
-		int x= temp;
-		return temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test70_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test70_in.java
deleted file mode 100644
index 6e68bfe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test70_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void f() {
-		StringBuffer buf= new StringBuffer();
-		String[] strings= new String[] {"A", "B", "C", "D"};
-		for (int i= 0; i < strings.length; i++) {
-			buf.append(strings[i]);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test70_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test70_out.java
deleted file mode 100644
index 2de227f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test70_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void f() {
-		StringBuffer buf= new StringBuffer();
-		String[] strings= new String[] {"A", "B", "C", "D"};
-		final int temp= strings.length;
-		for (int i= 0; i < temp; i++) {
-			buf.append(strings[i]);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test71_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test71_in.java
deleted file mode 100644
index 6e68bfe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test71_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void f() {
-		StringBuffer buf= new StringBuffer();
-		String[] strings= new String[] {"A", "B", "C", "D"};
-		for (int i= 0; i < strings.length; i++) {
-			buf.append(strings[i]);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test71_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test71_out.java
deleted file mode 100644
index 8437eb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test71_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void f() {
-		StringBuffer buf= new StringBuffer();
-		String[] strings= new String[] {"A", "B", "C", "D"};
-		for (int i= 0; i < strings.length; i++) {
-			String temp= strings[i];
-			buf.append(temp);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test72_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test72_in.java
deleted file mode 100644
index 6e68bfe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test72_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void f() {
-		StringBuffer buf= new StringBuffer();
-		String[] strings= new String[] {"A", "B", "C", "D"};
-		for (int i= 0; i < strings.length; i++) {
-			buf.append(strings[i]);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test72_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test72_out.java
deleted file mode 100644
index ed0b767..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test72_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void f() {
-		StringBuffer buf= new StringBuffer();
-		String[] strings= new String[] {"A", "B", "C", "D"};
-		for (int i= 0; i < strings.length; i++) {
-			int temp= i;
-			buf.append(strings[temp]);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test73_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test73_in.java
deleted file mode 100644
index 865abff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test73_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			for (int k= 0, p= 17; p < i; k++) {
-				System.out.println(i++ + " " + k);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test73_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test73_out.java
deleted file mode 100644
index b239659..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test73_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			int temp= i;
-			for (int k= 0, p= 17; p < temp; k++) {
-				System.out.println(i++ + " " + k);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test74_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test74_in.java
deleted file mode 100644
index 865abff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test74_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			for (int k= 0, p= 17; p < i; k++) {
-				System.out.println(i++ + " " + k);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test74_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test74_out.java
deleted file mode 100644
index 5ab30c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test74_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			for (int k= 0, p= 17; p < i; k++) {
-				String temp= i++ + " " + k;
-				System.out.println(temp);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test75_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test75_in.java
deleted file mode 100644
index 865abff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test75_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			for (int k= 0, p= 17; p < i; k++) {
-				System.out.println(i++ + " " + k);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test75_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test75_out.java
deleted file mode 100644
index 1c6ec5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test75_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			for (int k= 0, p= 17; p < i; k++) {
-				int temp= i++;
-				System.out.println(temp + " " + k);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test76_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test76_in.java
deleted file mode 100644
index 865abff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test76_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			for (int k= 0, p= 17; p < i; k++) {
-				System.out.println(i++ + " " + k);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test76_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test76_out.java
deleted file mode 100644
index 7eb5a62..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test76_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			for (int k= 0, p= 17; p < i; k++) {
-				int temp= k;
-				System.out.println(i++ + " " + temp);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test77_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test77_in.java
deleted file mode 100644
index d0b47f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test77_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	int f(int i) {
-		return i;
-	}
-
-	int f1(int is) {
-		for (f(9), f(8);;) {
-			f(9);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test77_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test77_out.java
deleted file mode 100644
index d5825bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test77_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	int f(int i) {
-		return i;
-	}
-
-	int f1(int is) {
-		for (f(9), f(8);;) {
-			int temp= f(9);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test7_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test7_in.java
deleted file mode 100644
index b6585d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test7_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= 1 + 2;
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test7_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test7_out.java
deleted file mode 100644
index 4eb51944..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test7_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		final int temp= 1 + 2;
-		int x= temp;
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test8_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test8_in.java
deleted file mode 100644
index 4ae9a41..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test8_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int m(){
-		for (int i= 0; i==0;){
-			int x= 1 + 2;
-		}
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test8_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test8_out.java
deleted file mode 100644
index ce86a2e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test8_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int m(){
-		int temp= 1 + 2;
-		for (int i= 0; i==0;){
-			int x= temp;
-		}
-		return temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test9_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test9_in.java
deleted file mode 100644
index 4ae9a41..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test9_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int m(){
-		for (int i= 0; i==0;){
-			int x= 1 + 2;
-		}
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test9_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test9_out.java
deleted file mode 100644
index 7557624..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_test9_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int m(){
-		for (int i= 0; i==0;){
-			int temp= 1 + 2;
-			int x= temp;
-		}
-		return 1 + 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_testZeroLengthSelection0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_testZeroLengthSelection0_in.java
deleted file mode 100644
index 161a798..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_testZeroLengthSelection0_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 100;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_testZeroLengthSelection0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_testZeroLengthSelection0_out.java
deleted file mode 100644
index 7a7ef9e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/canExtract/A_testZeroLengthSelection0_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int temp= 100;
-		int x= temp;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail0.java
deleted file mode 100644
index 35aed61..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail0.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(){
-		int temp;
-		int i= 1;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail1.java
deleted file mode 100644
index ec66930..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		m(y);
-		m(y);
-		return y;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail10.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail10.java
deleted file mode 100644
index de4ed23..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail10.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		Object[] i= new Object[]{this};
-	}
-}}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail11.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail11.java
deleted file mode 100644
index 306ebbd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail11.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		A i= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail12.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail12.java
deleted file mode 100644
index 63cf080..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail12.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(int i){
-		int y= i == 3 ? 2: 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail13.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail13.java
deleted file mode 100644
index e7dd7d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail13.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		int i;
-		int y= i =1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail14.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail14.java
deleted file mode 100644
index cb4def5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail14.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(int i){
-		int y= (i= 1) + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail15.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail15.java
deleted file mode 100644
index a579350..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail15.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void f(){
-		String f= "k";
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail16.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail16.java
deleted file mode 100644
index 45f1b71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail16.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class T {
-	int r(){return 4;}
-	void f(){
-		r();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail17.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail17.java
deleted file mode 100644
index ab4dc5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail17.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class T {
-	int r(){return 4;}
-	void f(){
-		{
-			r();
-		}	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail18.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail18.java
deleted file mode 100644
index 7ccf3cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail18.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(){
-		for (int k= 0, i= k; k< 10; k++){
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail19.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail19.java
deleted file mode 100644
index f70aa67..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail19.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-	int temp;
-	void m(){
-		int i= 10;
-		temp= 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail2.java
deleted file mode 100644
index 682ef4b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail2.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		int y= m(i);
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail20.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail20.java
deleted file mode 100644
index c4bc61a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail20.java
+++ /dev/null
@@ -1,5 +0,0 @@
-class A {
-	void f(){
-		throw new NullPointerException();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail21.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail21.java
deleted file mode 100644
index 4175a07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail21.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-public class A {
-
-	protected void primExecute() {
-		this.toString();
-	}
-
-	if (image != null) {
-		Object loc = null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail22.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail22.java
deleted file mode 100644
index 8493af5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail22.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A {
-	void f(){
-		f();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail23.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail23.java
deleted file mode 100644
index 2907d4b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail23.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-    void f(){
-        int a= 0;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail24.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail24.java
deleted file mode 100644
index a648eac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail24.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-    void f(){
-        int a= 0;
-        a= 0;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail25.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail25.java
deleted file mode 100644
index b49e010..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail25.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail26.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail26.java
deleted file mode 100644
index 70bde9c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail26.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		class Local{}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail27.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail27.java
deleted file mode 100644
index 310ac30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail27.java
+++ /dev/null
@@ -1,13 +0,0 @@
-// 7, 13 -> 7, 24
-package p;
-
-class A {
-	public boolean fState= false;
-	public void foo() {
-		if (this.fState) {
-			this.fState= false;
-		} else {
-			this.fState= this.fState;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail28.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail28.java
deleted file mode 100644
index 4925fb2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail28.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// 7, 17 -> 7, 28
-package p;
-
-class A {
-	public int fState= 0;
-	public void foo() {
-		fState= this.fState;
-		fState= fState;
-		this.fState= this.fState;
-		this.fState= fState;
-		this.fState++;
-		this.fState--;
-		fState++;
-		fState--;
-		if (fState++ == 0)	return;
-		if (fState-- == 0)	return;
-		if (this.fState++ == 0)	return;
-		if (this.fState-- == 0)	return;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail29.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail29.java
deleted file mode 100644
index 5374eab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail29.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A{
-	void f(){
-		for (int i = 0; i < 1; i++) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail3.java
deleted file mode 100644
index 457fb89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail3.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int m(int y){
-		int y= m(y);
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail30.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail30.java
deleted file mode 100644
index 5374eab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail30.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A{
-	void f(){
-		for (int i = 0; i < 1; i++) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail31.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail31.java
deleted file mode 100644
index 735beb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail31.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A{
-	void f(){
-		for (int i= 0, k= 17; k < 1; i++) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail32.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail32.java
deleted file mode 100644
index 865abff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail32.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		for (int i= 0; i < 5; i++) {
-			for (int k= 0, p= 17; p < i; k++) {
-				System.out.println(i++ + " " + k);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail33.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail33.java
deleted file mode 100644
index d21fd18..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail33.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	void f(int is) {
-		int i= 0;
-		for (;; i= 0) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail34.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail34.java
deleted file mode 100644
index 2870607..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail34.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	int f(int i) {
-		return i;
-	}
-
-	int f1(int is) {
-		for (f(9), f(8);;) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail4.java
deleted file mode 100644
index e24b7a1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail4.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//void expression
-package p;
-class A{
-	void m(){
-		m();
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail5.java
deleted file mode 100644
index f9c530d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail5.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	int y= 1+2;
-	int u= y;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail6.java
deleted file mode 100644
index 21773cc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail6.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	A(){
-		this(1 + 1);
-	}
-	A(int y){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail7.java
deleted file mode 100644
index fda6605..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail7.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A extends B{
-	A(){
-		super(1 + 1);
-	}
-}
-class B{
-	B(int y){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail8.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail8.java
deleted file mode 100644
index 1f7cbd1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail8.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	static final int FF= 2;
-	void f(){
-		int t= A.FF;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail9.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail9.java
deleted file mode 100644
index 1e55f44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractTemp/cannotExtract/A_testFail9.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		Object i= null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext0.java
deleted file mode 100644
index 0e4f1bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext0.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-
-	void f2(){
-	
-	}
-}
-  
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext1.java
deleted file mode 100644
index 0e4f1bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext1.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-
-	void f2(){
-	
-	}
-}
-  
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext2.java
deleted file mode 100644
index 0e4f1bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext2.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-
-	void f2(){
-	
-	}
-}
-  
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext3.java
deleted file mode 100644
index 220f149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testNext3.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious0.java
deleted file mode 100644
index 220f149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious0.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious1.java
deleted file mode 100644
index 220f149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious1.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious2.java
deleted file mode 100644
index 220f149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious2.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious3.java
deleted file mode 100644
index 220f149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious3.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious4.java
deleted file mode 100644
index 220f149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious4.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious5.java
deleted file mode 100644
index a7b2e34..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious5.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-
-	void f2(){
-	
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious6.java
deleted file mode 100644
index 0e4f1bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/GoToNextPreviousMemberAction/A_testPrevious6.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package p;
-
-
-class A {
-	class T{
-	
-	}
-	
-	void f(){
-	
-	}
-	
-	{
-		
-		
-	}
-	
-	int fg;
-
-	static {
-	
-	}
-	
-	/**
-	 * 
-	 */	
-	void f1(){
-	
-	}
-
-	void f2(){
-	
-	}
-}
-  
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test0/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test0/in/C.java
deleted file mode 100644
index 47de648..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test0/in/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 5, 30 -> 5, 36  replaceAll == true, removeDeclaration == false
-package p;
-
-class C {
-	private static final int FOOBAR= 0;
-	
-	private static void jb() {
-		System.out.println("Ceci, ce n'est pas une pipe: " + FOOBAR + " ;");
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test0/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test0/out/C.java
deleted file mode 100644
index e8466a2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test0/out/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 5, 30 -> 5, 36  replaceAll == true, removeDeclaration == false
-package p;
-
-class C {
-	private static final int FOOBAR= 0;
-	
-	private static void jb() {
-		System.out.println("Ceci, ce n'est pas une pipe: " + 0 + " ;");
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test1/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test1/in/C.java
deleted file mode 100644
index 928c335..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test1/in/C.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// 3, 33 -> 3, 40  removeDeclaration == false, replaceAll == true
-class C {
-	public static final boolean I_EXIST= true;
-	
-	static {
-		boolean beans= I_EXIST;
-	}
-}
-
-class D {
-	int object_oriented_programming() {
-		return false || (!false && C.I_EXIST && (false != true));
-	}
-}
-
-class CPlusPlus extends C {
-	public static final int JAVA= I_EXIST ? 0xCAFEBABE : OxO;
-	
-	void beans() {
-		System.err.println(C          .           I_EXIST);	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test1/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test1/out/C.java
deleted file mode 100644
index 0eb48a8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test1/out/C.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// 3, 33 -> 3, 40  removeDeclaration == false, replaceAll == true
-class C {
-	public static final boolean I_EXIST= true;
-	
-	static {
-		boolean beans= true;
-	}
-}
-
-class D {
-	int object_oriented_programming() {
-		return false || (!false && true && (false != true));
-	}
-}
-
-class CPlusPlus extends C {
-	public static final int JAVA= true ? 0xCAFEBABE : OxO;
-	
-	void beans() {
-		System.err.println(true);	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/in/A.java
deleted file mode 100644
index ddbf9f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p1;
-
-public class A {
-	public static final String EARTH= "Elysium";
-	
-	public static final String ELYSIUM= EARTH;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/in/B.java
deleted file mode 100644
index 487d1dd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/in/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 9, 28 -> 9, 37  replaceAll == false
-package p2;
-
-import p1.A;
-
-class B {
-
-	public static void main(String[] args) {
-		System.out.println(A.ELYSIUM);	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/out/A.java
deleted file mode 100644
index ddbf9f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p1;
-
-public class A {
-	public static final String EARTH= "Elysium";
-	
-	public static final String ELYSIUM= EARTH;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/out/B.java
deleted file mode 100644
index e79665f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test10/out/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 9, 28 -> 9, 37  replaceAll == false
-package p2;
-
-import p1.A;
-
-class B {
-
-	public static void main(String[] args) {
-		System.out.println(A.EARTH);	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/A.java
deleted file mode 100644
index 0e499f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 25 -> 8, 25  replaceAll == false 
-package p1;
-
-import p2.B;
-
-public class A {
-	void f() {
-		int j= 4 * B.ZEMENT + 1;	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/B.java
deleted file mode 100644
index 3e2d1cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-import p3.C;
-
-public class B {
-	public static final int ZEMENT= 4*C.BEGRIFF + p3.C.BEGRIFF;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/C.java
deleted file mode 100644
index a2f3a71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/in/C.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p3;
-
-public class C {
-	public static final int BEGRIFF= "Der Begriff";	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/A.java
deleted file mode 100644
index 1ada16e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 8, 25 -> 8, 25  replaceAll == false 
-package p1;
-
-import p2.B;
-import p3.C;
-
-public class A {
-	void f() {
-		int j= 4 * (4*C.BEGRIFF + p3.C.BEGRIFF) + 1;	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/B.java
deleted file mode 100644
index 3e2d1cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-import p3.C;
-
-public class B {
-	public static final int ZEMENT= 4*C.BEGRIFF + p3.C.BEGRIFF;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/C.java
deleted file mode 100644
index a2f3a71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test11/out/C.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p3;
-
-public class C {
-	public static final int BEGRIFF= "Der Begriff";	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/in/Declarer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/in/Declarer.java
deleted file mode 100644
index 6e0cca0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/in/Declarer.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p1;
-
-public class Declarer {
-	public static final String CONSTANT= foo;
-	
-	public static String foo= "foo_for_now";
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/in/InlineSite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/in/InlineSite.java
deleted file mode 100644
index 0081d14..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/in/InlineSite.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// Here, an import is added for a type needed only after a qualification is added.
-// 7, 37 -> 7, 43  replaceAll == true, removeDeclaration == false
-package p2;
-
-class InlineSite {
-	static {
-		System.out.println(p1.Declarer.CONSTANT);	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/out/Declarer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/out/Declarer.java
deleted file mode 100644
index 6e0cca0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/out/Declarer.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p1;
-
-public class Declarer {
-	public static final String CONSTANT= foo;
-	
-	public static String foo= "foo_for_now";
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/out/InlineSite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/out/InlineSite.java
deleted file mode 100644
index 6ffb232..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test12/out/InlineSite.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// Here, an import is added for a type needed only after a qualification is added.
-// 7, 37 -> 7, 43  replaceAll == true, removeDeclaration == false
-package p2;
-
-import p1.Declarer;
-
-class InlineSite {
-	static {
-		System.out.println(Declarer.foo);	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/in/A.java
deleted file mode 100644
index 8b20772..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p1;
-
-public class A {
-	public class B {
-		public static final Object CONSTANT= ALFRED;	
-	}
-	
-	public static final Object ALFRED= null;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/in/InlineSite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/in/InlineSite.java
deleted file mode 100644
index 04b860a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/in/InlineSite.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// Here, an import is added for a type needed only after a qualification is added.
-// 8, 19 -> 8, 29  removeAll == false
-package p2;
-
-import p1.A.B;
-
-class InlineSite {
-	Object thing= B.CONSTANT;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/out/A.java
deleted file mode 100644
index 8b20772..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p1;
-
-public class A {
-	public class B {
-		public static final Object CONSTANT= ALFRED;	
-	}
-	
-	public static final Object ALFRED= null;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/out/InlineSite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/out/InlineSite.java
deleted file mode 100644
index 1b8964c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test13/out/InlineSite.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// Here, an import is added for a type needed only after a qualification is added.
-// 8, 19 -> 8, 29  removeAll == false
-package p2;
-
-import p1.A;
-import p1.A.B;
-
-class InlineSite {
-	Object thing= A.ALFRED;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test14/in/GrueziWohl.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test14/in/GrueziWohl.java
deleted file mode 100644
index 11d4e1e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test14/in/GrueziWohl.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// 7, 35 -> 7, 35  replaceAll == true, removeDeclaration == false;
-package cantonzuerich;
-
-public class GrueziWohl {
-	private static String gruezi= "Gruezi";
-	private static boolean jh= true;
-	private static final boolean WOHL= jh && "Gruezi".equals(gruezi);
-	
-	public String holenGruss() {
-		String gruezi= "Gruezi";
-		return gruezi + (WOHL ? " Wohl" : "") + "!";
-	}
-	
-	private boolean wohl() {
-		return WOHL;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test14/out/GrueziWohl.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test14/out/GrueziWohl.java
deleted file mode 100644
index 564c7c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test14/out/GrueziWohl.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// 7, 35 -> 7, 35  replaceAll == true, removeDeclaration == false;
-package cantonzuerich;
-
-public class GrueziWohl {
-	private static String gruezi= "Gruezi";
-	private static boolean jh= true;
-	private static final boolean WOHL= jh && "Gruezi".equals(gruezi);
-	
-	public String holenGruss() {
-		String gruezi= "Gruezi";
-		return gruezi + ((jh && "Gruezi".equals(GrueziWohl.gruezi)) ? " Wohl" : "") + "!";
-	}
-	
-	private boolean wohl() {
-		return jh && "Gruezi".equals(gruezi);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test15/in/Froehlichkeit.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test15/in/Froehlichkeit.java
deleted file mode 100644
index 5cf853d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test15/in/Froehlichkeit.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// 14, 16 -> 14, 32  replaceAll == true, removeDeclaration == false
-package schweiz.zuerich.zuerich;
-
-public abstract class Froehlichkeit {
-	static class MeineFroehlichkeit extends Froehlichkeit {
-		MeineFroehlichkeit(Object o) {}
-	}
-	private static Object something= new Object();
-	private static final Froehlichkeit dieFroehlichkeit= new MeineFroehlichkeit(something);
-
-	public Froehlichkeit holenFroehlichkeit() {
-		class MeineFroehlichkeit {
-		}
-		return dieFroehlichkeit;
-	}
-
-	public Froehlichkeit deineFroehlichkeit() {
-		Object something= "";
-		return dieFroehlichkeit;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test15/out/Froehlichkeit.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test15/out/Froehlichkeit.java
deleted file mode 100644
index 8002a21..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test15/out/Froehlichkeit.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// 14, 16 -> 14, 32  replaceAll == true, removeDeclaration == false
-package schweiz.zuerich.zuerich;
-
-public abstract class Froehlichkeit {
-	static class MeineFroehlichkeit extends Froehlichkeit {
-		MeineFroehlichkeit(Object o) {}
-	}
-	private static Object something= new Object();
-	private static final Froehlichkeit dieFroehlichkeit= new MeineFroehlichkeit(something);
-
-	public Froehlichkeit holenFroehlichkeit() {
-		class MeineFroehlichkeit {
-		}
-		return new Froehlichkeit.MeineFroehlichkeit(something);
-	}
-
-	public Froehlichkeit deineFroehlichkeit() {
-		Object something= "";
-		return new MeineFroehlichkeit(Froehlichkeit.something);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test2/in/Klass.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test2/in/Klass.java
deleted file mode 100644
index 44afdd6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test2/in/Klass.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// 10, 22 -> 10, 30  replaceAll == false
-
-package p;
-
-class Klass {
-	static final Klass KONSTANT=           new   Klass()  ;
-	
-	
-	static void f() {
-		Klass klass= KONSTANT;	
-	}
-	
-	Klass klass=KONSTANT;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test2/out/Klass.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test2/out/Klass.java
deleted file mode 100644
index 26f644e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test2/out/Klass.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// 10, 22 -> 10, 30  replaceAll == false
-
-package p;
-
-class Klass {
-	static final Klass KONSTANT=           new   Klass()  ;
-	
-	
-	static void f() {
-		Klass klass= new   Klass();	
-	}
-	
-	Klass klass=KONSTANT;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test3/in/LeVinSuperieure.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test3/in/LeVinSuperieure.java
deleted file mode 100644
index df91fba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test3/in/LeVinSuperieure.java
+++ /dev/null
@@ -1,11 +0,0 @@
-// 5, 32 -> 5, 43  replaceAll == true, removeDeclaration == true
-package p;
-
-class LeVinSuperieure {
-	public static final String LE_CONSTANT= "Pharmacology";
-	
-	public LeVinSuperieure(final String appelation) {
-		String leNom= appelation == null ? LE_CONSTANT : appelation;
-		System.out.println("Nous avons cree un superieure vin, appelle " + leNom);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test3/out/LeVinSuperieure.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test3/out/LeVinSuperieure.java
deleted file mode 100644
index d354d60..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test3/out/LeVinSuperieure.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// 5, 32 -> 5, 43  replaceAll == true, removeDeclaration == true
-package p;
-
-class LeVinSuperieure {
-	public LeVinSuperieure(final String appelation) {
-		String leNom= appelation == null ? "Pharmacology" : appelation;
-		System.out.println("Nous avons cree un superieure vin, appelle " + leNom);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test4/in/Klus.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test4/in/Klus.java
deleted file mode 100644
index ced6dc7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test4/in/Klus.java
+++ /dev/null
@@ -1,8 +0,0 @@
-// 5, 36 -> 5, 36  replaceAll == true, removeDeclaration == false
-package p;
-
-class Klus {
-	private static final int KLUSPLATZ= 34;
-	
-	private int kreuzplatz= (kreuzplatz= -1 +KLUSPLATZ+ (-1));
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test4/out/Klus.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test4/out/Klus.java
deleted file mode 100644
index 56daf64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test4/out/Klus.java
+++ /dev/null
@@ -1,8 +0,0 @@
-// 5, 36 -> 5, 36  replaceAll == true, removeDeclaration == false
-package p;
-
-class Klus {
-	private static final int KLUSPLATZ= 34;
-	
-	private int kreuzplatz= (kreuzplatz= -1 +34+ (-1));
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test5/in/PartOfDeclNameSelected.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test5/in/PartOfDeclNameSelected.java
deleted file mode 100644
index 43188dd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test5/in/PartOfDeclNameSelected.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// 5, 32 -> 5, 34  replaceAllReferences == true,  removeDeclaration == true
-package p;
-
-class PartOfDeclNameSelected {
-	public static final long foooo= 1;
-	static {
-		int i= foooo;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test5/out/PartOfDeclNameSelected.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test5/out/PartOfDeclNameSelected.java
deleted file mode 100644
index 9e6c2de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test5/out/PartOfDeclNameSelected.java
+++ /dev/null
@@ -1,8 +0,0 @@
-// 5, 32 -> 5, 34  replaceAllReferences == true,  removeDeclaration == true
-package p;
-
-class PartOfDeclNameSelected {
-	static {
-		int i= 1;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test6/in/CursorPositionedInReference.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test6/in/CursorPositionedInReference.java
deleted file mode 100644
index 5441bb2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test6/in/CursorPositionedInReference.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 57 -> 8, 57  replaceAll == false
-package p;
-
-class CursorPositionedInReference {
-	static final String VISUALAGE_FOR_COBOL= "simply irresistible";
-	
-	public static CursorPositionedInReference eat() {
-		System.out.println("Refactoring is " + VISUALAGE_FOR_COBOL);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test6/out/CursorPositionedInReference.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test6/out/CursorPositionedInReference.java
deleted file mode 100644
index 079cba5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test6/out/CursorPositionedInReference.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 57 -> 8, 57  replaceAll == false
-package p;
-
-class CursorPositionedInReference {
-	static final String VISUALAGE_FOR_COBOL= "simply irresistible";
-	
-	public static CursorPositionedInReference eat() {
-		System.out.println("Refactoring is " + "simply irresistible");
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test7/in/PartOfReferenceSelected.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test7/in/PartOfReferenceSelected.java
deleted file mode 100644
index 3777c20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test7/in/PartOfReferenceSelected.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 52 -> 8, 62  replaceAll == false
-package p;
-
-class PartOfReferenceSelected {
-	static final String VISUALAGE_FOR_COBOL= "simply irresistible";
-	
-	public static CursorPositionedInReference eat() {
-		System.out.println("Refactoring is " + VISUALAGE_FOR_COBOL);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test7/out/PartOfReferenceSelected.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test7/out/PartOfReferenceSelected.java
deleted file mode 100644
index 5d2c165..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test7/out/PartOfReferenceSelected.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 52 -> 8, 62  replaceAll == false
-package p;
-
-class PartOfReferenceSelected {
-	static final String VISUALAGE_FOR_COBOL= "simply irresistible";
-	
-	public static CursorPositionedInReference eat() {
-		System.out.println("Refactoring is " + "simply irresistible");
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/in/C.java
deleted file mode 100644
index 8808f05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/in/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-// 5, 29 -> 5, 37  replaceAll == true, removeDeclaration == false
-package p1;
-
-public class C {
-	public static final int CONSTANT= 12345;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/in/D.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/in/D.java
deleted file mode 100644
index e65ae91..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/in/D.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p2;
-
-import p1.C;
-
-class D {
-	void f() {
-		int j= C.CONSTANT;	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/out/C.java
deleted file mode 100644
index 8808f05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/out/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-// 5, 29 -> 5, 37  replaceAll == true, removeDeclaration == false
-package p1;
-
-public class C {
-	public static final int CONSTANT= 12345;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/out/D.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/out/D.java
deleted file mode 100644
index c656489..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test8/out/D.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p2;
-
-import p1.C;
-
-class D {
-	void f() {
-		int j= 12345;	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/C.java
deleted file mode 100644
index 806e858..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/C.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p1;
-
-public class C {
-	public static final int CONSTANT= 12345;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/D.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/D.java
deleted file mode 100644
index 9ea4920..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/D.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 18 -> 8, 26  replaceAll == true, removeDeclaration == true
-package p2;
-
-import p1.C;
-
-class D {
-	void f() {
-		int j= C.CONSTANT;	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/E.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/E.java
deleted file mode 100644
index 6d6b96a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/in/E.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p3;
-
-import p1.C;
-
-public class E {
-	static int e= 1 + C.CONSTANT;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/C.java
deleted file mode 100644
index 1df4f81..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/C.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p1;
-
-public class C {	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/D.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/D.java
deleted file mode 100644
index 535b1d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/D.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 18 -> 8, 26  replaceAll == true, removeDeclaration == true
-package p2;
-
-import p1.C;
-
-class D {
-	void f() {
-		int j= 12345;	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/E.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/E.java
deleted file mode 100644
index a22231a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/canInline/test9/out/E.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p3;
-
-import p1.C;
-
-public class E {
-	static int e= 1 + 12345;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/cannotInline/testFail0/in/NeueZuercherZeitung.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/cannotInline/testFail0/in/NeueZuercherZeitung.java
deleted file mode 100644
index 40b9ea9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/cannotInline/testFail0/in/NeueZuercherZeitung.java
+++ /dev/null
@@ -1,7 +0,0 @@
-// 5, 27 -> 5, 28, replaceAll= true removeDeclaration == false
-package foo;
-
-class NeueZuercherZeitung {
-	public static Object foob;
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/cannotInline/testFail1/in/Fun.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/cannotInline/testFail1/in/Fun.java
deleted file mode 100644
index 071ae4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineConstant/cannotInline/testFail1/in/Fun.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// 8, 35 -> 8, 35  replaceAll == false
-package fun;
-
-import java.util.*;
-
-class Fun {
-	int m() {
-		return GregorianCalendar.BC;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/.cvsignore
deleted file mode 100644
index eddeac1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.metadata
-bin
-*.class
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.classpath b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.classpath
deleted file mode 100644
index 1b1d910..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path=""/>
-    <classpathentry kind="var" path="JRE_LIB" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.cvsignore
deleted file mode 100644
index 21a3013..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-*.class
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.project b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.project
deleted file mode 100644
index 86a5ef6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>TestCases</name>
-	<comment></comment>
-	<projects>
-	</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/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/A.java
deleted file mode 100644
index ab9b2b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-public class A {
-	public void foo() {
-		bar();
-	}
-	int bar() {
-		return 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/B.java
deleted file mode 100644
index e09402c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class B {
-	public void foo() {
-		System.out.println("Eclipse");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/C.java
deleted file mode 100644
index 987c439..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-class C {
-    int m(){
-        return 6 + 6;
-    }
-    void f(C a){
-       m();
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/E.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/E.java
deleted file mode 100644
index 4087d98..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/E.java
+++ /dev/null
@@ -1,6 +0,0 @@
-public class E {
-	public void main() {
-		B b= null;
-		b.foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/InlineBug.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/InlineBug.java
deleted file mode 100644
index 64e656d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/InlineBug.java
+++ /dev/null
@@ -1,26 +0,0 @@
-import java.io.Writer;
-
-public class InlineBug
-{
-	public void caller(Writer out) throws Exception
-	{
-		out.write("start caller");
-		inlineMe(out);
-		out.write("end caller");
-	}
-
-	public void inlineMe(Writer out) throws Exception
-	{
-		out.write("start render");
-		subroutine(true, out);
-		out.write("end render");
-	}
-
-	void subroutine(boolean isSelected, Writer out) throws Exception
-	{
-		if (isSelected)
-		{
-			out.write("selected");
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/Test.java
deleted file mode 100644
index 1595b3d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/Test.java
+++ /dev/null
@@ -1,20 +0,0 @@
-public class Test {
-
-  private int bb(int u, int v, int w) {
-	return (u & v) | (~u & w);
-  }
-
-  private int aa(int x, int n) {
-	return (x << n) | (x >>> (32 - n));
-  }
-
-  protected void processBlock() {
-	int a = 0;
-	int b = 1;
-	int c = 2;
-	int d = 3;
-    
-	a = aa((a + bb( b, c, d)), 0) + b;
-  }    
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestArray.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestArray.java
deleted file mode 100644
index 9868287..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestArray.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package argument_in;
-
-public class TestArray {
-
-	public int bar(int a[]) {
-		return a[0];
-	}
-	
-	public void main() {
-		int i= /*[*/bar(new int[] {1})/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestFieldReference.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestFieldReference.java
deleted file mode 100644
index f160fa5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestFieldReference.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package argument_in;
-
-public class TestFieldReference {
-	private String field;
-	
-	public void main() {
-		/*[*/bar(field);/*]*/
-	}
-
-	public void bar(Object o) {
-		o.toString();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLiteralReferenceRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLiteralReferenceRead.java
deleted file mode 100644
index 35d5af1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLiteralReferenceRead.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package argument_in;
-
-public class TestLiteralReferenceRead {
-	public void main() {
-		/*[*/foo(10);/*]*/
-	}
-	
-	public void foo(int x) {
-		int i= x;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLiteralReferenceWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLiteralReferenceWrite.java
deleted file mode 100644
index 382d227..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLiteralReferenceWrite.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package argument_in;
-
-public class TestLiteralReferenceWrite {
-	public void main() {
-		/*[*/foo(10);/*]*/
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceLoop.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceLoop.java
deleted file mode 100644
index ad3c0e5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceLoop.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_in;
-
-public class TestLocalReferenceLoop {
-	public void main() {
-		int i= 10;
-		for (int z= 0; z < i; z++) {
-			/*[*/foo(i);/*]*/
-		}
-	}
-	
-	public void foo(int x) {
-		x= x + 10;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferencePrefix.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferencePrefix.java
deleted file mode 100644
index 0549478..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferencePrefix.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package argument_in;
-
-public class TestLocalReferencePrefix {
-	public void main() {
-		int a = 0;
-		int b = 1;
-		int c = 2;
-		int d = 3;
-    
-		a = aa((a + /*[*/bb( b, c, d)/*]*/), 0) + b;
-	}
-	
-	private int bb(int u, int v, int w) {
-	  return (u & v) | (~u & w);
-	}
-
-	private int aa(int x, int n) {
-	  return (x << n) | (x >>> (32 - n));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceRead.java
deleted file mode 100644
index 9604b5d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceRead.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package argument_in;
-
-public class TestLocalReferenceRead {
-	public void main() {
-		int foo = 0;
-		/*[*/inlineMe(foo);/*]*/
-		System.out.println(foo);
-	}
-	
-	public void inlineMe(int bar) {
-		bar++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceRead2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceRead2.java
deleted file mode 100644
index 19e0c94..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceRead2.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package argument_in;
-
-public class TestLocalReferenceRead2 {
-	public void main() {
-		int i= 10;
-		/*[*/foo(i);/*]*/
-		System.out.println(i);
-	}
-	
-	public void foo(int x) {
-		x= x + 10;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceUnused.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceUnused.java
deleted file mode 100644
index 3b02a8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceUnused.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package argument_in;
-
-public class TestLocalReferenceUnused {
-	public void main() {
-		int i= 10;
-		/*[*/foo(i);/*]*/
-		int x= 7;
-	}
-	
-	public void foo(int x) {
-		x= x + 10;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceWrite.java
deleted file mode 100644
index 68333fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestLocalReferenceWrite.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_in;
-
-public class TestLocalReferenceWrite {
-	public void main() {
-		int i= 10;
-		/*[*/foo(i);/*]*/
-		i= 10;
-		System.out.println(i);
-	}
-	
-	public void foo(int x) {
-		x= x + 10;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestOneRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestOneRead.java
deleted file mode 100644
index 513ec4e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestOneRead.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package argument_in;
-
-public class TestOneRead {
-	public void main() {
-		/*[*/foo(value());/*]*/
-	}
-	
-	public void foo(int x) {
-		int i= x;
-	}
-	
-	public int value() {
-		return 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused1.java
deleted file mode 100644
index cb88f0f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused1.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_in;
-
-public class TestParameterNameUnused1 {
-	public void main() {
-		{
-			int x= 20;
-		}
-		/*[*/foo(10);/*]*/
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused2.java
deleted file mode 100644
index ffc22fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused2.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package argument_in;
-
-public class TestParameterNameUnused2 {
-	public void main() {
-		for (int x= 10; x < 20; x++)
-			main();
-		/*[*/foo(10);/*]*/
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused3.java
deleted file mode 100644
index ef50702..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUnused3.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_in;
-
-public class TestParameterNameUnused3 {
-	public void main() {
-		class T {
-			int x;
-		}
-		/*[*/foo(10);/*]*/
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed1.java
deleted file mode 100644
index 89053d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed1.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package argument_in;
-
-public class TestParameterNameUsed1 {
-	public void main() {
-		int x= 20;
-		/*[*/foo(10);/*]*/
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed2.java
deleted file mode 100644
index 45a5ed9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed2.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package argument_in;
-
-public class TestParameterNameUsed2 {
-	public void main() {
-		/*[*/foo(10);/*]*/
-		int x= 20;
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed3.java
deleted file mode 100644
index d991e52..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed3.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_in;
-
-public class TestParameterNameUsed3 {
-	public void main() {
-		/*[*/foo(10);/*]*/
-		{
-			int x= 20;
-		}
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed4.java
deleted file mode 100644
index d7304c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestParameterNameUsed4.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package argument_in;
-
-public class TestParameterNameUsed4 {
-	public void main() {
-		class x {}
-		/*[*/foo(10);/*]*/
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestTwoReads.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestTwoReads.java
deleted file mode 100644
index af2e04e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestTwoReads.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package argument_in;
-
-public class TestTwoReads {
-	public void main() {
-		/*[*/foo(value());/*]*/
-	}
-	
-	public void foo(int x) {
-		int i= x;
-		int y= x;
-	}
-	
-	public int value() {
-		return 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestWrite.java
deleted file mode 100644
index 18b74fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_in/TestWrite.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package argument_in;
-
-public class TestWrite {
-	public void main() {
-		/*[*/foo(value());/*]*/
-	}
-	
-	public void foo(int x) {
-		x= 10;
-	}
-	
-	public int value() {
-		return 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestArray.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestArray.java
deleted file mode 100644
index 21d2e25..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestArray.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package argument_out;
-
-public class TestArray {
-
-	public int bar(int a[]) {
-		return a[0];
-	}
-	
-	public void main() {
-		int i= (new int[] {1})[0];
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestFieldReference.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestFieldReference.java
deleted file mode 100644
index 58cdfe6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestFieldReference.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package argument_out;
-
-public class TestFieldReference {
-	private String field;
-	
-	public void main() {
-		field.toString();
-	}
-
-	public void bar(Object o) {
-		o.toString();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLiteralReferenceRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLiteralReferenceRead.java
deleted file mode 100644
index 6e1c292..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLiteralReferenceRead.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package argument_out;
-
-public class TestLiteralReferenceRead {
-	public void main() {
-		int i= 10;
-		bar(10);
-	}
-	
-	public void foo(int x) {
-		int i= x;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLiteralReferenceWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLiteralReferenceWrite.java
deleted file mode 100644
index a9ab2b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLiteralReferenceWrite.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package argument_out;
-
-public class TestLiteralReferenceWrite {
-	public void main() {
-		int x = 10;
-		x= 20;
-		bar(x);
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceLoop.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceLoop.java
deleted file mode 100644
index d40a766..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceLoop.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package argument_out;
-
-public class TestLocalReferenceLoop {
-	public void main() {
-		int i= 10;
-		for (int z= 0; z < i; z++) {
-			int x = i;
-			x= x + 10;
-			bar(x);
-		}
-	}
-	
-	public void foo(int x) {
-		x= x + 10;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferencePrefix.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferencePrefix.java
deleted file mode 100644
index 6e1c0de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferencePrefix.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package argument_out;
-
-public class TestLocalReferencePrefix {
-	public void main() {
-		int a = 0;
-		int b = 1;
-		int c = 2;
-		int d = 3;
-    
-		a = aa((a + ((b & c) | (~b & d))), 0) + b;
-	}
-	
-	private int bb(int u, int v, int w) {
-	  return (u & v) | (~u & w);
-	}
-
-	private int aa(int x, int n) {
-	  return (x << n) | (x >>> (32 - n));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceRead.java
deleted file mode 100644
index 7730ce0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceRead.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package argument_out;
-
-public class TestLocalReferenceRead {
-	public void main() {
-		int foo = 0;
-		int bar = foo;
-		bar++;
-		System.out.println(foo);
-	}
-	
-	public void inlineMe(int bar) {
-		bar++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceRead2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceRead2.java
deleted file mode 100644
index 6cf271a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceRead2.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package argument_out;
-
-public class TestLocalReferenceRead2 {
-	public void main() {
-		int i= 10;
-		int x = i;
-		x= x + 10;
-		bar(x);
-		System.out.println(i);
-	}
-	
-	public void foo(int x) {
-		x= x + 10;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceUnused.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceUnused.java
deleted file mode 100644
index 49a3742..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceUnused.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_out;
-
-public class TestLocalReferenceUnused {
-	public void main() {
-		int i= 10;
-		i= i + 10;
-		bar(i);
-		int x= 7;
-	}
-	
-	public void foo(int x) {
-		x= x + 10;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceWrite.java
deleted file mode 100644
index 94c351b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestLocalReferenceWrite.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package argument_out;
-
-public class TestLocalReferenceWrite {
-	public void main() {
-		int i= 10;
-		i= i + 10;
-		bar(i);
-		i= 10;
-		System.out.println(i);
-	}
-	
-	public void foo(int x) {
-		x= x + 10;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestOneRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestOneRead.java
deleted file mode 100644
index 53b0005..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestOneRead.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package argument_out;
-
-public class TestOneRead {
-	public void main() {
-		int i= value();
-	}
-	
-	public void foo(int x) {
-		int i= x;
-	}
-	
-	public int value() {
-		return 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused1.java
deleted file mode 100644
index fab2ca9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused1.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package argument_out;
-
-public class TestParameterNameUnused1 {
-	public void main() {
-		{
-			int x= 20;
-		}
-		int x = 10;
-		x= 20;
-		bar(x);
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused2.java
deleted file mode 100644
index fe28428..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused2.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package argument_out;
-
-public class TestParameterNameUnused2 {
-	public void main() {
-		for (int x= 10; x < 20; x++)
-			main();
-		int x = 10;
-		x= 20;
-		bar(x);
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused3.java
deleted file mode 100644
index 4300904..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUnused3.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package argument_out;
-
-public class TestParameterNameUnused3 {
-	public void main() {
-		class T {
-			int x;
-		}
-		int x = 10;
-		x= 20;
-		bar(x);
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed1.java
deleted file mode 100644
index a548c66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed1.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_out;
-
-public class TestParameterNameUsed1 {
-	public void main() {
-		int x= 20;
-		int x1 = 10;
-		x1= 20;
-		bar(x1);
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed2.java
deleted file mode 100644
index eb39686..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed2.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_out;
-
-public class TestParameterNameUsed2 {
-	public void main() {
-		int x1 = 10;
-		x1= 20;
-		bar(x1);
-		int x= 20;
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed3.java
deleted file mode 100644
index 52ea327..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed3.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package argument_out;
-
-public class TestParameterNameUsed3 {
-	public void main() {
-		int x1 = 10;
-		x1= 20;
-		bar(x1);
-		{
-			int x= 20;
-		}
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed4.java
deleted file mode 100644
index 839cbe0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestParameterNameUsed4.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_out;
-
-public class TestParameterNameUsed4 {
-	public void main() {
-		class x {}
-		int x1 = 10;
-		x1= 20;
-		bar(x1);
-	}
-	
-	public void foo(int x) {
-		x= 20;
-		bar(x);
-	}
-	
-	public void bar(int z) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestTwoReads.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestTwoReads.java
deleted file mode 100644
index d7b6199..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestTwoReads.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package argument_out;
-
-public class TestTwoReads {
-	public void main() {
-		int x = value();
-		int i= x;
-		int y= x;
-	}
-	
-	public void foo(int x) {
-		int i= x;
-		int y= x;
-	}
-	
-	public int value() {
-		return 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestWrite.java
deleted file mode 100644
index 23ec377..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/argument_out/TestWrite.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package argument_out;
-
-public class TestWrite {
-	public void main() {
-		int x = value();
-		x= 10;
-	}
-	
-	public void foo(int x) {
-		x= 10;
-	}
-	
-	public int value() {
-		return 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestExpressionStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestExpressionStatement.java
deleted file mode 100644
index fdb6313..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestExpressionStatement.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package call_in;
-
-public class TestExpressionStatement {
-	public void main() {
-		/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		System.out.println("Eclipse");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestExpressionStatementWithReturn.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestExpressionStatementWithReturn.java
deleted file mode 100644
index 8ede88c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestExpressionStatementWithReturn.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package call_in;
-
-public class TestExpressionStatementWithReturn {
-	public void main() {
-		/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		System.out.println("Eclipse");
-		return;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestParenthesis.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestParenthesis.java
deleted file mode 100644
index 06c9e22..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestParenthesis.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package call_in;
-
-import java.util.List;
-
-public class TestParenthesis {
-	Object list;
-	
-	public void main() {
-		Object element= /*]*/getList()/*]*/.get(0);
-	}
-	
-	public List getList() {
-		return (List)list;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestStatementWithFunction1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestStatementWithFunction1.java
deleted file mode 100644
index ecc346c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestStatementWithFunction1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package call_in;
-
-class TestStatementWithFunction1 {
-    public void main(){
-       /*]*/foo();/*[*/
-    }
-    
-    public int foo(){
-        return 6;
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestStatementWithFunction2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestStatementWithFunction2.java
deleted file mode 100644
index 2d80def..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_in/TestStatementWithFunction2.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package call_in;
-
-class TestStatementWithFunction2 {
-    public void main(){
-       /*]*/foo();/*[*/
-    }
-    
-    public int foo(){
-        return bar();
-    }
-    public int bar() {
-    	System.out.println("Bar called");
-    	return 10;
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestExpressionStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestExpressionStatement.java
deleted file mode 100644
index 8f08de8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestExpressionStatement.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package call_out;
-
-public class TestExpressionStatement {
-	public void main() {
-		System.out.println("Eclipse");
-	}
-	
-	public void foo() {
-		System.out.println("Eclipse");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestExpressionStatementWithReturn.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestExpressionStatementWithReturn.java
deleted file mode 100644
index 3517750..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestExpressionStatementWithReturn.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package call_out;
-
-public class TestExpressionStatementWithReturn {
-	public void main() {
-		System.out.println("Eclipse");
-	}
-	
-	public void foo() {
-		System.out.println("Eclipse");
-		return;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestParenthesis.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestParenthesis.java
deleted file mode 100644
index d22c2e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestParenthesis.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package call_out;
-
-import java.util.List;
-
-public class TestParenthesis {
-	Object list;
-	
-	public void main() {
-		Object element= /*]*/((List)list).get(0);
-	}
-	
-	public List getList() {
-		return (List)list;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestStatementWithFunction1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestStatementWithFunction1.java
deleted file mode 100644
index 360c031..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestStatementWithFunction1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package call_out;
-
-class TestStatementWithFunction1 {
-    public void main(){
-    }
-    
-    public int foo(){
-        return 6;
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestStatementWithFunction2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestStatementWithFunction2.java
deleted file mode 100644
index 6dbe89a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/call_out/TestStatementWithFunction2.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package call_out;
-
-class TestStatementWithFunction2 {
-    public void main(){
-       bar();
-    }
-    
-    public int foo(){
-        return bar();
-    }
-    public int bar() {
-    	System.out.println("Bar called");
-    	return 10;
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloaded.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloaded.java
deleted file mode 100644
index 0f13bed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloaded.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package cast_in;
-
-class Woo {
-}
-
-class Zoo extends Woo {
-}
-
-class Base {
-	public void foo(Woo w) {
-	}
-}
-
-class Derived extends Base {
-	public void foo(Zoo z) {
-	}
-}
-
-public class TestHierarchyOverloaded {
-	public Woo goo() {
-		return new Zoo();
-	}
-	public void main(Derived d) {
-		d.foo(/*]*/goo()/*[*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloadedPrimitives.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloadedPrimitives.java
deleted file mode 100644
index 3a3c29e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloadedPrimitives.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cast_in;
-
-class Base {
-	public void foo(int i) {
-	}
-}
-
-class Derived extends Base {
-	public void foo(char c) {
-	}
-}
-
-public class TestHierarchyOverloadedPrimitives {
-	public int goo() {
-		return 'a';
-	}
-	public void main(Derived d) {
-		d.foo(/*]*/goo()/*[*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloadedPrivate.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloadedPrivate.java
deleted file mode 100644
index 629937d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestHierarchyOverloadedPrivate.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cast_in;
-
-class Base {
-	public void foo(int i) {
-	}
-}
-
-class Derived extends Base {
-	private void foo(char c) {
-	}
-}
-
-public class TestHierarchyOverloadedPrivate {
-	public int goo() {
-		return 'a';
-	}
-	public void main(Derived d) {
-		d.foo(/*]*/goo()/*[*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNoCast.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNoCast.java
deleted file mode 100644
index 6d9a73c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNoCast.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package cast_in;
-
-public class TestNoCast {
-	String fName;
-	String getName() {
-		return fName;
-	}
-	void foo(TestNoCast o) {
-		System.out.println(/*[*/o.getName()/*]*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNotCastableOverloaded.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNotCastableOverloaded.java
deleted file mode 100644
index be08cfe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNotCastableOverloaded.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package cast_in;
-
-class Woo {
-}
-
-public class TestNotCastableOverloaded {
-	public void foo(int i) {
-	}
-	public void foo(Woo w) {
-	}
-	public int goo() {
-		return 'a';
-	}
-	public void main() {
-		foo(/*]*/goo()/*[*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNotOverloaded.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNotOverloaded.java
deleted file mode 100644
index a5c913c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestNotOverloaded.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package cast_in;
-
-public class TestNotOverloaded {
-	public void foo(int i) {
-	}
-	public int goo() {
-		return 'a';
-	}
-	public void main() {
-		foo(/*]*/goo()/*[*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestOverloaded.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestOverloaded.java
deleted file mode 100644
index 4e90543..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestOverloaded.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cast_in;
-
-class Base {
-}
-
-class Derived extends Base {
-}
-
-public class TestOverloaded {
-	public void foo(Derived d) {
-	}
-	public void foo(Base b) {
-	}
-	public Base goo() {
-		return new Derived();
-	}
-	public void main() {
-		foo(/*]*/goo()/*[*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestOverloadedPrimitives.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestOverloadedPrimitives.java
deleted file mode 100644
index fa3d42f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestOverloadedPrimitives.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package cast_in;
-
-public class TestOverloadedPrimitives {
-	public void foo(int i) {
-	}
-	public void foo(char c) {
-	}
-	public int goo() {
-		return 'a';
-	}
-	public void main() {
-		foo(/*]*/goo()/*[*/);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestReceiverCast.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestReceiverCast.java
deleted file mode 100644
index e84c9be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_in/TestReceiverCast.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package cast_in;
-
-public class TestReceiverCast {
-	private void foo(Object obj){
-		String s= /*]*/goo/*[*/((String)obj);
-	}
-
-	private static String goo(String string){
-		return string.intern();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloaded.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloaded.java
deleted file mode 100644
index c82fcd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloaded.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package cast_out;
-
-class Woo {
-}
-
-class Zoo extends Woo {
-}
-
-class Base {
-	public void foo(Woo w) {
-	}
-}
-
-class Derived extends Base {
-	public void foo(Zoo z) {
-	}
-}
-
-public class TestHierarchyOverloaded {
-	public Woo goo() {
-		return new Zoo();
-	}
-	public void main(Derived d) {
-		d.foo((Woo) new Zoo());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloadedPrimitives.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloadedPrimitives.java
deleted file mode 100644
index c141d63..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloadedPrimitives.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cast_out;
-
-class Base {
-	public void foo(int i) {
-	}
-}
-
-class Derived extends Base {
-	public void foo(char c) {
-	}
-}
-
-public class TestHierarchyOverloadedPrimitives {
-	public int goo() {
-		return 'a';
-	}
-	public void main(Derived d) {
-		d.foo((int) 'a');
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloadedPrivate.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloadedPrivate.java
deleted file mode 100644
index ef9b438..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestHierarchyOverloadedPrivate.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cast_out;
-
-class Base {
-	public void foo(int i) {
-	}
-}
-
-class Derived extends Base {
-	private void foo(char c) {
-	}
-}
-
-public class TestHierarchyOverloadedPrivate {
-	public int goo() {
-		return 'a';
-	}
-	public void main(Derived d) {
-		d.foo((int) 'a');
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNoCast.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNoCast.java
deleted file mode 100644
index 517a146..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNoCast.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package cast_out;
-
-public class TestNoCast {
-	String fName;
-	String getName() {
-		return fName;
-	}
-	void foo(TestNoCast o) {
-		System.out.println(fName);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNotCastableOverloaded.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNotCastableOverloaded.java
deleted file mode 100644
index 2fef669..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNotCastableOverloaded.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package cast_out;
-
-class Woo {
-}
-
-public class TestNotCastableOverloaded {
-	public void foo(int i) {
-	}
-	public void foo(Woo w) {
-	}
-	public int goo() {
-		return 'a';
-	}
-	public void main() {
-		foo('a');
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNotOverloaded.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNotOverloaded.java
deleted file mode 100644
index 782788e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestNotOverloaded.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package cast_out;
-
-public class TestNotOverloaded {
-	public void foo(int i) {
-	}
-	public int goo() {
-		return 'a';
-	}
-	public void main() {
-		foo('a');
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestOverloaded.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestOverloaded.java
deleted file mode 100644
index f6dbb9e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestOverloaded.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cast_out;
-
-class Base {
-}
-
-class Derived extends Base {
-}
-
-public class TestOverloaded {
-	public void foo(Derived d) {
-	}
-	public void foo(Base b) {
-	}
-	public Base goo() {
-		return new Derived();
-	}
-	public void main() {
-		foo((Base) new Derived());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestOverloadedPrimitives.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestOverloadedPrimitives.java
deleted file mode 100644
index b89eb20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestOverloadedPrimitives.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package cast_out;
-
-public class TestOverloadedPrimitives {
-	public void foo(int i) {
-	}
-	public void foo(char c) {
-	}
-	public int goo() {
-		return 'a';
-	}
-	public void main() {
-		foo((int) 'a');
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestReceiverCast.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestReceiverCast.java
deleted file mode 100644
index 0fd78ed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/cast_out/TestReceiverCast.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package cast_out;
-
-public class TestReceiverCast {
-	private void foo(Object obj){
-		String s= ((String)obj).intern();
-	}
-
-	private static String goo(String string){
-		return string.intern();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForAssignmentOne.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForAssignmentOne.java
deleted file mode 100644
index 047a3da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForAssignmentOne.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package controlStatement_in;
-
-public class TestForAssignmentOne {
-	public void main() {
-		int x;
-		for (int i= 0; i < 10; i++)
-			x= /*]*/foo()/*[*/;
-	}
-	
-	public int foo() {
-		return 20;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForAssignmentTwo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForAssignmentTwo.java
deleted file mode 100644
index 6b18aee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForAssignmentTwo.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package controlStatement_in;
-
-public class TestForAssignmentTwo {
-	public void main() {
-		int x;
-		for (int i= 0; i < 10; i++)
-			x= /*]*/foo()/*[*/;
-	}
-	
-	public int foo() {
-		int x;
-		return 20;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForEmpty.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForEmpty.java
deleted file mode 100644
index e8054e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForEmpty.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package controlStatement_in;
-
-public class TestForEmpty {
-	public void main() {
-		for (int i= 0; i < 10; i++)
-			/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForOne.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForOne.java
deleted file mode 100644
index 424a145..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForOne.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package controlStatement_in;
-
-public class TestForOne {
-	public void main() {
-		for (int i= 0; i < 10; i++)
-			/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		bar();
-	}
-	public void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForTwo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForTwo.java
deleted file mode 100644
index 6969738..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestForTwo.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package controlStatement_in;
-
-public class TestForTwo {
-	public void main() {
-		for (int i= 0; i < 10; i++)
-			/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		bar();
-		bar();
-	}
-	public void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestIfElseTwo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestIfElseTwo.java
deleted file mode 100644
index 0401472..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestIfElseTwo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package controlStatement_in;
-
-public class TestIfElseTwo {
-	public void main() {
-		if (true)
-			main();
-		else
-			/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		bar();
-		bar();
-	}
-	public void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestIfThenTwo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestIfThenTwo.java
deleted file mode 100644
index 4853ef0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_in/TestIfThenTwo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package controlStatement_in;
-
-public class TestIfThenTwo {
-	public void main() {
-		if (true)
-			/*]*/foo();/*[*/
-		else
-			main();
-	}
-	
-	public void foo() {
-		bar();
-		bar();
-	}
-	public void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForAssignmentOne.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForAssignmentOne.java
deleted file mode 100644
index 205f5fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForAssignmentOne.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package controlStatement_out;
-
-public class TestForAssignmentOne {
-	public void main() {
-		int x;
-		for (int i= 0; i < 10; i++)
-			x= 20;
-	}
-	
-	public int foo() {
-		return 20;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForAssignmentTwo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForAssignmentTwo.java
deleted file mode 100644
index c223ed0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForAssignmentTwo.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package controlStatement_out;
-
-public class TestForAssignmentTwo {
-	public void main() {
-		int x;
-		for (int i= 0; i < 10; i++) {
-			int x1;
-			x= 20;
-		}
-	}
-	
-	public int foo() {
-		int x;
-		return 20;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForEmpty.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForEmpty.java
deleted file mode 100644
index 974a709..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForEmpty.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package controlStatement_out;
-
-public class TestForEmpty {
-	public void main() {
-		for (int i= 0; i < 10; i++);
-	}
-	
-	public void foo() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForOne.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForOne.java
deleted file mode 100644
index 76df6d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForOne.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package controlStatement_out;
-
-public class TestForOne {
-	public void main() {
-		for (int i= 0; i < 10; i++)
-			bar();
-	}
-	
-	public void foo() {
-		bar();
-	}
-	public void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForTwo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForTwo.java
deleted file mode 100644
index e00d9a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestForTwo.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package controlStatement_out;
-
-public class TestForTwo {
-	public void main() {
-		for (int i= 0; i < 10; i++) {
-			bar();
-			bar();
-		}
-	}
-	
-	public void foo() {
-		bar();
-		bar();
-	}
-	public void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestIfElseTwo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestIfElseTwo.java
deleted file mode 100644
index c55f339..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestIfElseTwo.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package controlStatement_out;
-
-public class TestIfElseTwo {
-	public void main() {
-		if (true)
-			main();
-		else {
-			bar();
-			bar();
-		}
-	}
-	
-	public void foo() {
-		bar();
-		bar();
-	}
-	public void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestIfThenTwo.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestIfThenTwo.java
deleted file mode 100644
index 998c73c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/controlStatement_out/TestIfThenTwo.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package controlStatement_out;
-
-public class TestIfThenTwo {
-	public void main() {
-		if (true) {
-			bar();
-			bar();
-		} else
-			main();
-	}
-	
-	public void foo() {
-		bar();
-		bar();
-	}
-	public void bar() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestAssignment.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestAssignment.java
deleted file mode 100644
index 90b101e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestAssignment.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_in;
-
-public class TestAssignment {
-	public void main() {
-		int i= 0;
-		i= /*]*/foo()/*[*/;
-	}
-	public int foo() {
-		int x= 20;
-		return x++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestReturnStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestReturnStatement.java
deleted file mode 100644
index f128bb3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestReturnStatement.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package expression_in;
-
-public class TestReturnStatement {
-	public int main() {
-		return /*]*/foo()/*[*/;
-	}
-	
-	public int foo() {
-		if (true) {
-			return 10;
-		}
-		return 20;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleBody.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleBody.java
deleted file mode 100644
index be20e2e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleBody.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_in;
-
-public class TestSimpleBody {
-	public void main() {
-		int i= 10 * /*]*/foo()/*[*/;
-	}
-	
-	public int foo() {
-		return 1 + 2;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleExpression.java
deleted file mode 100644
index e6a6c92..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleExpression.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_in;
-
-public class TestSimpleExpression {
-	public void main() {
-		int i= /*]*/foo()/*[*/;
-	}
-	
-	public int foo() {
-		return 1 + 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleExpressionWithStatements.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleExpressionWithStatements.java
deleted file mode 100644
index 3b4ca4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_in/TestSimpleExpressionWithStatements.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package expression_in;
-
-public class TestSimpleExpressionWithStatements {
-	public void main() {
-		int i= /*]*/foo()/*[*/;
-	}
-	
-	public int foo() {
-		int x= 20;
-		return x + 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestAssignment.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestAssignment.java
deleted file mode 100644
index 32b42c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestAssignment.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package expression_out;
-
-public class TestAssignment {
-	public void main() {
-		int i= 0;
-		int x= 20;
-		i= x++;
-	}
-	public int foo() {
-		int x= 20;
-		return x++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestReturnStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestReturnStatement.java
deleted file mode 100644
index 4246899..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestReturnStatement.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package expression_out;
-
-public class TestReturnStatement {
-	public int main() {
-		if (true) {
-			return 10;
-		}
-		return 20;
-	}
-	
-	public int foo() {
-		if (true) {
-			return 10;
-		}
-		return 20;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleBody.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleBody.java
deleted file mode 100644
index 9845306..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleBody.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_out;
-
-public class TestSimpleBody {
-	public void main() {
-		int i= 10 * (1 + 2);
-	}
-	
-	public int foo() {
-		return 1 + 2;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleExpression.java
deleted file mode 100644
index 5338d26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleExpression.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package expression_out;
-
-public class TestSimpleExpression {
-	public void main() {
-		int i= 1 + 1;
-	}
-	
-	public int foo() {
-		return 1 + 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleExpressionWithStatements.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleExpressionWithStatements.java
deleted file mode 100644
index ac31c8f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/expression_out/TestSimpleExpressionWithStatements.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package expression_out;
-
-public class TestSimpleExpressionWithStatements {
-	public void main() {
-		int x= 20;
-		int i= x + 1;
-	}
-	
-	public int foo() {
-		int x= 20;
-		return x + 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/Provider.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/Provider.java
deleted file mode 100644
index 582a083..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/Provider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package import_in;
-
-import import_use.List;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Map;
-
-public class Provider {
-	public File useAsReturn() {
-		return null;
-	}
-	public void useInArgument(File file) {
-		file= null;
-	}
-	public void useInDecl() {
-		List list= null;
-	}
-	public int useInDecl2(){
-	  return new ArrayList().size();
-	}	
-	public Object useInDecl3(){
-	  return new java.util.HashMap();
-	}	
-	public void useInClassLiteral() {
-		Class clazz= File.class;
-	}
-	public void useArray() {
-		List[] lists= null;
-	}
-	public void useInLocalClass() {
-		class Local extends File implements Comparable {
-			public Local(String s) {
-				super(s);
-			}
-			public void foo(Map map) {
-			}
-			public int compareTo(Object o) {
-				return 0;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseArray.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseArray.java
deleted file mode 100644
index 370848a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseArray.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package import_in;
-
-public class TestUseArray {
-	public void main() {
-		Provider p= null;
-		/*]*/p.useArray();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInArgument.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInArgument.java
deleted file mode 100644
index 95afaef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInArgument.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package import_in;
-
-public class TestUseInArgument {
-	public void main() {
-		Provider p= null;
-		/*]*/p.useInArgument(p.useAsReturn());/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInClassLiteral.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInClassLiteral.java
deleted file mode 100644
index 2ae4e90..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInClassLiteral.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package import_in;
-
-public class TestUseInClassLiteral {
-	public void main() {
-		Provider p= null;
-		/*]*/p.useInClassLiteral();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl.java
deleted file mode 100644
index a301cbb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package import_in;
-
-public class TestUseInDecl {
-	public void main() {
-		Provider p= null;
-		/*]*/p.useInDecl();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl2.java
deleted file mode 100644
index a43d24f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package import_in;
-
-public class TestUseInDecl2 {
-	public void main() {
-		Provider p= null;
-		/*]*/p.useInDecl2();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl3.java
deleted file mode 100644
index efb6168..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDecl3.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package import_in;
-
-public class TestUseInDecl3 {
-	public void main() {
-		Provider p= null;
-		/*]*/p.useInDecl3();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDeclClash.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDeclClash.java
deleted file mode 100644
index 5dd4a4d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInDeclClash.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package import_in;
-
-import java.util.List;
-
-public class TestUseInDeclClash {
-	List fList;
-	public void main() {
-		Provider p= null;
-		/*]*/p.useInDecl();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInLocalClass.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInLocalClass.java
deleted file mode 100644
index a66a7f8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_in/TestUseInLocalClass.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package import_in;
-
-public class TestUseInLocalClass {
-	public void main() {
-		Provider p= null;
-		/*]*/p.useInLocalClass();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/Provider.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/Provider.java
deleted file mode 100644
index 172f979..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/Provider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package import_out;
-
-import import_use.List;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Map;
-
-public class Provider {
-	public File useAsReturn() {
-		return null;
-	}
-	public void useInArgument(File file) {
-		file= null;
-	}
-	public void useInDecl() {
-		List list= null;
-	}
-	public int useInDecl2(){
-	  return new ArrayList().size();
-	}	
-	public Object useInDecl3(){
-	  return new java.util.HashMap();
-	}	
-	public void useInClassLiteral() {
-		Class clazz= File.class;
-	}
-	public void useArray() {
-		List[] lists= null;
-	}
-	public void useInLocalClass() {
-		class Local extends File implements Comparable {
-			public Local(String s) {
-				super(s);
-			}
-			public void foo(Map map) {
-			}
-			public int compareTo(Object o) {
-				return 0;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseArray.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseArray.java
deleted file mode 100644
index 9ee15c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseArray.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package import_out;
-
-import import_use.List;
-
-public class TestUseArray {
-	public void main() {
-		Provider p= null;
-		List[] lists= null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInArgument.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInArgument.java
deleted file mode 100644
index cbed052..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInArgument.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package import_out;
-
-import java.io.File;
-
-public class TestUseInArgument {
-	public void main() {
-		Provider p= null;
-		File file = p.useAsReturn();
-		file= null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInClassLiteral.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInClassLiteral.java
deleted file mode 100644
index 7b76c23..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInClassLiteral.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package import_out;
-
-import java.io.File;
-
-public class TestUseInClassLiteral {
-	public void main() {
-		Provider p= null;
-		Class clazz= File.class;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl.java
deleted file mode 100644
index 22039cc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package import_out;
-
-import import_use.List;
-
-public class TestUseInDecl {
-	public void main() {
-		Provider p= null;
-		List list= null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl2.java
deleted file mode 100644
index f6b67d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl2.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package import_out;
-
-import java.util.ArrayList;
-
-public class TestUseInDecl2 {
-	public void main() {
-		Provider p= null;
-		new ArrayList().size();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl3.java
deleted file mode 100644
index 241bd0f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDecl3.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package import_out;
-
-public class TestUseInDecl3 {
-	public void main() {
-		Provider p= null;
-		new java.util.HashMap();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDeclClash.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDeclClash.java
deleted file mode 100644
index e8a1986..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInDeclClash.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package import_out;
-
-import java.util.List;
-
-public class TestUseInDeclClash {
-	List fList;
-	public void main() {
-		Provider p= null;
-		import_use.List list= null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInLocalClass.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInLocalClass.java
deleted file mode 100644
index aadceec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_out/TestUseInLocalClass.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package import_out;
-
-import java.io.File;
-import java.util.Map;
-
-public class TestUseInLocalClass {
-	public void main() {
-		Provider p= null;
-		class Local extends File implements Comparable {
-			public Local(String s) {
-				super(s);
-			}
-			public void foo(Map map) {
-			}
-			public int compareTo(Object o) {
-				return 0;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_use/List.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_use/List.java
deleted file mode 100644
index b41be5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/import_use/List.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package import_use;
-
-public class List {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError1.java
deleted file mode 100644
index ac7bd5a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalid;
-
-public class TestCompileError1 {
-	public void main() {
-		/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		T t= null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError2.java
deleted file mode 100644
index be0c861..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError2.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalid;
-
-public class TestCompileError2 {
-	public void main() {
-		/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		main()
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError3.java
deleted file mode 100644
index b13e249..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestCompileError3.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalid;
-
-public class TestCompileError3 {
-	public void main() {
-		/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		{
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestComplexBody.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestComplexBody.java
deleted file mode 100644
index ddf310b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestComplexBody.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package invalid;
-
-public class TestComplexBody {
-	public void main() {
-		int i= 10 + /*]*/foo()/*[*/;
-	}
-	
-	public int foo() {
-		int i= 20;
-		return i + 2;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInterruptedStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInterruptedStatement.java
deleted file mode 100644
index 2bb989d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInterruptedStatement.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package invalid;
-
-public class TestInterruptedStatement {
-	public void main() {
-		/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		if (true) {
-			System.out.println("Eclipse");
-			return;
-		}	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer1.java
deleted file mode 100644
index 3c0bcae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalid;
-
-public class TestInvalidFieldInitializer1 {
-	
-	private int field= /*]*/foo()/*[*/;	
-	
-	public int foo() {
-		int a= 0;
-		return 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer2.java
deleted file mode 100644
index 6574596..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer2.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalid;
-
-public class TestInvalidFieldInitializer2 {
-	
-	private int field= /*]*/foo(null)/*[*/;	
-	
-	public Object foo(Object obj) {
-		return obj = new Object();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer3.java
deleted file mode 100644
index 995fc42..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestInvalidFieldInitializer3.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalid;
-
-public class TestInvalidFieldInitializer3 {
-	
-	private Object field= /*]*/foo()/*[*/;	
-	
-	public Object foo() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestLocalInitializer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestLocalInitializer.java
deleted file mode 100644
index d5a94ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestLocalInitializer.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package invalid;
-
-public class TestLocalInitializer {
-	
-	public void foo() {
-		int i= /*]*/bar()/*[*/;
-	}
-
-	public int bar() {
-		if (true)
-			return 1;
-		else
-			return 2;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestMultiLocal.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestMultiLocal.java
deleted file mode 100644
index f7c88b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestMultiLocal.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package invalid;
-
-public class TestMultiLocal {
-	
-	public void foo() {
-		int i= /*]*/bar()/*[*/, x;
-	}
-
-	public int bar() {
-		if (true)
-			return 1;
-		else
-			return 2;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestRecursion.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestRecursion.java
deleted file mode 100644
index 015f407..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/invalid/TestRecursion.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalid;
-
-public class TestRecursion {
-	public void main() {
-		/*]*/foo();/*[*/
-	}
-	
-	public void foo() {
-		foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestBlocks.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestBlocks.java
deleted file mode 100644
index 211b244..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestBlocks.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package nameconflict_in;
-
-public class TestBlocks {
-	public void main() {
-		if (true) {
-			/*[*/foo();/*]*/
-		}
-		if (true) {
-			int x= 1;
-		}
-	}
-	
-	private void foo() {
-		int x= 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestFieldInType.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestFieldInType.java
deleted file mode 100644
index 73b0844..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestFieldInType.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package nameconflict_in;
-
-public class TestFieldInType {
-	public void main() {
-		/*[*/foo();/*]*/
-		class T {
-			int x;
-		}
-	}
-	
-	public void foo() {
-		int x= 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestLocalInType.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestLocalInType.java
deleted file mode 100644
index b9d9c91..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestLocalInType.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package nameconflict_in;
-
-public class TestLocalInType {
-	public void main() {
-		/*[*/foo();/*]*/
-		class T {
-			void bar() {
-				int x;
-			}
-		}
-	}
-	
-	public void foo() {
-		int x= 10;
-		int bar= 20;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameLocal.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameLocal.java
deleted file mode 100644
index 7aa8140..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameLocal.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package nameconflict_in;
-
-public class TestSameLocal {
-	public void main() {
-		int i= 10;
-		/*[*/foo();/*]*/
-	}
-	
-	public void foo() {
-		int i= 20;
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameType.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameType.java
deleted file mode 100644
index 7c302a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameType.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package nameconflict_in;
-
-public class TestSameType {
-	public void main() {
-		class T {
-			public T() {}
-		}
-		/*[*/foo();/*]*/
-	}
-	
-	public void foo() {
-		class T {
-			T t;
-			public T() {}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameTypeAfter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameTypeAfter.java
deleted file mode 100644
index 257d4c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameTypeAfter.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package nameconflict_in;
-
-public class TestSameTypeAfter {
-	public void main() {
-		/*[*/foo();/*]*/
-		class T {
-			public T() {}
-		}
-	}
-	
-	public void foo() {
-		class T {
-			T t;
-			public T() {}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameTypeInSibling.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameTypeInSibling.java
deleted file mode 100644
index 2e4e5c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSameTypeInSibling.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package nameconflict_in;
-
-public class TestSameTypeInSibling {
-	public void main() {
-		class T {
-			public T() {}
-		}
-		int x= 10;
-		/*[*/foo();/*]*/
-	}
-	
-	public void foo() {
-		class T {
-			T t;
-			public T() {}
-		}
-		class X {
-			T t;
-			void foo() {
-				int x;
-				T t;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSwitchStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSwitchStatement.java
deleted file mode 100644
index 99d0a5f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestSwitchStatement.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package nameconflict_in;
-
-public class TestSwitchStatement {
-	public void main() {
-		int i= 10;
-		switch(i) {
-			case 0:
-				break;
-			case 10:
-				/*[*/foo();/*]*/
-				break;
-		}
-	}
-	
-	public void foo() {
-		int i= 20;
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestTwoCalls.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestTwoCalls.java
deleted file mode 100644
index 85942ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_in/TestTwoCalls.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package nameconflict_in;
-
-public class TestTwoCalls {
-	public void main() {
-		int x= 0;
-		/*]*/foo();/*[*/
-		/*]*/foo();/*[*/
-	}
-	
-	private void foo() {
-		int x= 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestBlocks.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestBlocks.java
deleted file mode 100644
index 46c0d4d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestBlocks.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package nameconflict_out;
-
-public class TestBlocks {
-	public void main() {
-		if (true) {
-			int x= 1;
-		}
-		if (true) {
-			int x= 1;
-		}
-	}
-	
-	private void foo() {
-		int x= 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestFieldInType.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestFieldInType.java
deleted file mode 100644
index 488df1c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestFieldInType.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package nameconflict_out;
-
-public class TestFieldInType {
-	public void main() {
-		int x= 10;
-		class T {
-			int x;
-		}
-	}
-	
-	public void foo() {
-		int x= 10;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestLocalInType.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestLocalInType.java
deleted file mode 100644
index 70a0c26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestLocalInType.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package nameconflict_out;
-
-public class TestLocalInType {
-	public void main() {
-		int x= 10;
-		int bar= 20;
-		class T {
-			void bar() {
-				int x;
-			}
-		}
-	}
-	
-	public void foo() {
-		int x= 10;
-		int bar= 20;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameLocal.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameLocal.java
deleted file mode 100644
index 3b029ea..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameLocal.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package nameconflict_out;
-
-public class TestSameLocal {
-	public void main() {
-		int i= 10;
-		int i1= 20;
-		i1++;
-	}
-	
-	public void foo() {
-		int i= 20;
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameType.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameType.java
deleted file mode 100644
index 6b7b552..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameType.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package nameconflict_out;
-
-public class TestSameType {
-	public void main() {
-		class T {
-			public T() {}
-		}
-		class T1 {
-			T1 t;
-			public T1() {}
-		}
-	}
-	
-	public void foo() {
-		class T {
-			T t;
-			public T() {}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameTypeAfter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameTypeAfter.java
deleted file mode 100644
index a17c102..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameTypeAfter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package nameconflict_out;
-
-public class TestSameTypeAfter {
-	public void main() {
-		class T1 {
-			T1 t;
-			public T1() {}
-		}
-		class T {
-			public T() {}
-		}
-	}
-	
-	public void foo() {
-		class T {
-			T t;
-			public T() {}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameTypeInSibling.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameTypeInSibling.java
deleted file mode 100644
index ce2dcb5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSameTypeInSibling.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package nameconflict_out;
-
-public class TestSameTypeInSibling {
-	public void main() {
-		class T {
-			public T() {}
-		}
-		int x= 10;
-		class T1 {
-			T1 t;
-			public T1() {}
-		}
-		class X {
-			T1 t;
-			void foo() {
-				int x;
-				T1 t;
-			}
-		}
-	}
-	
-	public void foo() {
-		class T {
-			T t;
-			public T() {}
-		}
-		class X {
-			T t;
-			void foo() {
-				int x;
-				T t;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSwitchStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSwitchStatement.java
deleted file mode 100644
index 5c9d870..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/nameconflict_out/TestSwitchStatement.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package nameconflict_out;
-
-public class TestSwitchStatement {
-	public void main() {
-		int i= 10;
-		switch(i) {
-			case 0:
-				break;
-			case 10:
-				int i1= 20;
-				i1++;
-				break;
-		}
-	}
-	
-	public void foo() {
-		int i= 20;
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionOneImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionOneImplicitReceiver.java
deleted file mode 100644
index 0097b0d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionOneImplicitReceiver.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package receiver_in;
-
-public class TestExpressionOneImplicitReceiver {
-	private class ImplicitReceiver {
-		public void foo() {
-			bar();
-		}
-		public void bar() {
-		}
-	}
-
-	public void main() {
-		/*]*/getObject().foo();/*[*/
-	}
-	
-	private ImplicitReceiver getObject() {
-		return new ImplicitReceiver();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionTwoImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionTwoImplicitReceiver.java
deleted file mode 100644
index 82362c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionTwoImplicitReceiver.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package receiver_in;
-
-public class TestExpressionTwoImplicitReceiver {
-	private class ImplicitReceiver {
-		public void foo() {
-			bar();
-			bar();
-		}
-		public void bar() {
-		}
-	}
-
-	public void main() {
-		/*]*/getObject().foo();/*[*/
-	}
-	
-	private ImplicitReceiver getObject() {
-		return new ImplicitReceiver();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionZeroImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionZeroImplicitReceiver.java
deleted file mode 100644
index 92fbe6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestExpressionZeroImplicitReceiver.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package receiver_in;
-
-public class TestExpressionZeroImplicitReceiver {
-	private class ImplicitReceiver {
-		public void foo() {
-			System.out.println("Eclipse");
-		}
-	}
-
-	public void main() {
-		/*]*/getObject().foo();/*[*/
-	}
-	
-	private ImplicitReceiver getObject() {
-		return new ImplicitReceiver();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNameImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNameImplicitReceiver.java
deleted file mode 100644
index 8c9a71e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNameImplicitReceiver.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package receiver_in;
-
-public class TestNameImplicitReceiver {
-	private class ImplicitReceiver {
-		public void foo() {
-			bar();
-		}
-		public void bar() {
-		}
-	}
-	
-	public void main() {
-		ImplicitReceiver a= new ImplicitReceiver();
-		
-		/*]*/a.foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNameThisReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNameThisReceiver.java
deleted file mode 100644
index c84f1c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNameThisReceiver.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package receiver_in;
-
-public class TestNameThisReceiver {
-	class ThisReceiver {
-		public void foo() {
-			this.bar();
-		}
-		public void bar() {
-		}
-	}
-
-	public void main() {
-		ThisReceiver a= new ThisReceiver();
-		
-		/*]*/a.foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNoImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNoImplicitReceiver.java
deleted file mode 100644
index ee31fa1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestNoImplicitReceiver.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package receiver_in;
-
-public class TestNoImplicitReceiver {
-	class NoImplicitReceiver {
-		public void foo() {
-			System.out.println("Eclipse");
-		}
-	}
-
-	public void main() {
-		NoImplicitReceiver a= new NoImplicitReceiver();
-		
-		/*]*/a.foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestReceiverWithStatic.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestReceiverWithStatic.java
deleted file mode 100644
index 9630755..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestReceiverWithStatic.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package receiver_in;
-
-public class TestReceiverWithStatic {
-	private static class ThisReceiver {
-		public void foo() {
-			bar();
-			baz();
-		}
-		public void bar() {
-		}
-		public static void baz() {
-		}
-	}
-
-	public void main() {
-		ThisReceiver a= new ThisReceiver();
-		
-		/*]*/a.foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestStaticReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestStaticReceiver.java
deleted file mode 100644
index 6726f53..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestStaticReceiver.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package receiver_in;
-
-public class TestStaticReceiver {
-	private static class StaticReceiver {
-		public static void foo() {
-			bar();
-		}
-		public static void bar() {
-		}
-	}
-
-	public void main() {
-		/*]*/StaticReceiver.foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestThisExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestThisExpression.java
deleted file mode 100644
index f2f9135..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_in/TestThisExpression.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package receiver_in;
-
-public class TestThisExpression {
-	void m(C c){
-		c.m(this);
-		class X {
-			void foo() {
-				foo();
-			}
-		}
-	}
-}
-
-class C {
-	void m(TestThisExpression t){
-	}
-}
-
-class Client{
-	void f(){
-		TestThisExpression t= null;
-		C c= null;
-		/*]*/t.m(c);/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionOneImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionOneImplicitReceiver.java
deleted file mode 100644
index 283dd1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionOneImplicitReceiver.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package receiver_out;
-
-public class TestExpressionOneImplicitReceiver {
-	private class ImplicitReceiver {
-		public void foo() {
-			bar();
-		}
-		public void bar() {
-		}
-	}
-
-	public void main() {
-		getObject().bar();
-	}
-	
-	private ImplicitReceiver getObject() {
-		return new ImplicitReceiver();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionTwoImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionTwoImplicitReceiver.java
deleted file mode 100644
index 0097c4a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionTwoImplicitReceiver.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package receiver_out;
-
-public class TestExpressionTwoImplicitReceiver {
-	private class ImplicitReceiver {
-		public void foo() {
-			bar();
-			bar();
-		}
-		public void bar() {
-		}
-	}
-
-	public void main() {
-		ImplicitReceiver r = getObject();
-		r.bar();
-		r.bar();
-	}
-	
-	private ImplicitReceiver getObject() {
-		return new ImplicitReceiver();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionZeroImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionZeroImplicitReceiver.java
deleted file mode 100644
index 5bcd749..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestExpressionZeroImplicitReceiver.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package receiver_out;
-
-public class TestExpressionZeroImplicitReceiver {
-	private class ImplicitReceiver {
-		public void foo() {
-			System.out.println("Eclipse");
-		}
-	}
-
-	public void main() {
-		ImplicitReceiver r = getObject();
-		System.out.println("Eclipse");
-	}
-	
-	private ImplicitReceiver getObject() {
-		return new ImplicitReceiver();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNameImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNameImplicitReceiver.java
deleted file mode 100644
index 8b733bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNameImplicitReceiver.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package receiver_out;
-
-public class TestNameImplicitReceiver {
-	private class ImplicitReceiver {
-		public void foo() {
-			bar();
-		}
-		public void bar() {
-		}
-	}
-	
-	public void main() {
-		ImplicitReceiver a= new ImplicitReceiver();
-		
-		a.bar();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNameThisReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNameThisReceiver.java
deleted file mode 100644
index 443c12f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNameThisReceiver.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package receiver_out;
-
-public class TestNameThisReceiver {
-	class ThisReceiver {
-		public void foo() {
-			this.bar();
-		}
-		public void bar() {
-		}
-	}
-
-	public void main() {
-		ThisReceiver a= new ThisReceiver();
-		
-		a.bar();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNoImplicitReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNoImplicitReceiver.java
deleted file mode 100644
index c364fac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestNoImplicitReceiver.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package receiver_out;
-
-public class TestNoImplicitReceiver {
-	class NoImplicitReceiver {
-		public void foo() {
-			System.out.println("Eclipse");
-		}
-	}
-
-	public void main() {
-		NoImplicitReceiver a= new NoImplicitReceiver();
-		
-		System.out.println("Eclipse");
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestReceiverWithStatic.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestReceiverWithStatic.java
deleted file mode 100644
index c01012e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestReceiverWithStatic.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package receiver_out;
-
-public class TestReceiverWithStatic {
-	private static class ThisReceiver {
-		public void foo() {
-			bar();
-			baz();
-		}
-		public void bar() {
-		}
-		public static void baz() {
-		}
-	}
-
-	public void main() {
-		ThisReceiver a= new ThisReceiver();
-		
-		a.bar();
-		ThisReceiver.baz();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestStaticReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestStaticReceiver.java
deleted file mode 100644
index a4cb0a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestStaticReceiver.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package receiver_out;
-
-public class TestStaticReceiver {
-	private static class StaticReceiver {
-		public static void foo() {
-			bar();
-		}
-		public static void bar() {
-		}
-	}
-
-	public void main() {
-		StaticReceiver.bar();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestThisExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestThisExpression.java
deleted file mode 100644
index 2010422..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/receiver_out/TestThisExpression.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package receiver_out;
-
-public class TestThisExpression {
-	void m(C c){
-		c.m(this);
-		class X {
-			void foo() {
-				foo();
-			}
-		}
-	}
-}
-
-class C {
-	void m(TestThisExpression t){
-	}
-}
-
-class Client{
-	void f(){
-		TestThisExpression t= null;
-		C c= null;
-		c.m(t);
-		class X {
-			void foo() {
-				foo();
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestBasic1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestBasic1.java
deleted file mode 100644
index 4800d6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestBasic1.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package simple_in;
-
-public class TestBasic1 {
-	public void main() {
-		/*[*/bar();/*]*/
-	}
-	
-	public void bar() {
-		baz();
-	}
-	public void baz() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestBasic2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestBasic2.java
deleted file mode 100644
index 50f6707..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestBasic2.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package simple_in;
-
-public class TestBasic2 {
-	public void main() {
-		/*[*/bar();/*]*/
-	}
-	
-	public void bar() {
-		for (int i= 0; i < 10; i++) {
-			baz();
-		}
-		baz();
-	}
-	public void baz() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestConstructor1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestConstructor1.java
deleted file mode 100644
index 1601996..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestConstructor1.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package simple_in;
-
-public class TestConstructor1 {
-	
-	private Object object;
-
-	public TestConstructor1(Object o) {
-		object= o;
-	}
-
-	public TestConstructor1(Object o, int i) {
-		/*]*/this(o)/*[*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestEmptyBody.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestEmptyBody.java
deleted file mode 100644
index 99f126e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestEmptyBody.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package simple_in;
-
-public class TestEmptyBody {
-	public void main() {
-		/*[*/foo();/*]*/
-	}
-	
-	public void foo() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestFieldInitializer1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestFieldInitializer1.java
deleted file mode 100644
index a605650..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestFieldInitializer1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package simple_in;
-
-public class TestFieldInitializer1 {
-	
-	private int field= /*]*/foo()/*[*/;	
-	
-	public int foo() {
-		return 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestFieldInitializer2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestFieldInitializer2.java
deleted file mode 100644
index 261ca49..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestFieldInitializer2.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package simple_in;
-
-public class TestFieldInitializer2 {
-	
-	public void foo() {
-		class Woo {
-			private int field= /*]*/goo()/*[*/;
-			
-			public int goo() {
-				return 1;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestInitializer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestInitializer.java
deleted file mode 100644
index 6c5036e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestInitializer.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package simple_in;
-
-public class TestInitializer {
-	static {
-		/*[*/foo();/*]*/
-	}
-	
-	public static void foo() {
-		System.out.println("Eclipse");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestLabeledStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestLabeledStatement.java
deleted file mode 100644
index d552b88..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestLabeledStatement.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package simple_in;
-
-public class TestLabeledStatement {
-
-	public static void main() {
-		/*[*/foo();/*]*/
-	}
-
-	public static void foo() {
-		the_label:
-		while(true) {
-			break the_label;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestPrimitiveArray.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestPrimitiveArray.java
deleted file mode 100644
index bf80b77..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestPrimitiveArray.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package simple_in;
-
-public class TestPrimitiveArray {
-	public void main() {
-		/*[*/foo(null);/*]*/
-	}
-	
-	public void foo(int[][] x) {
-		x= new int[10][];
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestSuper.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestSuper.java
deleted file mode 100644
index ba2aa5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestSuper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package simple_in;
-
-public class TestSuper {
-  private static class A {
-    void foo() {
-    	bar();    
-    }
-    void bar() {
-    }
-  }
-  private static class B extends A {
-    void foo() {
-      /*[*/super.foo();/*]*/
-    }
-  }
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestTypeArray.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestTypeArray.java
deleted file mode 100644
index afcae81..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_in/TestTypeArray.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package simple_in;
-
-public class TestTypeArray {
-	public void main() {
-		/*[*/foo(null);/*]*/
-	}
-	
-	public void foo(TestTypeArray[][] x) {
-		x= new TestTypeArray[10][];
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestBasic1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestBasic1.java
deleted file mode 100644
index d0f0704..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestBasic1.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package simple_out;
-
-public class TestBasic1 {
-	public void main() {
-		baz();
-	}
-	
-	public void bar() {
-		baz();
-	}
-	public void baz() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestBasic2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestBasic2.java
deleted file mode 100644
index cc0e7cc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestBasic2.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package simple_out;
-
-public class TestBasic2 {
-	public void main() {
-		for (int i= 0; i < 10; i++) {
-			baz();
-		}
-		baz();
-	}
-	
-	public void bar() {
-		for (int i= 0; i < 10; i++) {
-			baz();
-		}
-		baz();
-	}
-	public void baz() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestConstructor1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestConstructor1.java
deleted file mode 100644
index dda9f7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestConstructor1.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package simple_out;
-
-public class TestConstructor1 {
-	
-	private Object object;
-
-	public TestConstructor1(Object o) {
-		object= o;
-	}
-
-	public TestConstructor1(Object o, int i) {
-		object= o;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestEmptyBody.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestEmptyBody.java
deleted file mode 100644
index 3347ca6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestEmptyBody.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package simple_out;
-
-public class TestEmptyBody {
-	public void main() {
-	}
-	
-	public void foo() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestFieldInitializer1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestFieldInitializer1.java
deleted file mode 100644
index 34b1297..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestFieldInitializer1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package simple_out;
-
-public class TestFieldInitializer1 {
-	
-	private int field= 1;	
-	
-	public int foo() {
-		return 1;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestFieldInitializer2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestFieldInitializer2.java
deleted file mode 100644
index 77405c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestFieldInitializer2.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package simple_out;
-
-public class TestFieldInitializer2 {
-	
-	public void foo() {
-		class Woo {
-			private int field= 1;
-			
-			public int goo() {
-				return 1;
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestInitializer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestInitializer.java
deleted file mode 100644
index 28ac06c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestInitializer.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package simple_out;
-
-public class TestInitializer {
-	static {
-		System.out.println("Eclipse");
-	}
-	
-	public static void foo() {
-		System.out.println("Eclipse");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestLabeledStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestLabeledStatement.java
deleted file mode 100644
index 6c2c07e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestLabeledStatement.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package simple_out;
-
-public class TestLabeledStatement {
-
-	public static void main() {
-		the_label:
-		while(true) {
-			break the_label;
-		}
-	}
-
-	public static void foo() {
-		the_label:
-		while(true) {
-			break the_label;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestPrimitiveArray.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestPrimitiveArray.java
deleted file mode 100644
index c552365..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestPrimitiveArray.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package simple_out;
-
-public class TestPrimitiveArray {
-	public void main() {
-		int[][] x = null;
-		x= new int[10][];
-	}
-	
-	public void foo(int[][] x) {
-		x= new int[10][];
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestSuper.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestSuper.java
deleted file mode 100644
index 9825315..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestSuper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package simple_out;
-
-public class TestSuper {
-  private static class A {
-    void foo() {
-    	bar();    
-    }
-    void bar() {
-    }
-  }
-  private static class B extends A {
-    void foo() {
-      bar();
-    }
-  }
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestTypeArray.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestTypeArray.java
deleted file mode 100644
index a3d238b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineMethodWorkspace/TestCases/simple_out/TestTypeArray.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package simple_out;
-
-public class TestTypeArray {
-	public void main() {
-		TestTypeArray[][] x = null;
-		x= new TestTypeArray[10][];
-	}
-	
-	public void foo(TestTypeArray[][] x) {
-		x= new TestTypeArray[10][];
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_in.java
deleted file mode 100644
index 0519ecb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_in.java
+++ /dev/null
@@ -1 +0,0 @@
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_out.java
deleted file mode 100644
index 0519ecb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_out.java
+++ /dev/null
@@ -1 +0,0 @@
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test0_in.java
deleted file mode 100644
index b49e010..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test0_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i){
-		int x= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test0_out.java
deleted file mode 100644
index 4a98455..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test0_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void m(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test10_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test10_in.java
deleted file mode 100644
index 016340b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test10_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	public void testRLV() {
-			boolean test= true;
-			boolean t= (test);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test10_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test10_out.java
deleted file mode 100644
index d13c7f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test10_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	public void testRLV() {
-			boolean t= (true);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test11_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test11_in.java
deleted file mode 100644
index 3ee356c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test11_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	boolean d;
-	public void test() {
-			boolean test= d;
-			boolean t= (test);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test11_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test11_out.java
deleted file mode 100644
index 72e9efb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test11_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	boolean d;
-	public void test() {
-			boolean t= (d);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test12_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test12_in.java
deleted file mode 100644
index e16e429..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test12_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	boolean d;
-	public void test() {
-			A test= this;
-			A s1= test;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test12_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test12_out.java
deleted file mode 100644
index a9e0f11..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test12_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	boolean d;
-	public void test() {
-			A s1= this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test13_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test13_in.java
deleted file mode 100644
index 455b2f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test13_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	public void test() {
-			int i= 0;
-			int j= i=2;
-			int k= j + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test13_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test13_out.java
deleted file mode 100644
index 054416b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test13_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	public void test() {
-			int i= 0;
-			int k= (i=2) + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test14_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test14_in.java
deleted file mode 100644
index b390bb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test14_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int i(){
-		int i= 0, j= 1;
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test14_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test14_out.java
deleted file mode 100644
index ef2438b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test14_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int i(){
-		int j= 1;
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test15_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test15_in.java
deleted file mode 100644
index b390bb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test15_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int i(){
-		int i= 0, j= 1;
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test15_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test15_out.java
deleted file mode 100644
index 1e78cd4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test15_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int i(){
-		int i= 0;
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test16_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test16_in.java
deleted file mode 100644
index 1e48a39..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test16_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class Test {
-	void m(){
-		Object object = new Integer(2);
-		Integer integer = (Integer) object;
-		int i = integer.intValue();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test16_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test16_out.java
deleted file mode 100644
index 21e3afb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test16_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class Test {
-	void m(){
-		Object object = new Integer(2);
-		int i = ((Integer) object).intValue();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test17_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test17_in.java
deleted file mode 100644
index fd1a767..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test17_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test {
-  
-  public static final Test FOO = new Test() {
-    public void foo() {
-      int var = 1;
-      int var2 = var;
-    }
-  };
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test17_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test17_out.java
deleted file mode 100644
index fa0b55d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test17_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class Test {
-  
-  public static final Test FOO = new Test() {
-    public void foo() {
-      int var2 = 1;
-    }
-  };
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test18_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test18_in.java
deleted file mode 100644
index dd9cf55..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test18_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class Test {
-    public void foo() {
-      int var = 1;
-      int var2 = var;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test18_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test18_out.java
deleted file mode 100644
index d29449a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test18_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class Test {
-    public void foo() {
-      int var2 = 1;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test19_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test19_in.java
deleted file mode 100644
index dd9cf55..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test19_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class Test {
-    public void foo() {
-      int var = 1;
-      int var2 = var;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test19_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test19_out.java
deleted file mode 100644
index d29449a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test19_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class Test {
-    public void foo() {
-      int var2 = 1;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test1_in.java
deleted file mode 100644
index db82b66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test1_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= 0;
-		return x;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test1_out.java
deleted file mode 100644
index c52dbda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test1_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test20_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test20_in.java
deleted file mode 100644
index 7caf0a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test20_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	void f(boolean init){
-		boolean d= init;
-		if (! d);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test20_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test20_out.java
deleted file mode 100644
index 4ea16eb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test20_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void f(boolean init){
-		if (! init);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test21_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test21_in.java
deleted file mode 100644
index 9e61a99..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test21_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	private static void foo(String[] parameters, int j) {
-		int temp1 = parameters.length + j;
-		int temp = temp1;
-		System.out.println(temp);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test21_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test21_out.java
deleted file mode 100644
index 6ac096b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test21_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	private static void foo(String[] parameters, int j) {
-		int temp = parameters.length + j;
-		System.out.println(temp);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test22_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test22_in.java
deleted file mode 100644
index dac7ca5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test22_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	private static void foo(int i, int j) {
-		int temp = 1+2;
-		System.out.println(temp);
-		foo(temp*7, temp);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test22_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test22_out.java
deleted file mode 100644
index 6fec890..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test22_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	private static void foo(int i, int j) {
-		System.out.println(1+2);
-		foo((1+2)*7, 1+2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test23_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test23_in.java
deleted file mode 100644
index 9401d5f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test23_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		String xxxx= "xx";
-		String y= ( xxxx );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test23_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test23_out.java
deleted file mode 100644
index 20e8527..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test23_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		String y= ( "xx" );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test24_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test24_in.java
deleted file mode 100644
index 684d939..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test24_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	void foo() {
-		final int value= 42;
-		// some valuable important comment which will be erased
-		System.out.println(value);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test24_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test24_out.java
deleted file mode 100644
index 4daf585..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test24_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	void foo() {
-		// some valuable important comment which will be erased
-		System.out.println(42);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test25_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test25_in.java
deleted file mode 100644
index 6c3cfc5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test25_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	void foo() {
-		final int value= 42;//temp comment
-		// some valuable important comment which will be erased
-		System.out.println(value);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test25_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test25_out.java
deleted file mode 100644
index 4daf585..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test25_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A {
-	void foo() {
-		// some valuable important comment which will be erased
-		System.out.println(42);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test2_in.java
deleted file mode 100644
index db82b66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test2_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= 0;
-		return x;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test2_out.java
deleted file mode 100644
index c52dbda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test2_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test3_in.java
deleted file mode 100644
index 275e73e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test3_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= 0 + 1;
-		return x * x;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test3_out.java
deleted file mode 100644
index 42c7eea..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test3_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		return (0 + 1) * (0 + 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test4_in.java
deleted file mode 100644
index bd6778b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test4_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= i + 1;
-		return x * x + m(m(i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test4_out.java
deleted file mode 100644
index 8c50ce3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test4_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		return (i + 1) * (i + 1) + m(m(i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test5_in.java
deleted file mode 100644
index 620cb66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test5_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		int x= i + 1;
-		return x * x + m(m(x));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test5_out.java
deleted file mode 100644
index 1bd438c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test5_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	int m(int i){
-		return (i + 1) * (i + 1) + m(m(i + 1));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test6_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test6_in.java
deleted file mode 100644
index 99478d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test6_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	int i(){
-		for (;false;){
-			//
-		}
-		//d
-		i();
-		int i= 0;
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test6_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test6_out.java
deleted file mode 100644
index cd8a848..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test6_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	int i(){
-		for (;false;){
-			//
-		}
-		//d
-		i();
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test7_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test7_in.java
deleted file mode 100644
index 99478d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test7_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	int i(){
-		for (;false;){
-			//
-		}
-		//d
-		i();
-		int i= 0;
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test7_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test7_out.java
deleted file mode 100644
index cd8a848..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test7_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	int i(){
-		for (;false;){
-			//
-		}
-		//d
-		i();
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test8_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test8_in.java
deleted file mode 100644
index 2fa8abc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test8_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int i(){
-		int[] a= new int[6];
-		int i= a[9];
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test8_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test8_out.java
deleted file mode 100644
index 5766e80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test8_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int i(){
-		int[] a= new int[6];
-		return a[9];
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test9_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test9_in.java
deleted file mode 100644
index 2fa8abc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test9_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int i(){
-		int[] a= new int[6];
-		int i= a[9];
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test9_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test9_out.java
deleted file mode 100644
index 5766e80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/canInline/A_test9_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int i(){
-		int[] a= new int[6];
-		return a[9];
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail0.java
deleted file mode 100644
index 24454b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail0.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//compile errors
-package p;
-class A{
-	void m(){
-		/*[*/final int i= 0;/*]*/
-		List l;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail1.java
deleted file mode 100644
index 3d19010..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//syntax errors
-errorCulprit
-package p;
-class A{
-	void m(){
-		/*[*/final int i= 0;/*]*/
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail10.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail10.java
deleted file mode 100644
index be2d519..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail10.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int temp= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail11.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail11.java
deleted file mode 100644
index ff45266..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail11.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-class F {
-	public void foo() { 
-		File file= null; 
-		 
-		try { 
-			file.toURL(); 
-		} catch (MalformedURLException e) { 
-		} 
-	} 
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail12.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail12.java
deleted file mode 100644
index 946e712..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail12.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//compile errors
-package p;
-class A{
-	int f;
-	protected void primExecute(int t) {
-		this.toString();
-	}
-
-	if (image != null) {
-		Object loc = null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail13.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail13.java
deleted file mode 100644
index e1b7340..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail13.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void f() {
-		for (int i= 0; i < 4;);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail14.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail14.java
deleted file mode 100644
index 2735618..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail14.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
- void f(A a){
-   A[] arr= {a};
-   arr[0]= null;
- }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail2.java
deleted file mode 100644
index 02e5c19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail2.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//incorrect selection
-package p;
-class A{
-	int m(){
-		/*[*/int i;
-		if (true)
-			i= 0;	/*]*/
-		return 9;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail3.java
deleted file mode 100644
index d151bdf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail3.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//not initialized
-package p;
-class A{
-	int m(){
-		/*[*/int i;/*]*/
-		if (true)
-			i= 0;
-		return 9;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail4.java
deleted file mode 100644
index 5b456cc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail4.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//assigned to more than once
-package p;
-class A{
-	int m(){
-		/*[*/int i= 0;/*]*/
-		if (true)
-			i= 0;
-		return 9;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail5.java
deleted file mode 100644
index bd6b682..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail5.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//assigned to more than once
-package p;
-class A{
-	int m(){
-		/*[*/int i= 0;/*]*/
-		return i++;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail6.java
deleted file mode 100644
index 4e71012..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail6.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//assigned to more than once
-package p;
-class A{
-	int m(int y){
-		/*[*/int i= 0;/*]*/
-		return y + (i--);
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail7.java
deleted file mode 100644
index 2c55d50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail7.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void m(/*[*/int i/*]*/){
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail8.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail8.java
deleted file mode 100644
index d6e2d82..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail8.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void m(){
-		try{
-		} catch (/*[*/Exception e/*]*/){
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail9.java b/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail9.java
deleted file mode 100644
index be2d519..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/InlineTemp/cannotInline/A_testFail9.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int temp= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/TestClass.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/TestClass.java
deleted file mode 100644
index 117f08a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/TestClass.java
+++ /dev/null
@@ -1,12 +0,0 @@
-public class TestClass {
-	public TestClass() {
-	}
-	
-	public TestClass(int i) {
-	}
-	
-	public static void main(String[] args) {
-		TestClass t= /*[*/new TestClass()/*]*/;
-		TestClass t1= new TestClass(10);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/TestClass_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/TestClass_out.java
deleted file mode 100644
index 857dda5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/TestClass_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-public class TestClass {
-	private TestClass() {
-	}
-	
-	public TestClass(int i) {
-	}
-	
-	public static void main(String[] args) {
-		TestClass t= createTestClass();
-		TestClass t1= new TestClass(10);
-	}
-
-	public static TestClass createTestClass() {
-		return new TestClass();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/UseTestClass.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/UseTestClass.java
deleted file mode 100644
index ea1d31f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/UseTestClass.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class UseTestClass {
-	void foo() {
-		TestClass tt= new TestClass();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/UseTestClass_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/UseTestClass_out.java
deleted file mode 100644
index 810350b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/45942/UseTestClass_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class UseTestClass {
-	void foo() {
-		TestClass tt= TestClass.createTestClass();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189/TestClass.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189/TestClass.java
deleted file mode 100644
index f69469e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189/TestClass.java
+++ /dev/null
@@ -1,10 +0,0 @@
-public class TestClass {
-	public TestClass() {
-	}
-}
-
-class UseTestClass {
-	public void foo() {
-		/*[*/new TestClass()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189/TestClass_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189/TestClass_out.java
deleted file mode 100644
index 47f6ffd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189/TestClass_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-public class TestClass {
-	public static TestClass createTestClass() {
-		return new TestClass();
-	}
-
-	private TestClass() {
-	}
-}
-
-class UseTestClass {
-	public void foo() {
-		/*[*/TestClass.createTestClass();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189B/TestClass.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189B/TestClass.java
deleted file mode 100644
index 1832f05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189B/TestClass.java
+++ /dev/null
@@ -1,10 +0,0 @@
-public class TestClass {
-	public TestClass() {
-	}
-}
-
-public class UseTestClass {
-	public void foo() {
-		/*[*/new TestClass()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189B/TestClass_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189B/TestClass_out.java
deleted file mode 100644
index 561d864..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46189B/TestClass_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-public class TestClass {
-	public TestClass createTestClass() {
-		return new TestClass();
-	}
-	private TestClass() {
-	}
-}
-
-public class UseTestClass {
-	public void foo() {
-		createTestClass();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46373/ImplicitCtor.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46373/ImplicitCtor.java
deleted file mode 100644
index 540bbb4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46373/ImplicitCtor.java
+++ /dev/null
@@ -1,8 +0,0 @@
-public class ImplicitCtor {
-	public void foo() {
-		new ImplicitCtor();
-	}
-	public void bar() {
-		new /*[*/ImplicitCtor/*]*/();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46373/ImplicitCtor_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46373/ImplicitCtor_out.java
deleted file mode 100644
index eedc9ea..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46373/ImplicitCtor_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-public class ImplicitCtor {
-	public static ImplicitCtor createImplicitCtor() {
-		return new ImplicitCtor();
-	}
-	public void foo() {
-		createImplicitCtor();
-	}
-	public void bar() {
-		createImplicitCtor();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46374/QualifiedName.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46374/QualifiedName.java
deleted file mode 100644
index b50da37..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46374/QualifiedName.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class QualifiedName {
-	void foo() {
-		new p./*[*/QualifiedName/*]*/();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46374/QualifiedName_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46374/QualifiedName_out.java
deleted file mode 100644
index 7f477d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46374/QualifiedName_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-public class QualifiedName {
-	public static QualifiedName createQualifiedName() {
-		return new QualifiedName();
-	}
-
-	void foo() {
-		createQualifiedName();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p1/TT.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p1/TT.java
deleted file mode 100644
index 71d771a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p1/TT.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p1;
-
-public class TT {
-	public void bletch() {
-		new /*[*/TT/*]*/();
-	}
-	public void bar() {
-		new TT();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p1/TT_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p1/TT_out.java
deleted file mode 100644
index bdef0d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p1/TT_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p1;
-
-public class TT {
-	public static TT createTT() {
-		return new TT();
-	}
-	public void bletch() {
-		createTT();
-	}
-	public void bar() {
-		createTT();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p2/TT.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p2/TT.java
deleted file mode 100644
index ebcdeb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p2/TT.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class TT {
-	public void bletch() {
-		new TT();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p2/TT_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p2/TT_out.java
deleted file mode 100644
index ebcdeb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/Bugzilla/46608/p2/TT_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class TT {
-	public void bletch() {
-		new TT();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/negative/A_testFail0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/negative/A_testFail0_in.java
deleted file mode 100644
index 427dc8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/negative/A_testFail0_in.java
+++ /dev/null
@@ -1,2 +0,0 @@
-public class A_testFail0_in {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/negative/NestedClass_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/negative/NestedClass_in.java
deleted file mode 100644
index 999564c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/negative/NestedClass_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-public class NestedClass_in {
-	public class InnerClass {
-		public InnerClass() { }
-	}
-
-	public void foo() {
-		InnerClass	ic= /*[*/new InnerClass()/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/CtorThrows.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/CtorThrows.java
deleted file mode 100644
index 809d296..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/CtorThrows.java
+++ /dev/null
@@ -1,16 +0,0 @@
-public class CtorThrows_in {
-	private int	fValue;
-
-	private CtorThrows_in(int x) throws IllegalArgumentException {
-		if (x < 0) throw IllegalArgumentException("Bad value: " + x);
-		fValue= x;
-	}
-
-	public static void main(String[] args) {
-		CtorThrows_in cti= createCtorThrows_in(3);
-	}
-
-	public static CtorThrows_in createCtorThrows_in(int x) throws IllegalArgumentException {
-		return new CtorThrows_in(x);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/CtorThrows_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/CtorThrows_in.java
deleted file mode 100644
index e15d93b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/CtorThrows_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-public class CtorThrows_in {
-	private int	fValue;
-
-	public CtorThrows_in(int x) throws IllegalArgumentException {
-		if (x < 0) throw IllegalArgumentException("Bad value: " + x);
-		fValue= x;
-	}
-
-	public static void main(String[] args) {
-		CtorThrows_in cti= /*[*/new CtorThrows_in(3)/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs.java
deleted file mode 100644
index 9cf1cc7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs.java
+++ /dev/null
@@ -1,30 +0,0 @@
-import java.lang.StringBuffer;
-
-public class DifferentArgs_in {
-	public void foo(String[] args)
-	{
-		StringBuffer	buf = createStringBuffer(16);
-
-		buf.append("Args:");
-		for(int i=0; i < args.length; i++)
-			buf.append(" '")
-			   .append(args[i])
-			   .append("'");
-		System.out.println(buf.toString());
-	}
-	public void bar(String[] args)
-	{
-		StringBuffer	buf = createStringBuffer(24);
-
-		buf.append("Args:");
-		for(int i=0; i < args.length; i++)
-			buf.append(" '")
-			   .append(args[i])
-			   .append("'");
-		System.out.println(buf.toString());
-	}
-
-	public static StringBuffer createStringBuffer(int arg0) {
-		return new StringBuffer(arg0);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs1.java
deleted file mode 100644
index 43bb5fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs1.java
+++ /dev/null
@@ -1,22 +0,0 @@
-public class DifferentArgs1_in {
-	private int fN;
-	public DifferentArgs1_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		DifferentArgs1_in	da= createDifferentArgs1_in(16);
-
-		System.out.println("Value = " + da.get());
-	}
-	public void bar(String[] args) {
-		DifferentArgs1_in	da= createDifferentArgs1_in(24);
-
-		System.out.println("Value = " + da.get());
-	}
-	public static DifferentArgs1_in createDifferentArgs1_in(int N) {
-		return new DifferentArgs1_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs1_in.java
deleted file mode 100644
index a1819fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs1_in.java
+++ /dev/null
@@ -1,19 +0,0 @@
-public class DifferentArgs1_in {
-	private int fN;
-	public DifferentArgs1_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		DifferentArgs1_in	da= /*[*/new DifferentArgs1_in(16)/*]*/;
-
-		System.out.println("Value = " + da.get());
-	}
-	public void bar(String[] args) {
-		DifferentArgs1_in	da= new DifferentArgs1_in(24);
-
-		System.out.println("Value = " + da.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs2.java
deleted file mode 100644
index b7860ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-public class DifferentArgs2_in {
-	private int fN;
-	public DifferentArgs2_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		DifferentArgs2_in	da= createDifferentArgs2_in(16);
-
-		System.out.println("Value = " + da.get());
-	}
-	public void bar(String[] args) {
-		int					size= 24;
-		DifferentArgs2_in	da= createDifferentArgs2_in(size);
-
-		System.out.println("Value = " + da.get());
-	}
-	public static DifferentArgs2_in createDifferentArgs2_in(int N) {
-		return new DifferentArgs2_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs2_in.java
deleted file mode 100644
index 3e005fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs2_in.java
+++ /dev/null
@@ -1,20 +0,0 @@
-public class DifferentArgs2_in {
-	private int fN;
-	public DifferentArgs2_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		DifferentArgs2_in	da= /*[*/new DifferentArgs2_in(16)/*]*/;
-
-		System.out.println("Value = " + da.get());
-	}
-	public void bar(String[] args) {
-		int					size= 24;
-		DifferentArgs2_in	da= new DifferentArgs2_in(size);
-
-		System.out.println("Value = " + da.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs3.java
deleted file mode 100644
index 33cb206..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs3.java
+++ /dev/null
@@ -1,23 +0,0 @@
-public class DifferentArgs3_in {
-	private int fN;
-	public DifferentArgs3_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		int				size;
-		DifferentArgs3_in	da= createDifferentArgs3_in(size=16);
-
-		System.out.println("Value = " + da.get());
-	}
-	public void bar(String[] args) {
-		DifferentArgs3_in	da= createDifferentArgs3_in(24);
-
-		System.out.println("Value = " + da.get());
-	}
-	public static DifferentArgs3_in createDifferentArgs3_in(int N) {
-		return new DifferentArgs3_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs3_in.java
deleted file mode 100644
index a9ffd4b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs3_in.java
+++ /dev/null
@@ -1,20 +0,0 @@
-public class DifferentArgs3_in {
-	private int fN;
-	public DifferentArgs3_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		int				size;
-		DifferentArgs3_in	da= /*[*/new DifferentArgs3_in(size=16)/*]*/;
-
-		System.out.println("Value = " + da.get());
-	}
-	public void bar(String[] args) {
-		DifferentArgs3_in	da= new DifferentArgs3_in(24);
-
-		System.out.println("Value = " + da.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs_in.java
deleted file mode 100644
index fc5a56f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentArgs_in.java
+++ /dev/null
@@ -1,26 +0,0 @@
-import java.lang.StringBuffer;
-
-public class DifferentArgs_in {
-	public void foo(String[] args)
-	{
-		StringBuffer	buf = /*[*/new StringBuffer(16)/*]*/;
-
-		buf.append("Args:");
-		for(int i=0; i < args.length; i++)
-			buf.append(" '")
-			   .append(args[i])
-			   .append("'");
-		System.out.println(buf.toString());
-	}
-	public void bar(String[] args)
-	{
-		StringBuffer	buf = new StringBuffer(24);
-
-		buf.append("Args:");
-		for(int i=0; i < args.length; i++)
-			buf.append(" '")
-			   .append(args[i])
-			   .append("'");
-		System.out.println(buf.toString());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentSigs.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentSigs.java
deleted file mode 100644
index cc84d5a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentSigs.java
+++ /dev/null
@@ -1,25 +0,0 @@
-public class DifferentSigs_in {
-	private int fN;
-	public DifferentSigs_in() {
-		this(10);
-	}
-	public DifferentSigs_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		DifferentSigs_in	ds= createDifferentSigs_in(16);
-
-		System.out.println("Value = " + ds.get());
-	}
-	public void bar(String[] args) {
-		DifferentSigs_in	ds= new DifferentSigs_in();
-
-		System.out.println("Value = " + ds.get());
-	}
-	public static DifferentSigs_in createDifferentSigs_in(int N) {
-		return new DifferentSigs_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentSigs_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentSigs_in.java
deleted file mode 100644
index 50e277e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DifferentSigs_in.java
+++ /dev/null
@@ -1,22 +0,0 @@
-public class DifferentSigs_in {
-	private int fN;
-	public DifferentSigs_in() {
-		this(10);
-	}
-	public DifferentSigs_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		DifferentSigs_in	ds= /*[*/new DifferentSigs_in(16)/*]*/;
-
-		System.out.println("Value = " + ds.get());
-	}
-	public void bar(String[] args) {
-		DifferentSigs_in	ds= new DifferentSigs_in();
-
-		System.out.println("Value = " + ds.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs1.java
deleted file mode 100644
index 5b78825..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs1.java
+++ /dev/null
@@ -1,18 +0,0 @@
-public class DontMoveArgs1_in {
-	private int		fN;
-
-	public /*[*/DontMoveArgs1_in/*]*/(int N) {
-		fN= N;
-	}
-	public int getN() {
-		return fN;
-	}
-	public static void main(String[] args) {
-		DontMoveArgs1_in	dma= createDontMoveArgs1_in(15);
-
-		System.out.println("Value = " + Integer.toHexString(dma.getN()));
-	}
-	public static DontMoveArgs1_in createDontMoveArgs1_in(int N) {
-		return new DontMoveArgs1_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs1_in.java
deleted file mode 100644
index 91741cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs1_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-public class DontMoveArgs1_in {
-	private int		fN;
-
-	public /*[*/DontMoveArgs1_in/*]*/(int N) {
-		fN= N;
-	}
-	public int getN() {
-		return fN;
-	}
-	public static void main(String[] args) {
-		DontMoveArgs1_in	dma= new DontMoveArgs1_in(15);
-
-		System.out.println("Value = " + Integer.toHexString(dma.getN()));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs2.java
deleted file mode 100644
index e7bf079..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-public class DontMoveArgs2_in {
-	private int		fX, fY;
-
-	public /*[*/DontMoveArgs2_in/*]*/(int x, int y) {
-		fX= x;
-		fY= y;
-	}
-	public int getX() {
-		return fX;
-	}
-	public int getY() {
-		return fY;
-	}
-	public static void main(String[] args) {
-		int					y= 20;
-		DontMoveArgs2_in	dma= createDontMoveArgs2_in(15, y);
-
-		System.out.println("Value = " + Integer.toHexString(dma.getX() + dma.getY()));
-	}
-	public static DontMoveArgs2_in createDontMoveArgs2_in(int x, int y) {
-		return new DontMoveArgs2_in(x, y);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs2_in.java
deleted file mode 100644
index a9a7e46..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/DontMoveArgs2_in.java
+++ /dev/null
@@ -1,20 +0,0 @@
-public class DontMoveArgs2_in {
-	private int		fX, fY;
-
-	public /*[*/DontMoveArgs2_in/*]*/(int x, int y) {
-		fX= x;
-		fY= y;
-	}
-	public int getX() {
-		return fX;
-	}
-	public int getY() {
-		return fY;
-	}
-	public static void main(String[] args) {
-		int					y= 20;
-		DontMoveArgs2_in	dma= new DontMoveArgs2_in(15, y);
-
-		System.out.println("Value = " + Integer.toHexString(dma.getX() + dma.getY()));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/InstanceContext_FFF.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/InstanceContext_FFF.java
deleted file mode 100644
index 5e294ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/InstanceContext_FFF.java
+++ /dev/null
@@ -1,17 +0,0 @@
-public class InstanceContext_in {
-	private int fN;
-	public InstanceContext_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		InstanceContext_in	ic= createInstanceContext_in(16);
-
-		System.out.println("Value = " + ic.get());
-	}
-	public static InstanceContext_in createInstanceContext_in(int N) {
-		return new InstanceContext_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/InstanceContext_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/InstanceContext_in.java
deleted file mode 100644
index 83f13f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/InstanceContext_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-public class InstanceContext_in {
-	private int fN;
-	public InstanceContext_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		InstanceContext_in	ic= /*[*/new InstanceContext_in(16)/*]*/;
-
-		System.out.println("Value = " + ic.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1A_FFF_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1A_FFF_out.java
deleted file mode 100644
index abf6af8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1A_FFF_out.java
+++ /dev/null
@@ -1,22 +0,0 @@
-public class MultiUnit1A_in {
-	private int fN;
-	private MultiUnit1A_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo1(String[] args) {
-		MultiUnit1A_in	mu= createMultiUnit1A_in(16);
-
-		System.out.println("Value = " + mu.get());
-	}
-	public void foo2(String[] args) {
-		MultiUnit1A_in	mu= createMultiUnit1A_in(24);
-
-		System.out.println("Value = " + mu.get());
-	}
-	public static MultiUnit1A_in createMultiUnit1A_in(int N) {
-		return new MultiUnit1A_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1A_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1A_in.java
deleted file mode 100644
index bbae27c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1A_in.java
+++ /dev/null
@@ -1,19 +0,0 @@
-public class MultiUnit1A_in {
-	private int fN;
-	public MultiUnit1A_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo1(String[] args) {
-		MultiUnit1A_in	mu= /*[*/new MultiUnit1A_in(16)/*]*/;
-
-		System.out.println("Value = " + mu.get());
-	}
-	public void foo2(String[] args) {
-		MultiUnit1A_in	mu= new MultiUnit1A_in(24);
-
-		System.out.println("Value = " + mu.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1B_FFF_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1B_FFF_out.java
deleted file mode 100644
index e13e36d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1B_FFF_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-public class MultiUnit1B_in {
-	public void foo3(String[] args) {
-		MultiUnit1A_in	mu= MultiUnit1A_in.createMultiUnit1A_in(16);
-
-		System.out.println("Value = " + mu.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1B_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1B_in.java
deleted file mode 100644
index 27135c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1B_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-public class MultiUnit1B_in {
-	public void foo3(String[] args) {
-		MultiUnit1A_in	mu= new MultiUnit1A_in(16);
-
-		System.out.println("Value = " + mu.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1C_FFF_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1C_FFF_out.java
deleted file mode 100644
index f64eaa0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1C_FFF_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-public class MultiUnit1C_in {
-	public void foo4(String[] args) {
-		MultiUnit1A_in	mu= MultiUnit1A_in.createMultiUnit1A_in(16);
-
-		System.out.println("Value = " + mu.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1C_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1C_in.java
deleted file mode 100644
index 72460c9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultiUnit1C_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-public class MultiUnit1C_in {
-	public void foo4(String[] args) {
-		MultiUnit1A_in	mu= new MultiUnit1A_in(16);
-
-		System.out.println("Value = " + mu.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultipleCallers_FFF.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultipleCallers_FFF.java
deleted file mode 100644
index ad7aec9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultipleCallers_FFF.java
+++ /dev/null
@@ -1,22 +0,0 @@
-public class MultipleCallers_in {
-	private int fN;
-	public MultipleCallers_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		MultipleCallers_in	mc= createMultipleCallers_in(16);
-
-		System.out.println("Value = " + mc.get());
-	}
-	public void bar(String[] args) {
-		MultipleCallers_in	mc= createMultipleCallers_in(16);
-
-		System.out.println("Value = " + mc.get());
-	}
-	public static MultipleCallers_in createMultipleCallers_in(int N) {
-		return new MultipleCallers_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultipleCallers_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultipleCallers_in.java
deleted file mode 100644
index 0a8833a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/MultipleCallers_in.java
+++ /dev/null
@@ -1,19 +0,0 @@
-public class MultipleCallers_in {
-	private int fN;
-	public MultipleCallers_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		MultipleCallers_in	mc= /*[*/new MultipleCallers_in(16)/*]*/;
-
-		System.out.println("Value = " + mc.get());
-	}
-	public void bar(String[] args) {
-		MultipleCallers_in	mc= new MultipleCallers_in(16);
-
-		System.out.println("Value = " + mc.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/Names_FFF.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/Names_FFF.java
deleted file mode 100644
index 76e0142..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/Names_FFF.java
+++ /dev/null
@@ -1,17 +0,0 @@
-public class Names_in {
-	private int fN;
-	private Names_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		Names_in	n= createThing(16);
-
-		System.out.println("Value = " + n.get());
-	}
-	public static Names_in createThing(int N) {
-		return new Names_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/Names_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/Names_in.java
deleted file mode 100644
index 00d7d2c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/Names_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-public class Names_in {
-	private int fN;
-	public Names_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		Names_in	n= /*[*/new Names_in(16)/*]*/;
-
-		System.out.println("Value = " + n.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor1.java
deleted file mode 100644
index c77729d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor1.java
+++ /dev/null
@@ -1,18 +0,0 @@
-public class ProtectConstructor1_in {
-	private int		fX;
-
-	private ProtectConstructor1_in/*]*/(int x) {
-		fX= x;
-	}
-	public int getX() {
-		return fX;
-	}
-	public static void main(String[] args) {
-		ProtectConstructor1_in	pc= createProtectConstructor1_in(15);
-
-		System.out.println("Value = " + Integer.toHexString(pc.getX()));
-	}
-	public static ProtectConstructor1_in createProtectConstructor1_in(int x) {
-		return new ProtectConstructor1_in(x);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor1_in.java
deleted file mode 100644
index 36d9adf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor1_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-public class ProtectConstructor1_in {
-	private int		fX;
-
-	public /*[*/ProtectConstructor1_in/*]*/(int x) {
-		fX= x;
-	}
-	public int getX() {
-		return fX;
-	}
-	public static void main(String[] args) {
-		ProtectConstructor1_in	pc= new ProtectConstructor1_in(15);
-
-		System.out.println("Value = " + Integer.toHexString(pc.getX()));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor2.java
deleted file mode 100644
index 466faf2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor2.java
+++ /dev/null
@@ -1,23 +0,0 @@
-public class ProtectConstructor2_in {
-	private int		fX, fY;
-
-	private ProtectConstructor2_in/*]*/(int x, int y) {
-		fX= x;
-		fY= y;
-	}
-	public int getX() {
-		return fX;
-	}
-	public int getY() {
-		return fY;
-	}
-	public static void main(String[] args) {
-		int						y=  20;
-		ProtectConstructor2_in	pc= createProtectConstructor2_in(15, y);
-
-		System.out.println("Value = " + Integer.toHexString(pc.getX() + pc.getY()));
-	}
-	public static ProtectConstructor2_in createProtectConstructor2_in(int x, int y) {
-		return new ProtectConstructor2_in(x, y);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor2_in.java
deleted file mode 100644
index ff4fe26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/ProtectConstructor2_in.java
+++ /dev/null
@@ -1,20 +0,0 @@
-public class ProtectConstructor2_in {
-	private int		fX, fY;
-
-	public /*[*/ProtectConstructor2_in/*]*/(int x, int y) {
-		fX= x;
-		fY= y;
-	}
-	public int getX() {
-		return fX;
-	}
-	public int getY() {
-		return fY;
-	}
-	public static void main(String[] args) {
-		int						y=  20;
-		ProtectConstructor2_in	pc= new ProtectConstructor2_in(15, y);
-
-		System.out.println("Value = " + Integer.toHexString(pc.getX() + pc.getY()));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/SelectConstructor.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/SelectConstructor.java
deleted file mode 100644
index c8c1ddf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/SelectConstructor.java
+++ /dev/null
@@ -1,14 +0,0 @@
-public class SelectConstructor_in {
-	public /*[*/SelectConstructor_in/*]*/() {
-	}
-	public void test(String msg) {
-	}
-	public static void main(String[] args) {
-		SelectConstructor_in sc= createSelectConstructor_in();
-
-		sc.test("hello");
-	}
-	public static SelectConstructor_in createSelectConstructor_in() {
-		return new SelectConstructor_in();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/SelectConstructor_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/SelectConstructor_in.java
deleted file mode 100644
index 6ba3520..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/SelectConstructor_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-public class SelectConstructor_in {
-	public /*[*/SelectConstructor_in/*]*/() {
-	}
-	public void test(String msg) {
-	}
-	public static void main(String[] args) {
-		SelectConstructor_in sc= new SelectConstructor_in();
-
-		sc.test("hello");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticContext_FFF.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticContext_FFF.java
deleted file mode 100644
index bac5e38..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticContext_FFF.java
+++ /dev/null
@@ -1,17 +0,0 @@
-public class StaticContext_in {
-	private int fN;
-	public StaticContext_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public static void main(String[] args) {
-		StaticContext_in	sc= createStaticContext_in(16);
-
-		System.out.println("Value = " + sc.get());
-	}
-	public static StaticContext_in createStaticContext_in(int N) {
-		return new StaticContext_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticContext_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticContext_in.java
deleted file mode 100644
index b9aa02f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticContext_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-public class StaticContext_in {
-	private int fN;
-	public StaticContext_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public static void main(String[] args) {
-		StaticContext_in	sc= /*[*/new StaticContext_in(16)/*]*/;
-
-		System.out.println("Value = " + sc.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticInstance.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticInstance.java
deleted file mode 100644
index 184a064..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticInstance.java
+++ /dev/null
@@ -1,22 +0,0 @@
-public class StaticInstance_in {
-	private int fN;
-	public StaticInstance_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		StaticInstance_in	si= createStaticInstance_in(16);
-
-		System.out.println("Value = " + si.get());
-	}
-	public static void bar(String[] args) {
-		StaticInstance_in	si= createStaticInstance_in(16);
-
-		System.out.println("Value = " + si.get());
-	}
-	public static StaticInstance_in createStaticInstance_in(int N) {
-		return new StaticInstance_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticInstance_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticInstance_in.java
deleted file mode 100644
index d018585..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/StaticInstance_in.java
+++ /dev/null
@@ -1,19 +0,0 @@
-public class StaticInstance_in {
-	private int fN;
-	public StaticInstance_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		StaticInstance_in	si= /*[*/new StaticInstance_in(16)/*]*/;
-
-		System.out.println("Value = " + si.get());
-	}
-	public static void bar(String[] args) {
-		StaticInstance_in	si= new StaticInstance_in(16);
-
-		System.out.println("Value = " + si.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg1.java
deleted file mode 100644
index a785e84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg1.java
+++ /dev/null
@@ -1,18 +0,0 @@
-public class UnmovableArg1_in {
-	private int fN;
-	public UnmovableArg1_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		int				size;
-		UnmovableArg1_in	ua= createUnmovableArg1_in(size=16);
-
-		System.out.println("Value = " + ua.get());
-	}
-	public static UnmovableArg1_in createUnmovableArg1_in(int N) {
-		return new UnmovableArg1_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg1_in.java
deleted file mode 100644
index aa27f91..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg1_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-public class UnmovableArg1_in {
-	private int fN;
-	public UnmovableArg1_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		int				size;
-		UnmovableArg1_in	ua= /*[*/new UnmovableArg1_in(size=16)/*]*/;
-
-		System.out.println("Value = " + ua.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg2.java
deleted file mode 100644
index 79788dd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg2.java
+++ /dev/null
@@ -1,18 +0,0 @@
-public class UnmovableArg2_in {
-	private int fN;
-	public UnmovableArg2_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		int				size=16;
-		UnmovableArg2_in	ua= createUnmovableArg2_in(size);
-
-		System.out.println("Value = " + ua.get());
-	}
-	public static UnmovableArg2_in createUnmovableArg2_in(int N) {
-		return new UnmovableArg2_in(N);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg2_in.java
deleted file mode 100644
index 56daebe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceFactory/positive/UnmovableArg2_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-public class UnmovableArg2_in {
-	private int fN;
-	public UnmovableArg2_in(int N) {
-		fN= N;
-	}
-	public int get() {
-		return fN;
-	}
-	public void foo(String[] args) {
-		int				size=16;
-		UnmovableArg2_in	ua= /*[*/new UnmovableArg2_in(size)/*]*/;
-
-		System.out.println("Value = " + ua.get());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod1.java
deleted file mode 100644
index 8cefbf2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod1.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//selection: 5, 23, 5, 28
-package invalid;
-
-class NotInMethod1 {
-	public int fSum= 1 + 2;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod2.java
deleted file mode 100644
index 3350a8d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod2.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//selection: 2, 9, 2, 16
-package invalid;
-
-class NotInMethod2 {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod3.java
deleted file mode 100644
index 48ddc2a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/NotInMethod3.java
+++ /dev/null
@@ -1,4 +0,0 @@
-//selection: 4, 7, 4, 19
-package invalid;
-
-class NotInMethod3 {}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/PartName1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/PartName1.java
deleted file mode 100644
index 2e6854e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/PartName1.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//selection: 7, 17, 7, 19
-package invalid;
-
-class PartName1 {
-	public static int foo() { return 17; }
-	void bar() {
-		int a= foo();
-	}
-	void use() {
-		bar();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/PartString.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/PartString.java
deleted file mode 100644
index 0a7547d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/invalid/PartString.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//selection: 6, 29, 6, 36
-package invalid;
-
-class PartString {
-	void bar() {
-		System.out.println("Charlie Chaplin");
-	}
-	void use() {
-		bar();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantExpression1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantExpression1.java
deleted file mode 100644
index 8bda48f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantExpression1.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//selection: 8, 16, 8, 24
-//name: i -> second
-package simple;
-
-public class ConstantExpression1 {
-	public static final int ZERO= -1;
-	public int m(int a) {
-		int b= ZERO - 2;
-		return m(3 * a);
-	}
-	public void use() {
-		m(17);
-		m(17 * m(18));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantExpression2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantExpression2.java
deleted file mode 100644
index 0c78305..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantExpression2.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//selection: 12, 16, 12, 52
-//name: i -> length
-package simple;
-
-import java.util.Vector;
-
-public class ConstantExpression2 {
-	private Vector fBeginners;
-	private Vector fAdvanced;
-	
-	private int count() {
-		return fBeginners.size() + fAdvanced.size();
-	}
-	public void use() {
-		count();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantString.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantString.java
deleted file mode 100644
index 7b036dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/ConstantString.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//selection: 7, 28, 7, 45
-//name: string -> name
-package simple;
-
-public class ConstantString {
-	void bar() {
-		System.out.println("Charlie Chaplin");
-	}
-	void use() {
-		bar();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/NewInstance1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/NewInstance1.java
deleted file mode 100644
index 4613299..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/NewInstance1.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//selection: 7, 19, 7, 36
-//name: string -> abc
-package simple;
-
-public class NewInstance1 {
-	public void m(int a) {
-		String s= new String("abc");
-	}
-}
-
-class User {
-	public void use() {
-		new NewInstance1().m(17);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/NewInstanceImport.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/NewInstanceImport.java
deleted file mode 100644
index ec8e0f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/NewInstanceImport.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//selection: 9, 20, 9, 46
-//name: iterator -> iter
-package simple;
-
-import java.util.ArrayList;
-
-public class NewInstanceImport {
-	public void m(int a) {
-		boolean b= new ArrayList().iterator().hasNext();
-	}
-	public void use() {
-		m(17);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/StaticGetter1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/StaticGetter1.java
deleted file mode 100644
index 7035d9b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/StaticGetter1.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//selection: 9, 32, 9, 37
-//name: j -> foo
-package simple;
-
-public class StaticGetter1 {
-	public static int foo() { return 17; }
-	void bar() {
-		int i= 3;
-		System.out.println(i + foo());
-	}
-	void use() {
-		bar();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantExpression1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantExpression1.java
deleted file mode 100644
index 7309026..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantExpression1.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//selection: 8, 16, 8, 24
-//name: i -> second
-package simple.out;
-
-public class ConstantExpression1 {
-	public static final int ZERO= -1;
-	public int m(int a, int second) {
-		int b= second;
-		return m(3 * a, ZERO - 2);
-	}
-	public void use() {
-		m(17, ZERO - 2);
-		m(17 * m(18, ZERO - 2), ZERO - 2);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantExpression2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantExpression2.java
deleted file mode 100644
index d8623fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantExpression2.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//selection: 12, 16, 12, 52
-//name: i -> length
-package simple.out;
-
-import java.util.Vector;
-
-public class ConstantExpression2 {
-	private Vector fBeginners;
-	private Vector fAdvanced;
-	
-	private int count(int length) {
-		return length;
-	}
-	public void use() {
-		count(fBeginners.size() + fAdvanced.size());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantString.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantString.java
deleted file mode 100644
index 830dc88..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/ConstantString.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//selection: 7, 28, 7, 45
-//name: string -> name
-package simple.out;
-
-public class ConstantString {
-	void bar(String name) {
-		System.out.println(name);
-	}
-	void use() {
-		bar("Charlie Chaplin");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/NewInstance1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/NewInstance1.java
deleted file mode 100644
index 66bc558..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/NewInstance1.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//selection: 7, 19, 7, 36
-//name: string -> abc
-package simple.out;
-
-public class NewInstance1 {
-	public void m(int a, String abc) {
-		String s= abc;
-	}
-}
-
-class User {
-	public void use() {
-		new NewInstance1().m(17, new String("abc"));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/NewInstanceImport.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/NewInstanceImport.java
deleted file mode 100644
index 52577a9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/NewInstanceImport.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//selection: 8, 20, 8, 46
-package simple.out;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-public class NewInstanceImport {
-	public void m(int a, Iterator iter) {
-		boolean b= iter.hasNext();
-	}
-	public void use() {
-		m(17, new ArrayList().iterator());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/StaticGetter1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/StaticGetter1.java
deleted file mode 100644
index 6f76412..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/IntroduceParameter/simple/out/StaticGetter1.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//selection: 9, 32, 9, 37
-//name: j -> foo
-package simple.out;
-
-public class StaticGetter1 {
-	public static int foo() { return 17; }
-	void bar(int foo) {
-		int i= 3;
-		System.out.println(i + foo);
-	}
-	void use() {
-		bar(foo());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_no_methodToItself/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_no_methodToItself/in/A.java
deleted file mode 100644
index 97fa672..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_no_methodToItself/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_fieldToOtherType/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_fieldToOtherType/in/A.java
deleted file mode 100644
index d52d02c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_fieldToOtherType/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	int f;
-}
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_fieldToOtherType/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_fieldToOtherType/out/A.java
deleted file mode 100644
index 94a935c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_fieldToOtherType/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-}
-class B{
-
-	int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_initializerToOtherType/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_initializerToOtherType/in/A.java
deleted file mode 100644
index b18d211..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_initializerToOtherType/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	{
-		int temp= 0;
-	}
-}
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_initializerToOtherType/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_initializerToOtherType/out/A.java
deleted file mode 100644
index b54d93a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_initializerToOtherType/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-import java.util.*;
-class A {
-}
-class B{
-
-	{
-		int temp= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_methodToOtherType/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_methodToOtherType/in/A.java
deleted file mode 100644
index 47ab6a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_methodToOtherType/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.util.*;
-class A {
-	void foo() {
-	}
-}
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_methodToOtherType/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_methodToOtherType/out/A.java
deleted file mode 100644
index 93d21ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Move/testDestination_yes_methodToOtherType/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-import java.util.*;
-class A {
-}
-class B{
-
-	void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/in/A.java
deleted file mode 100644
index 6873a21..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	static class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/out/Inner.java
deleted file mode 100644
index 21ee4d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test0/out/Inner.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/in/A.java
deleted file mode 100644
index 4dedf74..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	public static class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/out/Inner.java
deleted file mode 100644
index 867d64b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test1/out/Inner.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/in/A.java
deleted file mode 100644
index 6c093e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	static int F= 1;
-	static class Inner{
-		void foo() {
-			F= 2;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/out/A.java
deleted file mode 100644
index c29dfbc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A {
-	static int F= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/out/Inner.java
deleted file mode 100644
index 4b58e1c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test10/out/Inner.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class Inner{
-	void foo() {
-		A.F= 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/in/A.java
deleted file mode 100644
index 920903b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	static int F= 1;
-	static class Inner{
-		void foo() {
-			F= 1;
-			A.F= 2;
-			p.A.F= 3;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/out/A.java
deleted file mode 100644
index c29dfbc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A {
-	static int F= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/out/Inner.java
deleted file mode 100644
index 6b94852..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test11/out/Inner.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class Inner{
-	void foo() {
-		A.F= 1;
-		A.F= 2;
-		p.A.F= 3;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/in/A.java
deleted file mode 100644
index 9b1d176..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A {
-	static class Inner{
-		void foo() {
-			Inner2 a;
-		}
-	}
-	static class Inner2{
-		static class Inner2Inner{
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/out/A.java
deleted file mode 100644
index a3569f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	static class Inner2{
-		static class Inner2Inner{
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/out/Inner.java
deleted file mode 100644
index 48969f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test12/out/Inner.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import p.A.Inner2;
-
-class Inner{
-	void foo() {
-		Inner2 a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/in/A.java
deleted file mode 100644
index 0acd48f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A {
-	static class Inner{
-		void foo() {
-			Inner2.Inner2Inner a;
-		}
-	}
-	static class Inner2{
-		static class Inner2Inner{
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/out/A.java
deleted file mode 100644
index a3569f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	static class Inner2{
-		static class Inner2Inner{
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/out/Inner.java
deleted file mode 100644
index 3550f68..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test13/out/Inner.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import p.A.Inner2;
-import p.A.Inner2.Inner2Inner;
-
-class Inner{
-	void foo() {
-		Inner2.Inner2Inner a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/in/A.java
deleted file mode 100644
index eabae2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A {
-	static class Inner{
-		static void foo() {
-		}
-		static int t= 1;
-	}
-	static void f(){
-		Inner i;
-		A.Inner i2;
-		Inner.foo();
-		Inner.t =  2;
-		A.Inner.foo();
-		A.Inner.t =  2;
-		p.A.Inner.foo();
-		p.A.Inner.t =  2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/out/A.java
deleted file mode 100644
index 6a2228b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	static void f(){
-		Inner i;
-		Inner i2;
-		Inner.foo();
-		Inner.t =  2;
-		Inner.foo();
-		Inner.t =  2;
-		p.Inner.foo();
-		p.Inner.t =  2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/out/Inner.java
deleted file mode 100644
index ce9c712..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test14/out/Inner.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class Inner{
-	static void foo() {
-	}
-	static int t= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/in/A.java
deleted file mode 100644
index fff5b25..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A {
-	public static class Inner{
-		public static void foo() {
-		}
-		public static int t= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/in/A1.java
deleted file mode 100644
index c3994e6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/in/A1.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p1;
-import p.A;
-public class A1 {
-	static void f(){
-		A.Inner i;
-		A.Inner.foo();
-		A.Inner.t =  2;
-		p.A.Inner.foo();
-		p.A.Inner.t =  2;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/A.java
deleted file mode 100644
index f6125f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/A1.java
deleted file mode 100644
index 270c8dd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/A1.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p1;
-import p.A;
-import p.Inner;
-public class A1 {
-	static void f(){
-		Inner i;
-		Inner.foo();
-		Inner.t =  2;
-		p.Inner.foo();
-		p.Inner.t =  2;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/Inner.java
deleted file mode 100644
index 2c20149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test15/out/Inner.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class Inner{
-	public static void foo() {
-	}
-	public static int t= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/in/A.java
deleted file mode 100644
index fff5b25..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A {
-	public static class Inner{
-		public static void foo() {
-		}
-		public static int t= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/in/A1.java
deleted file mode 100644
index 15e07a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/in/A1.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p1;
-import p.A;
-public class A1 {
-	static void f(){
-		A.Inner i;
-		A.Inner.foo();
-		A.Inner.t =  2;
-		p.A.Inner.foo();
-		p.A.Inner.t =  2;
-		A a;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/A.java
deleted file mode 100644
index f6125f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/A1.java
deleted file mode 100644
index bc06aef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/A1.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p1;
-import p.A;
-import p.Inner;
-public class A1 {
-	static void f(){
-		Inner i;
-		Inner.foo();
-		Inner.t =  2;
-		p.Inner.foo();
-		p.Inner.t =  2;
-		A a;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/Inner.java
deleted file mode 100644
index 2c20149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test16/out/Inner.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class Inner{
-	public static void foo() {
-	}
-	public static int t= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/in/A.java
deleted file mode 100644
index 2a955dd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	static class Inner{
-		static void f(){}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/out/Inner.java
deleted file mode 100644
index 3688b89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test17/out/Inner.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class Inner{
-	static void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/in/A.java
deleted file mode 100644
index f0ec38f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A{
-	public static class Inner{
-		public class InnerInner{}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/in/A1.java
deleted file mode 100644
index 74360eb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/in/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p1;
-
-import p.A.Inner;
-
-class A1{
-	p.A.Inner a;
-	p.A.Inner.InnerInner a1;
-	Inner a2;
-	Inner.InnerInner a3;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/A.java
deleted file mode 100644
index 52c6073..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/A1.java
deleted file mode 100644
index a0cc4cc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p1;
-
-import p.Inner;
-
-class A1{
-	p.Inner a;
-	p.Inner.InnerInner a1;
-	Inner a2;
-	Inner.InnerInner a3;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/Inner.java
deleted file mode 100644
index 12cfc64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test18/out/Inner.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class Inner{
-	public class InnerInner{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/in/A.java
deleted file mode 100644
index f0ec38f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A{
-	public static class Inner{
-		public class InnerInner{}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/in/A1.java
deleted file mode 100644
index fa9bbd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/in/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p1;
-
-import p.A.*;
-
-class A1{
-	p.A.Inner a;
-	p.A.Inner.InnerInner a1;
-	Inner a2;
-	Inner.InnerInner a3;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/A.java
deleted file mode 100644
index 52c6073..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/A1.java
deleted file mode 100644
index 0c1b22c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/A1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p1;
-
-import p.A.*;
-import p.Inner;
-
-class A1{
-	p.Inner a;
-	p.Inner.InnerInner a1;
-	Inner a2;
-	Inner.InnerInner a3;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/Inner.java
deleted file mode 100644
index 12cfc64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test19/out/Inner.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class Inner{
-	public class InnerInner{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/in/A.java
deleted file mode 100644
index f97b6d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private static class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/out/Inner.java
deleted file mode 100644
index 21ee4d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test2/out/Inner.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/in/A.java
deleted file mode 100644
index f0ec38f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A{
-	public static class Inner{
-		public class InnerInner{}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/in/A1.java
deleted file mode 100644
index fa9bbd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/in/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p1;
-
-import p.A.*;
-
-class A1{
-	p.A.Inner a;
-	p.A.Inner.InnerInner a1;
-	Inner a2;
-	Inner.InnerInner a3;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/A.java
deleted file mode 100644
index 52c6073..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/A1.java
deleted file mode 100644
index 5d6c4ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/A1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p1;
-
-import p.Inner;
-import p.A.*;
-
-class A1{
-	p.Inner a;
-	p.Inner.InnerInner a1;
-	Inner a2;
-	Inner.InnerInner a3;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/Inner.java
deleted file mode 100644
index 12cfc64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test20/out/Inner.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class Inner{
-	public class InnerInner{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/in/A.java
deleted file mode 100644
index fb6b413..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A {
-    static int i= 0;
-    interface Inner{
-        int I= i;
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/out/A.java
deleted file mode 100644
index 831e943..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A {
-    static int i= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/out/Inner.java
deleted file mode 100644
index 2a485d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test21/out/Inner.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface Inner{
-    int I= A.i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/in/A.java
deleted file mode 100644
index b75ae8e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A {
-    static int i= 0;
-    static interface Inner{
-        int I= i;
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/out/A.java
deleted file mode 100644
index 831e943..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A {
-    static int i= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/out/Inner.java
deleted file mode 100644
index 2a485d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test22/out/Inner.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface Inner{
-    int I= A.i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/in/A.java
deleted file mode 100644
index d92e2fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class A {
-    Inner inner= new Inner();
-    static class Inner{
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/out/A.java
deleted file mode 100644
index 2477ba3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A {
-    Inner inner= new Inner();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/out/Inner.java
deleted file mode 100644
index 21ee4d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test23/out/Inner.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/in/A.java
deleted file mode 100644
index cc5ec8f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public interface A {
-    class Inner{
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/out/A.java
deleted file mode 100644
index b7eda42..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/out/Inner.java
deleted file mode 100644
index 21ee4d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test24/out/Inner.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/in/A.java
deleted file mode 100644
index 12651d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-class A
-{
-	public static class Inner
-	{	
-	}
-	
-	public A()
-	{
-		super();
-		new A.Inner();
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/out/A.java
deleted file mode 100644
index 50f6a43..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-class A
-{
-	public A()
-	{
-		super();
-		new Inner();
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/out/Inner.java
deleted file mode 100644
index 3e161ae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test25/out/Inner.java
+++ /dev/null
@@ -1,4 +0,0 @@
-
-public class Inner
-{	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/in/A.java
deleted file mode 100644
index 2706e60..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	static protected class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/out/Inner.java
deleted file mode 100644
index 21ee4d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test3/out/Inner.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/in/A.java
deleted file mode 100644
index 61c05cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	static protected final class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/out/Inner.java
deleted file mode 100644
index fea4077..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test4/out/Inner.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-final class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/in/A.java
deleted file mode 100644
index c9f122e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	static protected abstract class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/out/Inner.java
deleted file mode 100644
index 6aab93d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test5/out/Inner.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-abstract class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/in/A.java
deleted file mode 100644
index de26604..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	/**
-	 * Inner class javadoc
-	 */
-	static class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/out/Inner.java
deleted file mode 100644
index 2a08594..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test6/out/Inner.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-/**
- * Inner class javadoc
- */
-class Inner{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/in/A.java
deleted file mode 100644
index cf9f36d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	static void f(){}
-	static class Inner{
-		void foo(){
-			f();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/out/A.java
deleted file mode 100644
index f2d628f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A {
-	static void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/out/Inner.java
deleted file mode 100644
index 65ee93c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test7/out/Inner.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class Inner{
-	void foo(){
-		A.f();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/in/A.java
deleted file mode 100644
index fb37af6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	static void f(){}
-	static class Inner{
-		void f(){
-			f();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/out/A.java
deleted file mode 100644
index f2d628f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A {
-	static void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/out/Inner.java
deleted file mode 100644
index 5d15879..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test8/out/Inner.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class Inner{
-	void f(){
-		f();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/in/A.java
deleted file mode 100644
index 5ba341e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.List;
-
-class A {
-	static class Inner{
-		void foo(List list) {}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/out/A.java
deleted file mode 100644
index 688a6d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/out/Inner.java
deleted file mode 100644
index 756b5fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test9/out/Inner.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.List;
-
-class Inner{
-	void foo(List list) {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_0/in/A.java
deleted file mode 100644
index b1c2946..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_0/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	class Inner{
-		int a; //conflicting name
-		{foo();} //needs enclosing instance
-	}
-	void foo() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_1/in/A.java
deleted file mode 100644
index b3d961c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_1/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	class Inner{
-		Inner(int a){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_2/in/A.java
deleted file mode 100644
index 8c3974f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/testFail_nonstatic_2/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	class Inner{
-	}
-}
-class Inner {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/in/A.java
deleted file mode 100644
index 1a0b0eb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/out/Inner.java
deleted file mode 100644
index 6496d85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_0/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner{
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/in/A.java
deleted file mode 100644
index 62c3edf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	class Inner{
-		void f(){
-		}
-	}
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/out/A.java
deleted file mode 100644
index 19908f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		new Inner(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/out/Inner.java
deleted file mode 100644
index 04f8232..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_1/out/Inner.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class Inner{
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/in/A.java
deleted file mode 100644
index e0b6d0f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A{
-	A a;
-	class Inner {
-	}
-	void f(A a){
-		a.a.a.new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/out/A.java
deleted file mode 100644
index eb1296d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A{
-	A a;
-	void f(A a){
-		new Inner(a.a.a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/out/Inner.java
deleted file mode 100644
index 005d64c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_10/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner {
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/in/A.java
deleted file mode 100644
index dc4e7d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-	class Inner {
-		void f(){
-			new Inner();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/out/A.java
deleted file mode 100644
index db0b740..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/out/Inner.java
deleted file mode 100644
index 14ff093..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_11/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		new Inner(this.a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/in/A.java
deleted file mode 100644
index c0cba86..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	void foo(){
-	}
-	class Inner {
-		void f(){
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/out/A.java
deleted file mode 100644
index 0a7570e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A{
-	void foo(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/out/Inner.java
deleted file mode 100644
index 8916fa8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_12/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		this.a.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/in/A.java
deleted file mode 100644
index 54b819f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A{
-	int i;
-	class Inner {
-		void f(){
-			i= 1;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/out/A.java
deleted file mode 100644
index 0312fb1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A{
-	int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/out/Inner.java
deleted file mode 100644
index b3dc442..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_13/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		this.a.i= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/in/A.java
deleted file mode 100644
index 05c1028..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A{
-	class X{}
-	class Inner {
-		void f(){
-			X x= new X();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/out/A.java
deleted file mode 100644
index d39ac4f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A{
-	class X{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/out/Inner.java
deleted file mode 100644
index 39887f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_14/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner{
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		A.X x= this.a.new X();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/in/A.java
deleted file mode 100644
index 389caf8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	static void foo(){
-	}
-	class Inner {
-		void f(){
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/out/A.java
deleted file mode 100644
index f1f9373..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A{
-	static void foo(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/out/Inner.java
deleted file mode 100644
index b214bbe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_15/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		A.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/in/A.java
deleted file mode 100644
index d007001..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A{
-	static int i;
-	class Inner {
-		void f(){
-			i= 1;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/out/A.java
deleted file mode 100644
index 4d145ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A{
-	static int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/out/Inner.java
deleted file mode 100644
index 2c98dec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_16/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		A.i= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/in/A.java
deleted file mode 100644
index 472b58e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A{
-	static class X{}
-	class Inner {
-		void f(){
-			X x= new X();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/out/A.java
deleted file mode 100644
index ffe4df6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-class A{
-	static class X{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/out/Inner.java
deleted file mode 100644
index cdf65d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_17/out/Inner.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-class Inner{
-	private A a;
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-	void f(){
-		A.X x= new A.X();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/in/A.java
deleted file mode 100644
index 653e337..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	class Inner {
-		Inner(){
-			this(0);
-		}
-		Inner(int i){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/out/A.java
deleted file mode 100644
index db0b740..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/out/Inner.java
deleted file mode 100644
index 163f99b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_18/out/Inner.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class Inner {
-	private A a;
-	Inner(A a){
-		this(a, 0);
-	}
-	Inner(A a, int i){
-		this.a= a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/in/A.java
deleted file mode 100644
index 04e9446..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-		Inner(){
-			this(0);
-		}
-		Inner(int i){
-			super();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/out/A.java
deleted file mode 100644
index db0b740..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/out/Inner.java
deleted file mode 100644
index 5792e75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_19/out/Inner.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class Inner{
-	private A a;
-	Inner(A a){
-		this(a, 0);
-	}
-	Inner(A a, int i){
-		super();
-		this.a= a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/in/A.java
deleted file mode 100644
index f3e49b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	class Inner{
-		void f(){
-		}
-	}
-	class Inner2{
-		void f(){
-			new Inner();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/out/A.java
deleted file mode 100644
index 472b149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	class Inner2{
-		void f(){
-			new Inner(A.this);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/out/Inner.java
deleted file mode 100644
index 04f8232..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_2/out/Inner.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class Inner{
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/in/A.java
deleted file mode 100644
index 77d3571..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-		Inner(){
-			super();
-		}
-		Inner(int i){
-			this();
-		}
-		Inner(boolean b){
-			this(1);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/out/A.java
deleted file mode 100644
index db0b740..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/out/Inner.java
deleted file mode 100644
index 794db48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_20/out/Inner.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-class Inner{
-	private A a;
-	Inner(A a){
-		super();
-		this.a= a;
-	}
-	Inner(A a, int i){
-		this(a);
-	}
-	Inner(A a, boolean b){
-		this(a, 1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/in/A.java
deleted file mode 100644
index 3ff800d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-		Inner(){
-		}
-		Inner(int i){
-		}
-	}
-}
-class I2 extends A.Inner{
-	I2(){
-		new A().super();
-	}
-	I2(int i){
-		new A().super(i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/out/A.java
deleted file mode 100644
index d4c2cb4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A{
-}
-class I2 extends Inner{
-	I2(){
-		super(new A());
-	}
-	I2(int i){
-		super(new A(), i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/out/Inner.java
deleted file mode 100644
index 9c3ee68..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_21/out/Inner.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class Inner{
-	private A a;
-	Inner(A a){
-		this.a= a;
-	}
-	Inner(A a, int i){
-		this.a= a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/in/A.java
deleted file mode 100644
index 13f2db8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-	}
-}
-class I2 extends A.Inner{
-	I2(){
-		new A().super();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/out/A.java
deleted file mode 100644
index d9e0855..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-}
-class I2 extends Inner{
-	I2(){
-		super(new A());
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/out/Inner.java
deleted file mode 100644
index 6496d85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_22/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner{
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/in/A.java
deleted file mode 100644
index dd2e1e6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-	}
-}
-class I2 extends A.Inner{
-	I2(){
-		new A().super();
-	}
-}
-class I3 extends I2{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/out/A.java
deleted file mode 100644
index c6275fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-}
-class I2 extends Inner{
-	I2(){
-		super(new A());
-	}
-}
-class I3 extends I2{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/out/Inner.java
deleted file mode 100644
index 6496d85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_23/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner{
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/in/A.java
deleted file mode 100644
index 2fb8a75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	class Inner{
-		Inner(){
-			f();
-		}
-		void f(){
-		}
-	}
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/out/A.java
deleted file mode 100644
index 19908f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		new Inner(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/out/Inner.java
deleted file mode 100644
index 0d93aa3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_24/out/Inner.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class Inner{
-	private A a;
-	Inner(A a){
-		f();
-		this.a= a;
-	}
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/in/A.java
deleted file mode 100644
index 28ed338..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-		Inner(){
-			super();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/out/A.java
deleted file mode 100644
index db0b740..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/out/Inner.java
deleted file mode 100644
index 6ba96f9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_25/out/Inner.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class Inner{
-	private A a;
-
-	Inner(A a){
-		super();
-		this.a= a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/in/A.java
deleted file mode 100644
index 389caf8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	static void foo(){
-	}
-	class Inner {
-		void f(){
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/out/A.java
deleted file mode 100644
index f1f9373..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A{
-	static void foo(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/out/Inner.java
deleted file mode 100644
index b214bbe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_26/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		A.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/in/A.java
deleted file mode 100644
index 389caf8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	static void foo(){
-	}
-	class Inner {
-		void f(){
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/out/A.java
deleted file mode 100644
index f1f9373..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A{
-	static void foo(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/out/Inner.java
deleted file mode 100644
index b214bbe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_27/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		A.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/in/A.java
deleted file mode 100644
index 1840ce6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A {
-    public static class OtherInner {}
-    public class Inner extends OtherInner {}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/out/A.java
deleted file mode 100644
index ea9b74c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A {
-    public static class OtherInner {}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/out/Inner.java
deleted file mode 100644
index 7b99547..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_28/out/Inner.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-public class Inner extends A.OtherInner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/in/A.java
deleted file mode 100644
index ea7e1cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A {
-    public class OtherInner {}
-    public class Inner extends OtherInner {}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/out/A.java
deleted file mode 100644
index 3015e0c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A {
-    public class OtherInner {}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/out/Inner.java
deleted file mode 100644
index b8721e5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_29/out/Inner.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class Inner extends A.OtherInner {
-	private A a;
-
-	Inner(A a) {
-		a.super();
-		this.a = a;
-	}}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/in/A.java
deleted file mode 100644
index 02c0905..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-	}
-	
-	static class Inner2{
-		void f(){
-			new A().new Inner();
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/out/A.java
deleted file mode 100644
index 479c0de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-	static class Inner2{
-		void f(){
-			new Inner(new A());
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/out/Inner.java
deleted file mode 100644
index 6496d85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_3/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner{
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/in/A.java
deleted file mode 100644
index a03ceae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A {
-	class Inner{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/out/A.java
deleted file mode 100644
index f6125f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/out/Inner.java
deleted file mode 100644
index e543ffd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_30/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner{
-
-	private final A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/in/A.java
deleted file mode 100644
index 1016cbd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	class Inner{
-		void f(){
-			A.this.m();
-		}
-	}
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/out/A.java
deleted file mode 100644
index 8e0003a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A {
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/out/Inner.java
deleted file mode 100644
index 2eb0107..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_31/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner{
-	private final A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		this.a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/in/A.java
deleted file mode 100644
index 4441539..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	class Inner{
-		void f(){
-			A.this.m= 1;
-		}
-	}
-	int m;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/out/A.java
deleted file mode 100644
index 2540788..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A {
-	int m;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/out/Inner.java
deleted file mode 100644
index d61aa6b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_32/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner{
-	private final A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		this.a.m= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/in/A.java
deleted file mode 100644
index 162df04..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-	private class I{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/out/A.java
deleted file mode 100644
index 688a6d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/out/I.java
deleted file mode 100644
index de01c5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_33/out/I.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class I{
-
-	private final A a;
-
-	/**
-	 * @param A
-	 */
-	I(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/in/A.java
deleted file mode 100644
index 304eb17..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/in/A.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package p;
-class A {
-
-	public class Inner {
-
-		public Inner() {
-			super();
-			System.out.println(getName());
-		}
-
-		public String getName() {
-			return getTopName() + ".Inner";
-		}
-	}
-
-	public A() {
-		new Object(){};
-		System.out.println(new Inner().getName());
-	}
-
-	public String getTopName() {
-		return "Top";
-	}
-
-	static public void main(String[] argv) {
-		new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/out/A.java
deleted file mode 100644
index 1638765..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A {
-
-	public A() {
-		new Object(){};
-		System.out.println(new Inner(this).getName());
-	}
-
-	public String getTopName() {
-		return "Top";
-	}
-
-	static public void main(String[] argv) {
-		new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/out/Inner.java
deleted file mode 100644
index 504cd39..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_34/out/Inner.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-public class Inner {
-
-	private final A a;
-
-	public Inner(A a) {
-		super();
-		this.a= a;
-		System.out.println(getName());
-	}
-
-	public String getName() {
-		return this.a.getTopName() + ".Inner";
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/in/A.java
deleted file mode 100644
index e603c16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	class Inner{
-		Inner(){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/out/Inner.java
deleted file mode 100644
index e41b7d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_35/out/Inner.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class Inner{
-	private A a;
-
-	Inner(A a){
-		this.a= a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/in/A.java
deleted file mode 100644
index ab93f74..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/in/A.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package p;
-class A
-{
-	public String bar2()
-	{
-		return "wee!";
-	}
-	public String bar3;
-	
-	public class Inner
-	{
-		
-		public void bar0(){
-			class Local{
-				public void run()
-				{
-					System.out.println(bar2());
-					bar3= "fred";
-				}
-			}
-		}
-		
-		public void bar()
-		{
-			new Runnable()
-			{
-				public void run()
-				{
-					System.out.println(bar2());
-					bar3= "fred";
-				}
-			};
-		}
-		
-		class InnerInner{
-			public void run()
-			{
-				System.out.println(bar2());
-				bar3= "fred";
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/out/A.java
deleted file mode 100644
index 9d8430f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A
-{
-	public String bar2()
-	{
-		return "wee!";
-	}
-	public String bar3;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/out/Inner.java
deleted file mode 100644
index 23daf4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_36/out/Inner.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package p;
-public class Inner
-{
-	
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	public void bar0(){
-		class Local{
-			public void run()
-			{
-				System.out.println(Inner.this.a.bar2());
-				Inner.this.a.bar3= "fred";
-			}
-		}
-	}
-	
-	public void bar()
-	{
-		new Runnable()
-		{
-			public void run()
-			{
-				System.out.println(Inner.this.a.bar2());
-				Inner.this.a.bar3= "fred";
-			}
-		};
-	}
-	
-	class InnerInner{
-		public void run()
-		{
-			System.out.println(Inner.this.a.bar2());
-			Inner.this.a.bar3= "fred";
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/in/A.java
deleted file mode 100644
index 241cdf0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-public class A {
-	class Inner {
-		public void doit() {
-			foo(bar());
-		}
-	}
-	public void foo(int value) {
-	}
-	public int bar() {
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/out/A.java
deleted file mode 100644
index a3a80a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A {
-	public void foo(int value) {
-	}
-	public int bar() {
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/out/Inner.java
deleted file mode 100644
index 5367508..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_37/out/Inner.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-
-	public void doit() {
-		this.a.foo(this.a.bar());
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/in/A.java
deleted file mode 100644
index cf3c242..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A {
-	class Inner {
-		public void doit() {
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/out/A.java
deleted file mode 100644
index f6125f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/out/Inner.java
deleted file mode 100644
index 2df2577..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_38/out/Inner.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class Inner {
-	public void doit() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/in/A.java
deleted file mode 100644
index 0581341..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-public class A {
-	class Inner {
-		public void doit() {
-			foo();
-			fred++;
-			new Stat();
-		}
-	}
-	static void foo(){};
-	static int fred;
-	static class Stat{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/out/A.java
deleted file mode 100644
index 189e6f8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class A {
-	static void foo(){};
-	static int fred;
-	static class Stat{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/out/Inner.java
deleted file mode 100644
index 3fffc78..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_39/out/Inner.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import p.A.Stat;
-
-class Inner {
-	public void doit() {
-		A.foo();
-		A.fred++;
-		new Stat();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/in/A.java
deleted file mode 100644
index 7f679a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-	}
-}
-class B extends A{
-	void f(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/out/A.java
deleted file mode 100644
index 9398780..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-}
-class B extends A{
-	void f(){
-		new Inner(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/out/Inner.java
deleted file mode 100644
index 6496d85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_4/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner{
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/in/A.java
deleted file mode 100644
index c0704fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-	}
-}
-class B extends A.Inner{
-	B(){
-		new A().super();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/out/A.java
deleted file mode 100644
index b9043e6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-}
-class B extends Inner{
-	B(){
-		super(new A());
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/out/Inner.java
deleted file mode 100644
index 6496d85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_5/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner{
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/in/A.java
deleted file mode 100644
index 0c91ef8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A{
-	class Inner {
-		Inner(int t){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/out/A.java
deleted file mode 100644
index db0b740..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/out/Inner.java
deleted file mode 100644
index 271d212..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_6/out/Inner.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class Inner {
-	private A a;
-
-	Inner(A a, int t){
-		this.a= a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/in/A.java
deleted file mode 100644
index ec0d825..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	class Inner {
-	}
-	class X extends A{
-		void f(){
-			new Inner();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/out/A.java
deleted file mode 100644
index 43b5118..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-	class X extends A{
-		void f(){
-			new Inner(this);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/out/Inner.java
deleted file mode 100644
index 005d64c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_7/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner {
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/in/A.java
deleted file mode 100644
index d862d48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A{
-	class Inner {
-	}
-	void f(){
-		new Inner(){
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/out/A.java
deleted file mode 100644
index 74333cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A{
-	void f(){
-		new Inner(this){
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/out/Inner.java
deleted file mode 100644
index 005d64c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_8/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner {
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/in/A.java
deleted file mode 100644
index cadbc90..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A{
-	class Inner {
-	}
-	void f(){
-		new Inner(){
-			void ft(){
-				new Inner();
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/out/A.java
deleted file mode 100644
index ff9d08b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	void f(){
-		new Inner(this){
-			void ft(){
-				new Inner(A.this);
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/out/Inner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/out/Inner.java
deleted file mode 100644
index 005d64c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInnerToTopLevel/test_nonstatic_9/out/Inner.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Inner {
-
-	private A a;
-
-	/**
-	 * @param A
-	 */
-	Inner(A a) {
-		this.a= a;
-		// TODO Auto-generated constructor stub
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/A.java
deleted file mode 100644
index 826a46e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// Move mA1 to parameter b, do not inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(B b) {
-		b.mB1();
-		mA2(); //test comment
-		b.mB2();
-		System.out.println(this);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/C.java
deleted file mode 100644
index c0eba7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/in/C.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p3;
-
-import p1.A;
-import p2.B;
-
-class C {
-	{
-		A a= new A();
-		a.mA1(new B());
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/A.java
deleted file mode 100644
index 762e718..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Move mA1 to parameter b, do not inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(B b) {
-		b.mA1(this);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/B.java
deleted file mode 100644
index 40bbade..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/B.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-
-	public void mA1(A a) {
-		mB1();
-		a.mA2(); //test comment
-		mB2();
-		System.out.println(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/C.java
deleted file mode 100644
index c0eba7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test0/out/C.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p3;
-
-import p1.A;
-import p2.B;
-
-class C {
-	{
-		A a= new A();
-		a.mA1(new B());
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/A.java
deleted file mode 100644
index 66a4ff9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// Move mA1 to parameter b, inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(B b) {
-		b.mB1();
-		mA2();
-		b.mB2();
-		System.out.println(this);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/C.java
deleted file mode 100644
index 68dfcdb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/in/C.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p3;
-
-import p1.A;
-import p2.B;
-
-class C {
-	{
-		this.getA().m1A(getB());
-	}
-	
-	A getA() {
-		return null;
-	}
-	
-	B getB() {
-		return null;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/A.java
deleted file mode 100644
index 1834c0b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Move mA1 to parameter b, inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(B b) {
-		b.mA1(this);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/B.java
deleted file mode 100644
index 4d90b64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/B.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-	
-	public void mA1(A a) {
-		mB1();
-		a.mA2();
-		mB2();
-		System.out.println(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/C.java
deleted file mode 100644
index 09a8ec2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test1/out/C.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p3;
-
-import p1.A;
-import p2.B;
-
-class C {
-	{
-		getB().m1A(this.getA());
-	}
-
-	A getA() {
-		return null;
-	}
-
-	B getB() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/in/A.java
deleted file mode 100644
index 8e05c5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(float j, B b, int foo, String bar) {
-		b.mB1();
-		System.out.println(bar + j);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/out/A.java
deleted file mode 100644
index 978b3db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(float j, B b, int foo, String bar) {
-		b.mA1(j, foo, bar);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/out/B.java
deleted file mode 100644
index 2dcaf1f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test10/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-
-	public void mA1(float j, int foo, String bar) {
-		mB1();
-		System.out.println(bar + j);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/in/A.java
deleted file mode 100644
index 9837c16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public int fInt;
-	public B fB;
-	public String fString;
-	public boolean fBool;
-	
-	public void mA1(float j, int foo, String bar) {
-		fB.mB1();
-		System.out.println(bar + j + this);
-		String z= fString + fBool;
-		fInt++;
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/out/A.java
deleted file mode 100644
index bbbda11..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public int fInt;
-	public B fB;
-	public String fString;
-	public boolean fBool;
-	
-	public void mA1(float j, int foo, String bar) {
-		fB.mA1(this, j, foo, bar);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/out/B.java
deleted file mode 100644
index f1f026a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test11/out/B.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-
-	public void mA1(A a, float j, int foo, String bar) {
-		mB1();
-		System.out.println(bar + j + a);
-		String z= a.fString + a.fBool;
-		a.fInt++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/in/A.java
deleted file mode 100644
index b9ab0fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public B fB;
-	
-	public void mA1(float j, int foo, String bar) {
-		fB.mB1();
-		System.out.println(bar + j);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/out/A.java
deleted file mode 100644
index 35e6bed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public B fB;
-	
-	public void mA1(float j, int foo, String bar) {
-		fB.mA1(j, foo, bar);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/out/B.java
deleted file mode 100644
index 2f3b673..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test12/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-
-	public void mA1(float j, int foo, String bar) {
-		mB1();
-		System.out.println(bar + j);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/P.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/P.java
deleted file mode 100644
index 38a77a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/P.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-public interface P{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/TC.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/TC.java
deleted file mode 100644
index 1454a04..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/TC.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p1;
-public class TC {
-	public void runBare() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/TR.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/TR.java
deleted file mode 100644
index d1c72a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/in/TR.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package p1;
-
-public class TR {
-	protected void run(final TC test) {
-		startTest(test);
-		P p= new P() {
-			public void protect() throws Throwable {
-				test.runBare();
-			}
-		};
-		runProtected(test, p);
-
-		endTest(test);
-	}
-
-	private void runProtected(TC test, P p) {
-	}
-
-	private void endTest(TC test) {
-	}
-
-	private void startTest(TC test) {
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/P.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/P.java
deleted file mode 100644
index 38a77a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/P.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-public interface P{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/TC.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/TC.java
deleted file mode 100644
index 38e4feb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/TC.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p1;
-public class TC {
-	public void runBare() {
-	}
-
-	protected void run(TR tr) {
-		tr.startTest(this);
-		P p= new P() {
-			public void protect() throws Throwable {
-				runBare();
-			}
-		};
-		tr.runProtected(this, p);
-	
-		tr.endTest(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/TR.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/TR.java
deleted file mode 100644
index c80b24a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test13/out/TR.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p1;
-
-public class TR {
-	protected void run(final TC test) {
-		test.run(this);
-	}
-
-	private void runProtected(TC test, P p) {
-	}
-
-	private void endTest(TC test) {
-	}
-
-	private void startTest(TC test) {
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/in/TC.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/in/TC.java
deleted file mode 100644
index c8e3f6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/in/TC.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-public class TC {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/in/TR.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/in/TR.java
deleted file mode 100644
index 2c97aa8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/in/TR.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p1;
-
-public class TR {
-	protected void run(TC test) {
-		startTest(test);
-	}
-
-	private void startTest(TC test) {
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/out/TC.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/out/TC.java
deleted file mode 100644
index d9e96f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/out/TC.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p1;
-public class TC {
-
-	protected void run(TR tr) {
-		tr.startTest(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/out/TR.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/out/TR.java
deleted file mode 100644
index c59a471..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test14/out/TR.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p1;
-
-public class TR {
-	protected void run(TC test) {
-		test.run(this);
-	}
-
-	private void startTest(TC test) {
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test15/in/A.java
deleted file mode 100644
index b800d70..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test15/in/A.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package p;
-
-public class A {
-	int fMagic;
-
-	public static void main(String[] args) {
-		Second s= new Second("Bingo");
-		A a= new A();
-		a.fMagic= 17;
-		a.print(s);
-	}
-
-	public void print(Second s) {
-		System.out.println(s + ": " + fMagic);
-	}
-}
-
-class Second {
-	String fName;
-	public Second(String name) {
-		fName= name;
-	}
-	public String toString() {
-		return fName;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test15/out/A.java
deleted file mode 100644
index 96a212c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test15/out/A.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package p;
-
-public class A {
-	int fMagic;
-
-	public static void main(String[] args) {
-		Second s= new Second("Bingo");
-		A a= new A();
-		a.fMagic= 17;
-		a.print(s);
-	}
-
-	public void print(Second s) {
-		s.print(this);
-	}
-}
-
-class Second {
-	String fName;
-	public Second(String name) {
-		fName= name;
-	}
-	public String toString() {
-		return fName;
-	}
-	public void print(A a) {
-		System.out.println(this + ": " + a.fMagic);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test16/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test16/in/B.java
deleted file mode 100644
index 9860b4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test16/in/B.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-public class B {
-	private int count;
-
-	public void f() {
-		Inner s= new Inner();
-		print(s);
-	}
-	
-	public void print(Inner s) {
-		count++;
-		System.out.println(s);
-	}	
-
-	public class Inner {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test16/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test16/out/B.java
deleted file mode 100644
index 655f334..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test16/out/B.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package p;
-
-public class B {
-	private int count;
-
-	public void f() {
-		Inner s= new Inner();
-		print(s);
-	}
-	
-	public void print(Inner s) {
-		s.print(this);
-	}	
-
-	public class Inner {
-
-		public void print(B b) {
-			b.count++;
-			System.out.println(this);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/in/Rectangle.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/in/Rectangle.java
deleted file mode 100644
index 8c2a166..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/in/Rectangle.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package p;
-
-public class Rectangle {
-	public int x;
-	public int y;
-	public int width;
-	public int height;
-
-	public Rectangle (int x, int y, int width, int height) {
-		this.x = x;
-		this.y = y;
-		this.width = width;
-		this.height = height;
-	}
-
-	public int getWidth() {
-		return width;
-	}
-
-	public int getHeight() {
-		return height;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/in/Shape.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/in/Shape.java
deleted file mode 100644
index fdc0e24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/in/Shape.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-
-public class Shape {
-	Rectangle fBounds;
-	Rectangle fInnerBounds;
-	
-	public int area() {
-		int width= fBounds.getWidth();
-		int height= fBounds.getHeight();
-		return width*height;
-	}
-	
-	public int filledArea() {
-		return area() -	fInnerBounds.getWidth() * fInnerBounds.getHeight();
-	}
-	
-	public boolean isSmallerThan(Rectangle rect) {
-		return area() < rect.getWidth() * rect.getHeight();
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/out/Rectangle.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/out/Rectangle.java
deleted file mode 100644
index 91a6faa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/out/Rectangle.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package p;
-
-public class Rectangle {
-	public int x;
-	public int y;
-	public int width;
-	public int height;
-
-	public Rectangle (int x, int y, int width, int height) {
-		this.x = x;
-		this.y = y;
-		this.width = width;
-		this.height = height;
-	}
-
-	public int getWidth() {
-		return width;
-	}
-
-	public int getHeight() {
-		return height;
-	}
-
-	public int area() {
-		int width= getWidth();
-		int height= getHeight();
-		return width*height;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/out/Shape.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/out/Shape.java
deleted file mode 100644
index 66524b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test17/out/Shape.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-
-public class Shape {
-	Rectangle fBounds;
-	Rectangle fInnerBounds;
-	
-	public int area() {
-		return fBounds.area();
-	}
-	
-	public int filledArea() {
-		return area() -	fInnerBounds.getWidth() * fInnerBounds.getHeight();
-	}
-	
-	public boolean isSmallerThan(Rectangle rect) {
-		return area() < rect.getWidth() * rect.getHeight();
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/in/Rectangle.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/in/Rectangle.java
deleted file mode 100644
index 8c2a166..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/in/Rectangle.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package p;
-
-public class Rectangle {
-	public int x;
-	public int y;
-	public int width;
-	public int height;
-
-	public Rectangle (int x, int y, int width, int height) {
-		this.x = x;
-		this.y = y;
-		this.width = width;
-		this.height = height;
-	}
-
-	public int getWidth() {
-		return width;
-	}
-
-	public int getHeight() {
-		return height;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/in/Shape.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/in/Shape.java
deleted file mode 100644
index fdc0e24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/in/Shape.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-
-public class Shape {
-	Rectangle fBounds;
-	Rectangle fInnerBounds;
-	
-	public int area() {
-		int width= fBounds.getWidth();
-		int height= fBounds.getHeight();
-		return width*height;
-	}
-	
-	public int filledArea() {
-		return area() -	fInnerBounds.getWidth() * fInnerBounds.getHeight();
-	}
-	
-	public boolean isSmallerThan(Rectangle rect) {
-		return area() < rect.getWidth() * rect.getHeight();
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/out/Rectangle.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/out/Rectangle.java
deleted file mode 100644
index 212e4c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/out/Rectangle.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package p;
-
-public class Rectangle {
-	public int x;
-	public int y;
-	public int width;
-	public int height;
-
-	public Rectangle (int x, int y, int width, int height) {
-		this.x = x;
-		this.y = y;
-		this.width = width;
-		this.height = height;
-	}
-
-	public int getWidth() {
-		return width;
-	}
-
-	public int getHeight() {
-		return height;
-	}
-
-	public int filledArea(Shape shape) {
-		return shape.area() -	getWidth() * getHeight();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/out/Shape.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/out/Shape.java
deleted file mode 100644
index b93e1ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test18/out/Shape.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-
-public class Shape {
-	Rectangle fBounds;
-	Rectangle fInnerBounds;
-	
-	public int area() {
-		int width= fBounds.getWidth();
-		int height= fBounds.getHeight();
-		return width*height;
-	}
-	
-	public int filledArea() {
-		return fInnerBounds.filledArea(this);
-	}
-	
-	public boolean isSmallerThan(Rectangle rect) {
-		return area() < rect.getWidth() * rect.getHeight();
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/in/Rectangle.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/in/Rectangle.java
deleted file mode 100644
index 8c2a166..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/in/Rectangle.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package p;
-
-public class Rectangle {
-	public int x;
-	public int y;
-	public int width;
-	public int height;
-
-	public Rectangle (int x, int y, int width, int height) {
-		this.x = x;
-		this.y = y;
-		this.width = width;
-		this.height = height;
-	}
-
-	public int getWidth() {
-		return width;
-	}
-
-	public int getHeight() {
-		return height;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/in/Shape.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/in/Shape.java
deleted file mode 100644
index fdc0e24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/in/Shape.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-
-public class Shape {
-	Rectangle fBounds;
-	Rectangle fInnerBounds;
-	
-	public int area() {
-		int width= fBounds.getWidth();
-		int height= fBounds.getHeight();
-		return width*height;
-	}
-	
-	public int filledArea() {
-		return area() -	fInnerBounds.getWidth() * fInnerBounds.getHeight();
-	}
-	
-	public boolean isSmallerThan(Rectangle rect) {
-		return area() < rect.getWidth() * rect.getHeight();
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/out/Rectangle.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/out/Rectangle.java
deleted file mode 100644
index d7b3b20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/out/Rectangle.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package p;
-
-public class Rectangle {
-	public int x;
-	public int y;
-	public int width;
-	public int height;
-
-	public Rectangle (int x, int y, int width, int height) {
-		this.x = x;
-		this.y = y;
-		this.width = width;
-		this.height = height;
-	}
-
-	public int getWidth() {
-		return width;
-	}
-
-	public int getHeight() {
-		return height;
-	}
-
-	public boolean isSmallerThan(Shape shape) {
-		return shape.area() < getWidth() * getHeight();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/out/Shape.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/out/Shape.java
deleted file mode 100644
index cf0122b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test19/out/Shape.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package p;
-
-public class Shape {
-	Rectangle fBounds;
-	Rectangle fInnerBounds;
-	
-	public int area() {
-		int width= fBounds.getWidth();
-		int height= fBounds.getHeight();
-		return width*height;
-	}
-	
-	public int filledArea() {
-		return area() -	fInnerBounds.getWidth() * fInnerBounds.getHeight();
-	}
-	
-	public boolean isSmallerThan(Rectangle rect) {
-		return rect.isSmallerThan(this);
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/A.java
deleted file mode 100644
index 0faad9b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// Move mA1 to parameter b, inline delegator, remove delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(B b) {
-		b.mB1();
-		mA2();
-		b.mB2();
-		System.out.println(this);		
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/C.java
deleted file mode 100644
index 8a5c7bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/in/C.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p3;
-
-import p1.A;
-import p2.B;
-
-class C {
-	{
-		A a= new A();
-		a.m1A(new B());
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/A.java
deleted file mode 100644
index 0f4cec4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-// Move mA1 to parameter b, inline delegator, remove delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/B.java
deleted file mode 100644
index 9e98d3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/B.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-	
-	public void mA1(A a) {
-		mB1();
-		a.mA2();
-		mB2();
-		System.out.println(a);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/C.java
deleted file mode 100644
index e7bacb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test2/out/C.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p3;
-
-import p1.A;
-import p2.B;
-
-class C {
-	{
-		A a= new A();
-		new B().m1A(a);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/A.java
deleted file mode 100644
index 4a28847..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-
-public class A {
-	public static void main(String[] args) {
-		A a= new A();
-		B b= new B("Gugguseli");
-		a.print(b);
-	}
-
-	public void print(B b) {
-		System.out.println(
-			new StarDecorator() {
-				public String decorate(String in) {
-					return "(" + super.decorate(in) + ")";
-				}
-			}.decorate(b.toString())
-		);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/B.java
deleted file mode 100644
index 8af34a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/B.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-public class B {
-	private String fName;
-	
-	public B(String name) {
-		fName= name;
-	}
-		
-	public String toString() {
-		return fName;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/StarDecorator.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/StarDecorator.java
deleted file mode 100644
index 2bc37d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/in/StarDecorator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class StarDecorator {
-	public String decorate(String in) {
-		return "*" + in + "*";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/A.java
deleted file mode 100644
index 9018d9a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-public class A {
-	public static void main(String[] args) {
-		A a= new A();
-		B b= new B("Gugguseli");
-		a.print(b);
-	}
-
-	public void print(B b) {
-		b.print();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/B.java
deleted file mode 100644
index d7c8162..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/B.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package p;
-
-public class B {
-	private String fName;
-	
-	public B(String name) {
-		fName= name;
-	}
-		
-	public String toString() {
-		return fName;
-	}
-
-	public void print() {
-		System.out.println(
-			new StarDecorator() {
-				public String decorate(String in) {
-					return "(" + super.decorate(in) + ")";
-				}
-			}.decorate(toString())
-		);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/StarDecorator.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/StarDecorator.java
deleted file mode 100644
index 2bc37d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test20/out/StarDecorator.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class StarDecorator {
-	public String decorate(String in) {
-		return "*" + in + "*";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/in/A.java
deleted file mode 100644
index 61c703e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-public class A {
-	Second s;
-	Second s2;
-	public void print() {
-		s.foo(s);
-		s.bar();
-		s.go(17, 18);
-
-		equals(this);
-		s.foo(s2);
-		s2.bar();
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/in/Second.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/in/Second.java
deleted file mode 100644
index 15a5b68..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/in/Second.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class Second {
-	public void foo(Second s) {
-		s.bar();
-	}
-
-	public void bar() {
-	}
-	
-	public void go(int i, int j) {
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/out/A.java
deleted file mode 100644
index e65e82b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A {
-	Second s;
-	Second s2;
-	public void print() {
-		s.print(this);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/out/Second.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/out/Second.java
deleted file mode 100644
index 31e193c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test21/out/Second.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package p;
-class Second {
-	public void foo(Second s) {
-		s.bar();
-	}
-
-	public void bar() {
-	}
-	
-	public void go(int i, int j) {
-	}
-
-	public void print(A a) {
-		foo(this);
-		bar();
-		go(17, 18);
-	
-		a.equals(a);
-		foo(a.s2);
-		a.s2.bar();
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/in/A.java
deleted file mode 100644
index 25ad603..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class A {
-	Second s;
-	Second s2;
-	public void print() {
-		s.foo(s);
-		s.bar();
-		s.go(17, 18);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/in/Second.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/in/Second.java
deleted file mode 100644
index 76d195d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/in/Second.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class Second {
-	public void foo(Second s) {
-		s.bar();
-	}
-
-	public void bar() {
-	}
-	
-	public void go(int i, int j) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/out/A.java
deleted file mode 100644
index 119d5c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A {
-	Second s;
-	Second s2;
-	public void print() {
-		s.print();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/out/Second.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/out/Second.java
deleted file mode 100644
index 9aef244..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test22/out/Second.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class Second {
-	public void foo(Second s) {
-		s.bar();
-	}
-
-	public void bar() {
-	}
-	
-	public void go(int i, int j) {
-	}
-
-	public void print() {
-		foo(this);
-		bar();
-		go(17, 18);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/in/A.java
deleted file mode 100644
index 2eac327..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-public class A {
-	Second s;
-	Second s2;
-	public void print() {
-		s.foo(s);
-		int s= 17;
-		s= 18;
-		this.s.foo(s2);
-		this.s2.foo(this.s);
-		System.out.println(this.s.str);
-		this.getClass();
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/in/Second.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/in/Second.java
deleted file mode 100644
index 4462067..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/in/Second.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class Second {
-	public String str;
-	public void foo(Second s) {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/out/A.java
deleted file mode 100644
index e65e82b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A {
-	Second s;
-	Second s2;
-	public void print() {
-		s.print(this);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/out/Second.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/out/Second.java
deleted file mode 100644
index c9f4131..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test23/out/Second.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class Second {
-	public String str;
-	public void foo(Second s) {
-	}
-	public void print(A a) {
-		foo(this);
-		int s= 17;
-		s= 18;
-		foo(a.s2);
-		a.s2.foo(this);
-		System.out.println(str);
-		a.getClass();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/A.java
deleted file mode 100644
index 299b87b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p1;
-public class A {
-	public static void main(String[] args) {
-		A a= new A();
-		B b= new B("Gugguseli");
-		a.print(b);
-	}
-
-	public void print(B b) {
-		class StarDecorator1 extends StarDecorator{
-			public String decorate(String in) {
-				return "(" + super.decorate(in) + ")";
-			}
-		}
-		System.out.println(
-			new StarDecorator1().decorate(b.toString())
-		);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/B.java
deleted file mode 100644
index 92c1924..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/B.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p1;
-public class B {
-	private String fName;
-	
-	public B(String name) {
-		fName= name;
-	}
-		
-	public String toString() {
-		return fName;
-	}
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/StarDecorator.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/StarDecorator.java
deleted file mode 100644
index ea45227..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/in/StarDecorator.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p1;
-class StarDecorator {
-	public String decorate(String in) {
-		return "*" + in + "*";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/A.java
deleted file mode 100644
index 7c025be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p1;
-public class A {
-	public static void main(String[] args) {
-		A a= new A();
-		B b= new B("Gugguseli");
-		a.print(b);
-	}
-
-	public void print(B b) {
-		b.print();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/B.java
deleted file mode 100644
index 90f75b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/B.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package p1;
-public class B {
-	private String fName;
-	
-	public B(String name) {
-		fName= name;
-	}
-		
-	public String toString() {
-		return fName;
-	}
-
-	public void print() {
-		class StarDecorator1 extends StarDecorator{
-			public String decorate(String in) {
-				return "(" + super.decorate(in) + ")";
-			}
-		}
-		System.out.println(
-			new StarDecorator1().decorate(toString())
-		);
-	}
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/StarDecorator.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/StarDecorator.java
deleted file mode 100644
index ea45227..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test24/out/StarDecorator.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p1;
-class StarDecorator {
-	public String decorate(String in) {
-		return "*" + in + "*";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/A.java
deleted file mode 100644
index 7b7b695..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// Move mA1 to field fB, do not inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public B fB;
-	
-	public void mA1() {
-		fB.mB1();
-		mA2();
-		fB.mB2();
-		System.out.println(this);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/C.java
deleted file mode 100644
index 5e3e916..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/in/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p3;
-
-import p1.A;
-
-class C {
-	{
-		A a= new A();
-		a.mA1();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/A.java
deleted file mode 100644
index 41d2b42..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// Move mA1 to field fB, do not inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public B fB;
-	
-	public void mA1() {
-		fB.mA1(this);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/B.java
deleted file mode 100644
index a88c008..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/B.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-
-	public void mA1(A a) {
-		mB1();
-		a.mA2();
-		mB2();
-		System.out.println(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/C.java
deleted file mode 100644
index 5e3e916..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test3/out/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p3;
-
-import p1.A;
-
-class C {
-	{
-		A a= new A();
-		a.mA1();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/A.java
deleted file mode 100644
index 93ec282..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// Move mA1 to field fB, inline delegator, remove delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public B fB;
-	
-	public void mA1() {
-		fB.mB1();
-		mA2();
-		fB.mB2();
-		System.out.println(this);		
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/C.java
deleted file mode 100644
index 6e3fde3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/in/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p3;
-
-import p1.A;
-
-class C {
-	{
-		A a= new A();
-		a.m1A();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/A.java
deleted file mode 100644
index 33f76bc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// Move mA1 to field fB, inline delegator, remove delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public B fB;
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/B.java
deleted file mode 100644
index 9e98d3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/B.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-	
-	public void mA1(A a) {
-		mB1();
-		a.mA2();
-		mB2();
-		System.out.println(a);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/C.java
deleted file mode 100644
index e652b65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test4/out/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p3;
-
-import p1.A;
-
-class C {
-	{
-		A a= new A();
-		a.fB.m1A(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/in/A.java
deleted file mode 100644
index 3a1033a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/in/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-// Move mA1 to field fB, unqualified static member references are qualified
-package p1;
-
-import p2.B;
-
-public class A {
-	public static String fgHello= "Hello from A!";
-	
-	public B fB;
-	
-	public static void talk(B b) {
-		System.out.println("How are you?");
-	}
-	
-	public void mA1() {
-		System.out.println(fgHello);
-		talk(fB);
-		System.out.println(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/in/B.java
deleted file mode 100644
index 58042f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p2;
-
-public class B {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/out/A.java
deleted file mode 100644
index c42dc5a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Move mA1 to field fB, unqualified static member references are qualified
-package p1;
-
-import p2.B;
-
-public class A {
-	public static String fgHello= "Hello from A!";
-	
-	public B fB;
-	
-	public static void talk(B b) {
-		System.out.println("How are you?");
-	}
-	
-	public void mA1() {
-		fB.mA1(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/out/B.java
deleted file mode 100644
index f23eb1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test5/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-
-	public void mA1(A a) {
-		System.out.println(A.fgHello);
-		A.talk(this);
-		System.out.println(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/in/B.java
deleted file mode 100644
index 7cfa088..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p2;
-public class B {
-	int b;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/in/Nestor.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/in/Nestor.java
deleted file mode 100644
index c4f1649..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/in/Nestor.java
+++ /dev/null
@@ -1,15 +0,0 @@
-// class qualify referenced type name to top level, original receiver not used in method
-package p1;
-
-import p2.B;
-
-public class Nestor {
-	public static class Nestee {
-		public static int fgN;
-	}
-	
-	public void m(B b) {
-		Nestee n= null;
-		int i= Nestee.fgN;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/out/B.java
deleted file mode 100644
index 2e1ba31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p2;
-
-import p1.Nestor;
-
-public class B {
-	int b;
-
-	public void m() {
-		Nestor.Nestee n= null;
-		int i= Nestor.Nestee.fgN;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/out/Nestor.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/out/Nestor.java
deleted file mode 100644
index 4e208f8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test6/out/Nestor.java
+++ /dev/null
@@ -1,14 +0,0 @@
-// class qualify referenced type name to top level, original receiver not used in method
-package p1;
-
-import p2.B;
-
-public class Nestor {
-	public static class Nestee {
-		public static int fgN;
-	}
-	
-	public void m(B b) {
-		b.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/A.java
deleted file mode 100644
index fe0ba31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p1;
-
-import p2.B;
-import p3.N1;
-import p3.N1.N2.N3;
-
-public class A {
-	public void m(B b) {
-		N3 anN3= new N1().new N2().new N3();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/B.java
deleted file mode 100644
index 58042f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p2;
-
-public class B {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/N1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/N1.java
deleted file mode 100644
index b57a23c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/in/N1.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p3;
-
-
-public class N1 {
-	public class N2 {
-		public class N3 {	
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/A.java
deleted file mode 100644
index 65ab6ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p1;
-
-import p2.B;
-import p3.N1;
-import p3.N1.N2.N3;
-
-public class A {
-	public void m(B b) {
-		b.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/B.java
deleted file mode 100644
index 1ce7e6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p2;
-
-import p3.N1;
-import p3.N1.N2;
-import p3.N1.N2.N3;
-
-public class B {
-
-	public void m() {
-		N1.N2.N3 anN3= new N1().new N2().new N3();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/N1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/N1.java
deleted file mode 100644
index b57a23c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test7/out/N1.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p3;
-
-
-public class N1 {
-	public class N2 {
-		public class N3 {	
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/in/A.java
deleted file mode 100644
index e271c38..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	
-	public String foo= "foo";
-	
-	public Object m(B b) {
-		System.out.println(foo);
-		System.out.println(this.foo);
-		System.out.println(b.bar);
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/in/B.java
deleted file mode 100644
index 3ad0a16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/in/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p2;
-
-public class B {
-	public String bar= "bar";
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/out/A.java
deleted file mode 100644
index 6670a84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	
-	public String foo= "foo";
-	
-	public Object m(B b) {
-		return b.m(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/out/B.java
deleted file mode 100644
index 16839c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test8/out/B.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-	public String bar= "bar";
-
-	public Object m(A a) {
-		System.out.println(a.foo);
-		System.out.println(a.foo);
-		System.out.println(bar);
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/in/A.java
deleted file mode 100644
index 2bdc965..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(float j, B b, int foo, String bar) {
-		b.mB1();
-		mA2();
-		b.mB2();
-		System.out.println(this);
-		System.out.println(bar + j);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/out/A.java
deleted file mode 100644
index f10422a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(float j, B b, int foo, String bar) {
-		b.mA1(this, j, foo, bar);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/out/B.java
deleted file mode 100644
index 9eb376c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/canMove/test9/out/B.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p2;
-
-import p1.A;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-
-	public void mA1(A a, float j, int foo, String bar) {
-		mB1();
-		a.mA2();
-		mB2();
-		System.out.println(a);
-		System.out.println(bar + j);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail0/in/IA.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail0/in/IA.java
deleted file mode 100644
index 1687a31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail0/in/IA.java
+++ /dev/null
@@ -1,8 +0,0 @@
-
-package p1;
-
-public interface IA {
-	public void m1A(B b);
-}
-
-class B {}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail1/in/A.java
deleted file mode 100644
index e000705..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail1/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-
-package p1;
-
-public abstract class A {
-	public abstract void m1A(B b);
-}
-
-class B {}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/A.java
deleted file mode 100644
index b43bae7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Move mA1 to parameter b, do not inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	String s= "";
-	public void mA1() {
-		B b= null;
-		b.mB1();
-		mA2(); //test comment
-		b.mB2();
-		System.out.println(this);
-		System.out.println(s);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/C.java
deleted file mode 100644
index 8a5c7bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail10/in/C.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p3;
-
-import p1.A;
-import p2.B;
-
-class C {
-	{
-		A a= new A();
-		a.m1A(new B());
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail11/in/A.java
deleted file mode 100644
index d1b0603..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail11/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-// Move mA1 to parameter b, do not inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1(B b, int a) {
-		mA2();
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail11/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail11/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail11/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail12/in/A.java
deleted file mode 100644
index a5be4d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail12/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-// Move foobar
-package p1;
-class A {
-	
-	void foobar(String param, String param) {
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail2/in/A.java
deleted file mode 100644
index 31063b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail2/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public static int m(B b) {
-		return 0;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail2/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail2/in/B.java
deleted file mode 100644
index c055114..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail2/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2;
-
-public class B {}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail3/in/A.java
deleted file mode 100644
index ca1c37d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail3/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public native int m(B b);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail3/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail3/in/B.java
deleted file mode 100644
index c055114..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail3/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2;
-
-public class B {}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail4/in/A.java
deleted file mode 100644
index 063b593..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail4/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public int foob() {
-		return 1;	
-	}
-	
-	public static Child extends A {
-		public int m(B b) {
-			return super.foob();
-		}
-		
-		public int foob() {
-			return 2;	
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail4/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail4/in/B.java
deleted file mode 100644
index c055114..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail4/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2;
-
-public class B {}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail5/in/A.java
deleted file mode 100644
index 2b87c26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail5/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	
-	public class Inner {
-		public void m(B b) {
-			System.out.println(A.this);
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail5/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail5/in/B.java
deleted file mode 100644
index c055114..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail5/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2;
-
-public class B {}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail6/in/A.java
deleted file mode 100644
index 70f27c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail6/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public int m(B b) {
-		return m(b);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail6/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail6/in/B.java
deleted file mode 100644
index c055114..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail6/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2;
-
-public class B {}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail7/in/A.java
deleted file mode 100644
index 86a42c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail7/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p1;
-
-public class A {
-	public int foo() {
-		class P {
-
-		};		
-		class O {
-			public void m(P p) {
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail8/in/A.java
deleted file mode 100644
index 93c36c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail8/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p1;
-
-import p2.B;
-
-public class A {
-	public synchronized int m(B b) {
-		return 0;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail8/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail8/in/B.java
deleted file mode 100644
index c055114..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail8/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2;
-
-public class B {}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/A.java
deleted file mode 100644
index 4f897f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-// Move mA1 to parameter b, do not inline delegator
-package p1;
-
-import p2.B;
-
-public class A {
-	public void mA1() {
-		B b= null;
-		b.mB1();
-		mA2(); //test comment
-		b.mB2();
-		System.out.println(this);
-	}
-	
-	public void mA2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/B.java
deleted file mode 100644
index e1a2f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-
-public class B {
-	public void mB1() {}
-	
-	public void mB2() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/C.java
deleted file mode 100644
index 8a5c7bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveInstanceMethod/cannotMove/testFail9/in/C.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p3;
-
-import p1.A;
-import p2.B;
-
-class C {
-	{
-		A a= new A();
-		a.m1A(new B());
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/in/A.java
deleted file mode 100644
index ae575ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/out/A.java
deleted file mode 100644
index 14904a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/out/B.java
deleted file mode 100644
index a7dfd85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test0/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/in/A.java
deleted file mode 100644
index 1f85889..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-import java.util.List;
-public class A{
-	public static void m(){
-		List l;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/out/A.java
deleted file mode 100644
index 6ee011b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-import java.util.List;
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/out/B.java
deleted file mode 100644
index ecdc117..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test1/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.List;
-
-class B{
-
-	public static void m(){
-		List l;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/in/A.java
deleted file mode 100644
index ba9f5b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	public static void m(){
-		A.m1();
-	}
-	public static void m1(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/out/A.java
deleted file mode 100644
index a3b5f24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A{
-	public static void m1(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/out/B.java
deleted file mode 100644
index 59958dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test10/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class B{
-
-	public static void m(){
-		A.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/in/A.java
deleted file mode 100644
index 1356107..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static int F;
-	public static void m(){
-		A.F= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/out/A.java
deleted file mode 100644
index 8c30fb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static int F;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/out/B.java
deleted file mode 100644
index a584fbf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test11/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class B{
-
-	public static void m(){
-		A.F= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/in/A.java
deleted file mode 100644
index e59ded1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static int F;
-	public static void m(){
-		F= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/out/A.java
deleted file mode 100644
index 8c30fb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static int F;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/out/B.java
deleted file mode 100644
index a584fbf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test12/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class B{
-
-	public static void m(){
-		A.F= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/in/A.java
deleted file mode 100644
index b2f4a07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-	public static void m(){
-		new A.Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/out/A.java
deleted file mode 100644
index 14c9ee2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/out/B.java
deleted file mode 100644
index e8af359..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test13/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import p.A.Inner;
-
-class B{
-
-	public static void m(){
-		new A.Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/in/A.java
deleted file mode 100644
index ceaccc9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-	public static void m(){
-		new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/out/A.java
deleted file mode 100644
index 14c9ee2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/out/B.java
deleted file mode 100644
index e8af359..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test14/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import p.A.Inner;
-
-class B{
-
-	public static void m(){
-		new A.Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/in/A.java
deleted file mode 100644
index 404ca2e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-public class A{
-	public static int F;
-	public static void m(){
-		F= 0;
-		new A().F= 0;
-		new A().i().F= 0;
-		new A().i().i().F= 0;
-	}
-	A i(){
-		return this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/out/A.java
deleted file mode 100644
index 681c18a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static int F;
-	A i(){
-		return this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/out/B.java
deleted file mode 100644
index 1e82633..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test15/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class B{
-
-	public static void m(){
-		A.F= 0;
-		A.F= 0;
-		A.F= 0;
-		A.F= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/in/A.java
deleted file mode 100644
index 806a299..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-public class A{
-	public static A F;
-	public static void m(){
-		F= null;
-		new A().F= null;
-		new A().i().F= null;
-		new A().i().i().F= null;
-		F.F= null;
-		F.F.F= null;
-	}
-	A i(){
-		return this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/out/A.java
deleted file mode 100644
index a58c4bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static A F;
-	A i(){
-		return this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/out/B.java
deleted file mode 100644
index 1b85e54..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test16/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class B{
-
-	public static void m(){
-		A.F= null;
-		A.F= null;
-		A.F= null;
-		A.F= null;
-		A.F= null;
-		A.F= null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/in/A.java
deleted file mode 100644
index 26178a2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-	public static void m(){
-		Inner[] i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/out/A.java
deleted file mode 100644
index 14c9ee2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/out/B.java
deleted file mode 100644
index 0f8a421..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test17/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import p.A.Inner;
-
-class B{
-
-	public static void m(){
-		A.Inner[] i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/in/A.java
deleted file mode 100644
index cf3588b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-	public static void m(){
-		A.Inner[] i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/out/A.java
deleted file mode 100644
index 14c9ee2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/out/B.java
deleted file mode 100644
index 0f8a421..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test18/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import p.A.Inner;
-
-class B{
-
-	public static void m(){
-		A.Inner[] i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/in/A.java
deleted file mode 100644
index 919c883..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-	public static void m(){
-		Inner[][] i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/out/A.java
deleted file mode 100644
index 14c9ee2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static class Inner{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/out/B.java
deleted file mode 100644
index e2c6f2d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test19/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import p.A.Inner;
-
-class B{
-
-	public static void m(){
-		A.Inner[][] i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/in/A.java
deleted file mode 100644
index f434210..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class A{
-	public static void m(){
-		B.n();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/in/B.java
deleted file mode 100644
index c543866..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/in/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-	public static void n(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/out/A.java
deleted file mode 100644
index 14904a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/out/B.java
deleted file mode 100644
index 10195e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test2/out/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class B{
-	public static void n(){
-	}
-
-	public static void m(){
-		n();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/in/A.java
deleted file mode 100644
index 67de40a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-public class A{
-	public static class F{}
-	public static void m(){
-		A.F[] y;
-		F[] ff;
-		F[ ] ff1;
-		F[][] fff;
-		A.F[][] fff1;
-		p.A.F[ ][ ] fff2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/out/A.java
deleted file mode 100644
index d178a55..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static class F{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/out/B.java
deleted file mode 100644
index 48e422a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test20/out/B.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-import p.A.F;
-
-class B{
-
-	public static void m(){
-		A.F[] y;
-		A.F[] ff;
-		A.F[ ] ff1;
-		A.F[][] fff;
-		A.F[][] fff1;
-		p.A.F[ ][ ] fff2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/in/A.java
deleted file mode 100644
index 51b8561..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A{
-	private static int F;
-	public static int i= F;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/out/A.java
deleted file mode 100644
index 14904a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/out/B.java
deleted file mode 100644
index b2483cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test21/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B{
-
-	private static int F;
-	public static int i= F;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/in/A.java
deleted file mode 100644
index e8c4c79..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A{
-	public static A i;
-	public static A i2;
-	void f(){
-		A.i.i2= null;
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/out/A.java
deleted file mode 100644
index 0869e52..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	public static A i2;
-	void f(){
-		B.i.i2= null;
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/out/B.java
deleted file mode 100644
index aeaac1f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test22/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static A i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/in/A.java
deleted file mode 100644
index 5f59bfb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface A{
-	public static final int FRED= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/in/B.java
deleted file mode 100644
index 3b0ee3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/out/A.java
deleted file mode 100644
index 37ca4f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/out/B.java
deleted file mode 100644
index 836ccc9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test23/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-interface B{
-
-	public static final int FRED= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/in/A.java
deleted file mode 100644
index 446ea60..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface A{
-	public final int FRED= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/in/B.java
deleted file mode 100644
index 3b0ee3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/out/A.java
deleted file mode 100644
index 37ca4f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/out/B.java
deleted file mode 100644
index e11191d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test24/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-interface B{
-
-	public final int FRED= 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/in/A.java
deleted file mode 100644
index 9ba964c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static final int[] FRED= {1};
-	void f(){
-		int i= A.FRED.length;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/in/B.java
deleted file mode 100644
index d110d65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/out/A.java
deleted file mode 100644
index c01e090..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class A{
-	void f(){
-		int i= B.FRED.length;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/out/B.java
deleted file mode 100644
index 59969db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test25/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static final int[] FRED= {1};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/in/A.java
deleted file mode 100644
index 89831ed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.List;
-
-public class A{
-	public static void n(){
-		List l;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/in/B.java
deleted file mode 100644
index 66189b1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package r;
-public class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/out/A.java
deleted file mode 100644
index 3996aa8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-import java.util.List;
-
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/out/B.java
deleted file mode 100644
index 955ab4e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test26/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package r;
-
-import java.util.List;
-
-public class B{
-
-	public static void n(){
-		List l;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/in/A.java
deleted file mode 100644
index df1078e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-public class A{
-	public static void n(){
-	}
-	public static void m() {
-		n();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/in/B.java
deleted file mode 100644
index 66189b1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package r;
-public class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/out/A.java
deleted file mode 100644
index 7a383b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import r.B;
-
-public class A{
-	public static void m() {
-		B.n();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/out/B.java
deleted file mode 100644
index 30e5d69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test27/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package r;
-public class B{
-
-	public static void n(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/in/A.java
deleted file mode 100644
index 73e05e6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A{
-	public static void m() {
-		n();
-	}
-	public static void n() {
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/in/B.java
deleted file mode 100644
index d110d65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/out/A.java
deleted file mode 100644
index a07a93c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/out/B.java
deleted file mode 100644
index be0fd3d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test28/out/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class B{
-
-	public static void m() {
-		n();
-	}
-
-	public static void n() {
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/in/A.java
deleted file mode 100644
index 4599449..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class A {
-	// Garbage code;
-	static void m() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/in/B.java
deleted file mode 100644
index 2558bd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class B {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/out/A.java
deleted file mode 100644
index c75c639..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/out/B.java
deleted file mode 100644
index e3939ea..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test29/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class B {
-
-	// Garbage code;
-	static void m() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/in/A.java
deleted file mode 100644
index e71937a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-	public static void n(){
-		A.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/out/A.java
deleted file mode 100644
index 54263d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class A{
-	public static void n(){
-		B.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/out/B.java
deleted file mode 100644
index a7dfd85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test3/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/in/A.java
deleted file mode 100644
index 4b26b31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A {
-	public final static String id= "Thing.id"; //$NON-NLS-1$
-	public final static String odd= "Thing.odd"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/in/B.java
deleted file mode 100644
index 2558bd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class B {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/out/A.java
deleted file mode 100644
index d961378..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A {
-	public final static String odd= "Thing.odd"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/out/B.java
deleted file mode 100644
index 11e6396..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test30/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class B {
-
-	public final static String id= "Thing.id"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/in/A.java
deleted file mode 100644
index 4b26b31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A {
-	public final static String id= "Thing.id"; //$NON-NLS-1$
-	public final static String odd= "Thing.odd"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/in/B.java
deleted file mode 100644
index 2558bd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class B {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/out/A.java
deleted file mode 100644
index 8c635be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A {
-	public final static String id= "Thing.id"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/out/B.java
deleted file mode 100644
index b145420..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test31/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class B {
-
-	public final static String odd= "Thing.odd"; //$NON-NLS-1$
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test32/in/A.java
deleted file mode 100644
index 66ba095..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test32/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-public class A {
-	
-	static void abc() {
-	}
-	//Garbage code;
-	
-	//Is this comment retained somewhere?
-	
-	static void m() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test32/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test32/in/B.java
deleted file mode 100644
index 2558bd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test32/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class B {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/in/A.java
deleted file mode 100644
index 3d9af8d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface A{
-	public static final int i= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/in/B.java
deleted file mode 100644
index 3e51795..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/out/A.java
deleted file mode 100644
index 9d652f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/out/B.java
deleted file mode 100644
index c542761..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test33/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static final int i= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/in/A.java
deleted file mode 100644
index 304622b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static final int i= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/in/B.java
deleted file mode 100644
index dd7fb19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/out/A.java
deleted file mode 100644
index 4b3bee2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/out/B.java
deleted file mode 100644
index b5e3dad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test34/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-interface B{
-
-	public static final int i= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/in/A.java
deleted file mode 100644
index ce7e368..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface A{
-	public /*static final*/ int i= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/in/B.java
deleted file mode 100644
index 54deb26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class B{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/out/A.java
deleted file mode 100644
index 9d652f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public interface A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/out/B.java
deleted file mode 100644
index 3aaf599..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test35/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class B{
-
-	public /*static final*/ static final int i= 0;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/in/A.java
deleted file mode 100644
index b2bc28c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-public class A {
-	public static class I {
-		public I(I other) {
-			a= new A();
-		}
-		public static class J {
-			static int bla;
-			int x() {return 1;}
-		}
-	}
-	public static A a;
-	public A.I i;
-	{
-		i= new A.I(i);
-		int blub= I.J.bla + new I.J().x();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/in/B.java
deleted file mode 100644
index 54deb26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-public class B{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/out/A.java
deleted file mode 100644
index a879eb8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A {
-	public static A a;
-	public B.I i;
-	{
-		i= new B.I(i);
-		int blub= B.I.J.bla + new B.I.J().x();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/out/B.java
deleted file mode 100644
index 02e64a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test36/out/B.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-public class B{
-
-	public static class I {
-		public I(I other) {
-			A.a= new A();
-		}
-		public static class J {
-			static int bla;
-			int x() {return 1;}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/in/A.java
deleted file mode 100644
index 5135075..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-public class A {
-	Inner i;
-	A.Inner ii;
-	p.A.Inner iii;
-	static class Inner {
-		Inner buddy;
-		public Inner(A.Inner other) {
-			buddy= other;
-		}
-	}
-}
-
-class AA {
-	A.Inner Inner;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/in/B.java
deleted file mode 100644
index c6fcfcb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class B {
-	A.Inner iFromB;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/out/A.java
deleted file mode 100644
index 52a504a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class A {
-	B.Inner i;
-	B.Inner ii;
-	p.B.Inner iii;
-}
-
-class AA {
-	B.Inner Inner;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/out/B.java
deleted file mode 100644
index a8b0d51..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test37/out/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-public class B {
-	static class Inner {
-		Inner buddy;
-		public Inner(B.Inner other) {
-			buddy= other;
-		}
-	}
-
-	B.Inner iFromB;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/in/A.java
deleted file mode 100644
index f5ae055..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-public class A {
-	Inner i;
-	A.Inner ii;
-	p.A.Inner iii;
-	public static class Inner {
-		Inner buddy;
-		public Inner(Inner other) {
-			buddy= other;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/in/B.java
deleted file mode 100644
index a6832f3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package r;
-
-public class B {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/out/A.java
deleted file mode 100644
index 768622d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import r.B;
-
-public class A {
-	B.Inner i;
-	B.Inner ii;
-	r.B.Inner iii;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/out/B.java
deleted file mode 100644
index 1aa9f16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test38/out/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package r;
-
-public class B {
-
-	public static class Inner {
-		Inner buddy;
-		public Inner(Inner other) {
-			buddy= other;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/A.java
deleted file mode 100644
index bfb0de3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-import other.C; //(-import)
-
-public class A {
-	Inner i; //+import r.B.Inner
-	A.Inner ii; //+import r.B
-	p.A.Inner iii;
-	public static int a;
-	public static class Inner { //move to r.B
-		Inner buddy;
-		public Inner(A.Inner other) {
-					// ^ is direct access to enclosing type
-			buddy= C.ii; //+import other.C
-			int ia= a;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/B.java
deleted file mode 100644
index 1d74f75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package r;
-
-import p.A; //(-import)
-import p.A.Inner; //-import (invalid)
-
-public class B {
-	Inner iFromB; //->Inner
-	A.Inner iiFromB; //->Inner
-	p.A.Inner iiiFromB; //->Inner
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/C.java
deleted file mode 100644
index 44dbb1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test39/in/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package other;
-
-import p.A; //(-import)
-
-public class C {
-	public static A.Inner ii; //+import r.B
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/in/A.java
deleted file mode 100644
index d1174c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-	public void n(){
-		A.m();
-		p.A.m();
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/out/A.java
deleted file mode 100644
index 97cb8dd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	public void n(){
-		B.m();
-		p.B.m();
-		B.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/out/B.java
deleted file mode 100644
index a7dfd85..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test4/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/in/A.java
deleted file mode 100644
index b7b65dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A{
-	public static A f;
-	public void n(){
-		f= null;
-		A.f= null;
-		p.A.f= null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/out/A.java
deleted file mode 100644
index 10339d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	public void n(){
-		B.f= null;
-		B.f= null;
-		p.B.f= null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/out/B.java
deleted file mode 100644
index f26b17f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test5/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static A f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/in/A.java
deleted file mode 100644
index 60a03d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A{
-	public static int[] f;
-	public void n(){
-		f[0]= 0;
-		A.f[0]= 0;
-		p.A.f[0]= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/out/A.java
deleted file mode 100644
index 7246887..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	public void n(){
-		B.f[0]= 0;
-		B.f[0]= 0;
-		p.B.f[0]= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/out/B.java
deleted file mode 100644
index 2581158..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test6/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static int[] f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/in/A.java
deleted file mode 100644
index ad38388..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A{
-	public static int f;
-	public void n(){
-		f= 0;
-		A.f= 0;
-		p.A.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/out/A.java
deleted file mode 100644
index add690f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	public void n(){
-		B.f= 0;
-		B.f= 0;
-		p.B.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/out/B.java
deleted file mode 100644
index f2968da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test7/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	public static int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/in/A.java
deleted file mode 100644
index 61c4dc0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static int f;
-	public void n(){
-		f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/in/B.java
deleted file mode 100644
index ce1c83c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package r;
-public class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/out/A.java
deleted file mode 100644
index beed3a9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import r.B;
-
-public class A{
-	public void n(){
-		B.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/out/B.java
deleted file mode 100644
index 555ac4e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test8/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package r;
-public class B{
-
-	public static int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/in/A.java
deleted file mode 100644
index bc333f9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	public static void m(){
-		m1();
-	}
-	public static void m1(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/out/A.java
deleted file mode 100644
index a3b5f24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A{
-	public static void m1(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/out/B.java
deleted file mode 100644
index 59958dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/test9/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class B{
-
-	public static void m(){
-		A.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail0/in/A.java
deleted file mode 100644
index ae575ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail0/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail0/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail0/in/B.java
deleted file mode 100644
index 7f1fd4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail0/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class X{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail1/in/A.java
deleted file mode 100644
index ae575ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail1/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail1/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail1/in/B.java
deleted file mode 100644
index e50e6fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail1/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	class X{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail10/in/A.java
deleted file mode 100644
index e517b90..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail10/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static void m(){
-		A.F= 0;
-	}
-	private static int F;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail10/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail10/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail10/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail11/in/A.java
deleted file mode 100644
index 51b8561..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail11/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A{
-	private static int F;
-	public static int i= F;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail11/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail11/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail11/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail12/in/A.java
deleted file mode 100644
index 551ebad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail12/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A{
-	private static int m(){ return 1;};
-	public static int i= m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail12/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail12/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail12/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail13/in/A.java
deleted file mode 100644
index 551ebad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail13/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A{
-	private static int m(){ return 1;};
-	public static int i= m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail13/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail13/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail13/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail14/in/A.java
deleted file mode 100644
index 470a151..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail14/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-public class A{
-	private static int i;
-	public static int F= i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail14/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail14/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail14/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail15/in/A.java
deleted file mode 100644
index 8dd646c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail15/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static native void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail15/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail15/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail15/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail16/in/A.java
deleted file mode 100644
index 61c4dc0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail16/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static int f;
-	public void n(){
-		f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail16/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail16/in/B.java
deleted file mode 100644
index 8cedd36..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail16/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package r;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail17/in/A.java
deleted file mode 100644
index ae575ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail17/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail17/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail17/in/B.java
deleted file mode 100644
index 7f1fd4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail17/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class X{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail18/in/A.java
deleted file mode 100644
index ae575ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail18/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail18/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail18/in/B.java
deleted file mode 100644
index 7f1fd4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail18/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class X{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail19/in/A.java
deleted file mode 100644
index ae575ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail19/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail19/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail19/in/B.java
deleted file mode 100644
index 3b0ee3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail19/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail2/in/A.java
deleted file mode 100644
index ae575ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail2/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail2/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail2/in/B.java
deleted file mode 100644
index 472d4e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail2/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	public static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail21/in/A.java
deleted file mode 100644
index 77a7078..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail21/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface A{
-	static void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail21/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail21/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail21/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail24/in/A.java
deleted file mode 100644
index 80582ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail24/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface A{
-	public void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail24/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail24/in/B.java
deleted file mode 100644
index 3b0ee3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail24/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail3/in/A.java
deleted file mode 100644
index 8b596a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail3/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(int i, int j){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail3/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail3/in/B.java
deleted file mode 100644
index a32ef23..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail3/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	void m(int i, int j){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail4/in/A.java
deleted file mode 100644
index 8b596a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail4/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(int i, int j){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail4/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail4/in/B.java
deleted file mode 100644
index f5203f8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail4/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	void m(int i, boolean j){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail5/in/A.java
deleted file mode 100644
index 8b596a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail5/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static void m(int i, int j){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail5/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail5/in/B.java
deleted file mode 100644
index 5ad2158..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail5/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	int m(int i, boolean j){ return 0;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail6/in/A.java
deleted file mode 100644
index e329962..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail6/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail6/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail6/in/B.java
deleted file mode 100644
index eb75024..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail6/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	public static int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail7/in/A.java
deleted file mode 100644
index e329962..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail7/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail7/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail7/in/B.java
deleted file mode 100644
index 6956889..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail7/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail8/in/A.java
deleted file mode 100644
index e329962..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail8/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	public static int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail8/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail8/in/B.java
deleted file mode 100644
index 4587b16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail8/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	Object i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail9/in/A.java
deleted file mode 100644
index c328d05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail9/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A{
-	public static void m(){
-		A.f();
-	}
-	private static void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail9/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail9/in/B.java
deleted file mode 100644
index fb99727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MoveMembers/testFail9/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p1/A.java
deleted file mode 100644
index c289c87..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p1/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p1;
-import p2.C;
-public class A{
-	C c;
-	p2.C p2c;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p1/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p1/B.java
deleted file mode 100644
index deb429c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p1/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p1;
-import p2.C;
-public class B{
-	C c;
-	p2.C m(C C, A A){
-		return C;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p2/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p2/C.java
deleted file mode 100644
index 781f2ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/in/p2/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p2;
-import p1.A;
-import p1.*;
-import p1.B;
-public class C{
-	A a;
-	p1.A p1a;
-	B b;
-	p1.B p1B;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/A.java
deleted file mode 100644
index 6a6e418..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p2;
-public class A{
-	C c;
-	p2.C p2c;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/B.java
deleted file mode 100644
index c2b9f89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-public class B{
-	C c;
-	p2.C m(C C, A A){
-		return C;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/C.java
deleted file mode 100644
index 9254329..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test0/out/p2/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p2;
-import p1.*;
-public class C{
-	A a;
-	p2.A p1a;
-	B b;
-	p2.B p1B;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p1/A.java
deleted file mode 100644
index c289c87..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p1/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p1;
-import p2.C;
-public class A{
-	C c;
-	p2.C p2c;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p1/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p1/B.java
deleted file mode 100644
index c8cdd28..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p1/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p1;
-import p2.C;
-public class B{
-	C c;
-	p2.C m(C C, p1.A A){
-		return C;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p2/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p2/C.java
deleted file mode 100644
index 4a660d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/in/p2/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p2;
-import p1.A;
-import p1.*;
-import p1.B;
-public class C{
-	A a;
-	p1.A p1a;
-	B b;
-	p1.B p3B;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/A.java
deleted file mode 100644
index 6a6e418..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p2;
-public class A{
-	C c;
-	p2.C p2c;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/B.java
deleted file mode 100644
index efb2fb9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p2;
-public class B{
-	C c;
-	p2.C m(C C, p2.A A){
-		return C;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/C.java
deleted file mode 100644
index 732913c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test1/out/p2/C.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p2;
-import p1.*;
-public class C{
-	A a;
-	p2.A p1a;
-	B b;
-	p2.B p3B;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p1/A.java
deleted file mode 100644
index 8203d86..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p1/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p1;
-import p2.C;
-public class A{
-	C c;
-	B b;
-	p1.B p1B;
-	p2.C p2c;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p1/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p1/B.java
deleted file mode 100644
index 8bdc298..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p1/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p1;
-import p2.C;
-public class B{
-	C c;
-	p1.A p1A;
-	p2.C m(C C, A A){
-		return C;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p2/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p2/C.java
deleted file mode 100644
index 781f2ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/in/p2/C.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p2;
-import p1.A;
-import p1.*;
-import p1.B;
-public class C{
-	A a;
-	p1.A p1a;
-	B b;
-	p1.B p1B;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p1/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p1/B.java
deleted file mode 100644
index 789a50a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p1/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p1;
-import p2.*;
-import p2.C;
-public class B{
-	C c;
-	p2.A p1A;
-	p2.C m(C C, A A){
-		return C;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p2/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p2/A.java
deleted file mode 100644
index 02251d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p2/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p2;
-import p1.B;
-public class A{
-	C c;
-	B b;
-	p1.B p1B;
-	p2.C p2c;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p2/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p2/C.java
deleted file mode 100644
index 5df9c3c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test2/out/p2/C.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p2;
-import p1.*;
-import p1.B;
-public class C{
-	A a;
-	p2.A p1a;
-	B b;
-	p1.B p1B;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p1/Outer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p1/Outer.java
deleted file mode 100644
index 3a14cd8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p1/Outer.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p1;
-public class Outer {
-    public class Inner1{}
-    public class Inner2{}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p1/empty.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p1/empty.txt
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p1/empty.txt
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p2/empty.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p2/empty.txt
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p2/empty.txt
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p3/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p3/Test.java
deleted file mode 100644
index e2d357d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/in/p3/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p3;
-
-import p1.Outer;
-import p1.Outer.Inner1;
-import p1.Outer.Inner2;
-
-public class Test {
-    Inner1 s;
-    Inner2 i;
-    Outer v;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p1/empty.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p1/empty.txt
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p1/empty.txt
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p2/Outer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p2/Outer.java
deleted file mode 100644
index 9af3bf3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p2/Outer.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p2;
-public class Outer {
-    public class Inner1{}
-    public class Inner2{}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p2/empty.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p2/empty.txt
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p2/empty.txt
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p3/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p3/Test.java
deleted file mode 100644
index 2038873..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/MultiMove/test3/out/p3/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p3;
-
-import p2.Outer;
-import p2.Outer.Inner1;
-import p2.Outer.Inner2;
-
-public class Test {
-    Inner1 s;
-    Inner2 i;
-    Outer v;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/in/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/in/B.java
deleted file mode 100644
index d110d65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/out/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/out/B.java
deleted file mode 100644
index 4371f2c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test0/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-	class A{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/in/A.java
deleted file mode 100644
index 624128b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int y;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/in/B.java
deleted file mode 100644
index d110d65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/out/A.java
deleted file mode 100644
index 624128b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int y;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/out/B.java
deleted file mode 100644
index cdeb008..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test2/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-
-	int y;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/in/A.java
deleted file mode 100644
index e023a32..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-import java.lang.*;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/in/B.java
deleted file mode 100644
index 98313ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-import java.awt.*;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/out/A.java
deleted file mode 100644
index e023a32..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-import java.lang.*;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/out/B.java
deleted file mode 100644
index d446881..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test3/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-import java.awt.*;
-import java.lang.*;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/in/A.java
deleted file mode 100644
index 4bbce3a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void f(){
-	}
-	
-	void f1(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/in/B.java
deleted file mode 100644
index 7a7c5ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-import java.awt.*;
-
-import java.lang.*;
-
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/out/A.java
deleted file mode 100644
index 7134157..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void f(){
-	}
-	
-	void f1(){
-	}
-
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/out/B.java
deleted file mode 100644
index 7a7c5ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/test4/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-import java.awt.*;
-
-import java.lang.*;
-
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources0/in/A.java
deleted file mode 100644
index e578f80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources0/out/A.java
deleted file mode 100644
index cc5f83e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources0/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources1/in/A.java
deleted file mode 100644
index 83dc3ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources1/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-	int f= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources1/out/A.java
deleted file mode 100644
index 8b7570f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources1/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-	int f= 0;
-	int f= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources2/in/A.java
deleted file mode 100644
index ad361e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources2/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-	int f= 0, g= 9;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources2/out/A.java
deleted file mode 100644
index 2501922..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources2/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-	int f= 0, g= 9;
-	int f= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources3/in/A.java
deleted file mode 100644
index 4016c4b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources3/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-	int[] f= null, g[]= null;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources3/out/A.java
deleted file mode 100644
index ea391f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/Paste/testPastingTypedResources3/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-	int[] f= null, g[]= null;
-	int[] f= null;
-	int[] g[]= null;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test0_in.java
deleted file mode 100644
index d24ca4b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test0_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//initialize in method
-class A{
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test0_out.java
deleted file mode 100644
index 0956f75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test0_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//initialize in method
-class A{
-	private int i;
-
-	void f(){
-		i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test10_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test10_in.java
deleted file mode 100644
index 11d4b3d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test10_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//final
-class A{
-	A(){
-	}
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test10_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test10_out.java
deleted file mode 100644
index e6d864f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test10_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//final
-class A{
-	private final int i;
-	A(){
-		i= 0;
-	}
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test11_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test11_in.java
deleted file mode 100644
index 898e5c3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test11_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//public
-class A{
-	A(){
-	}
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test11_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test11_out.java
deleted file mode 100644
index fdd2d2c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test11_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//public
-class A{
-	public int i;
-	A(){
-	}
-	void f(){
-		i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test12_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test12_in.java
deleted file mode 100644
index 0e48d3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test12_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//initialize in method
-class A{
-	static void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test12_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test12_out.java
deleted file mode 100644
index 949b9d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test12_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//initialize in method
-class A{
-	private static int i;
-
-	static void f(){
-		i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test13_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test13_in.java
deleted file mode 100644
index 1e2d00e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test13_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//initialize in method
-class A{
-	static void f(){
-		int i= 0, j= i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test13_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test13_out.java
deleted file mode 100644
index 900f236..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test13_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//initialize in method
-class A{
-	private static int i;
-
-	static void f(){
-		i= 0;
-		int j= i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test14_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test14_in.java
deleted file mode 100644
index b71c0d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test14_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//initialize in method
-class A{
-	static void f(){
-		int j= 0, i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test14_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test14_out.java
deleted file mode 100644
index cb9c1ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test14_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//initialize in method
-class A{
-	private static int i;
-
-	static void f(){
-		int j= 0;
-		i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test15_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test15_in.java
deleted file mode 100644
index 5eefe8e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test15_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//initialize in method
-class A{
-	static void f(){
-		int j= 0, i= 0, k;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test15_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test15_out.java
deleted file mode 100644
index 171daf7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test15_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//initialize in method
-class A{
-	private static int i;
-
-	static void f(){
-		int j= 0;
-		i= 0;
-		int k;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test16_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test16_in.java
deleted file mode 100644
index edcbba6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test16_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	A(){
-		this(5);
-	}
-	A(int u){
-		super();
-	}
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test16_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test16_out.java
deleted file mode 100644
index 3362abc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test16_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	private int i;
-	A(){
-		this(5);
-	}
-	A(int u){
-		super();
-		i= 0;
-	}
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test17_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test17_in.java
deleted file mode 100644
index 690a085..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test17_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		int i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test17_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test17_out.java
deleted file mode 100644
index caea7fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test17_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	private int i;
-
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test18_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test18_in.java
deleted file mode 100644
index 1a2c26a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test18_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	private static class Bar {
-		public void baz() {
-			int i = 0;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test18_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test18_out.java
deleted file mode 100644
index 356cb93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test18_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-class A {
-	private static class Bar {
-		private int i;
-
-		private Bar() {
-			i = 0;
-			// TODO Auto-generated constructor stub
-		}
-
-		public void baz() {
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test19_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test19_in.java
deleted file mode 100644
index 06ba6bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test19_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void someMethod(){
-		int someArray[];
- 	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test19_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test19_out.java
deleted file mode 100644
index 21c0790..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test19_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	private int fSomeArray[];
-
-	void someMethod(){
- 	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test1_in.java
deleted file mode 100644
index 5e7ae68..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test1_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//initialize in declaration
-class A{
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test1_out.java
deleted file mode 100644
index b559013..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test1_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//initialize in declaration
-class A{
-	private int i= 0;
-
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test20_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test20_in.java
deleted file mode 100644
index c6cdd61..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test20_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void someMethod(){
-		double[] doubleDim[];
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test20_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test20_out.java
deleted file mode 100644
index 6245722..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test20_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	private double[] fDoubleDim[];
-
-	void someMethod(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test2_in.java
deleted file mode 100644
index 25302ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test2_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//initialize in constructor
-class A{
-	A(){
-	}
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test2_out.java
deleted file mode 100644
index 7aeefce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test2_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//initialize in constructor
-class A{
-	private int i;
-	A(){
-		i= 0;
-	}
-	void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test3_in.java
deleted file mode 100644
index b6bed8b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test3_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//initialize in constructors
-class A{
-	A(){
-	}
-	A(int e){
-	}
-	void f(){
-		int i= 0;
-		i++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test3_out.java
deleted file mode 100644
index f610888..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test3_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//initialize in constructors
-class A{
-	private int i;
-	A(){
-		i= 0;
-	}
-	A(int e){
-		i= 0;
-	}
-	void f(){
-		i++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test4_in.java
deleted file mode 100644
index 13826ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test4_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//initialize in constructors
-class A{
-	void f(){
-		int i= 0;
-		i++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test4_out.java
deleted file mode 100644
index 8d715a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test4_out.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//initialize in constructors
-class A{
-	private int i;
-
-	/**
-	 * 
-	 */
-	A() {
-		i= 0;
-		// TODO Auto-generated constructor stub
-	}
-
-	void f(){
-		i++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test5_in.java
deleted file mode 100644
index c75b1d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test5_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	void f(){
-		new Object(){
-			void fx(){
-				int i= 0;
-			}	
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test5_out.java
deleted file mode 100644
index d01037b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test5_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	void f(){
-		new Object(){
-			private int i;
-
-			void fx(){
-				i= 0;
-			}	
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test6_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test6_in.java
deleted file mode 100644
index 8a2eb40..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test6_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void f(){
-		new Object(){
-			void fx(){
-				int i= s();
-			}
-			int s(){return 3;}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test6_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test6_out.java
deleted file mode 100644
index 1a269a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test6_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void f(){
-		new Object(){
-			private int i= s();
-			void fx(){
-			}
-			int s(){return 3;}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test7_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test7_in.java
deleted file mode 100644
index 95bd5da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test7_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		int i= 0, j= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test7_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test7_out.java
deleted file mode 100644
index 8493585..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test7_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	private int i= 0;
-
-	void f(){
-		int j= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test8_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test8_in.java
deleted file mode 100644
index 95bd5da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test8_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		int i= 0, j= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test8_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test8_out.java
deleted file mode 100644
index 3117a50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test8_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	private int i;
-
-	void f(){
-		i= 0;
-		int j= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test9_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test9_in.java
deleted file mode 100644
index 871629c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test9_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming
-class A{
-	void f(){
-		int i= 0;
-		i++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test9_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test9_out.java
deleted file mode 100644
index 2c59c6c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/canPromote/A_test9_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming
-class A{
-	private int field;
-
-	void f(){
-		field= 0;
-		field++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail0.java
deleted file mode 100644
index 5017152..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail0.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void f(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail1.java
deleted file mode 100644
index 1e2327d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail1.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void f(){
-		try{
-		} catch (Throwable e){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail2.java
deleted file mode 100644
index 8e18a37..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		class Local{}
-		Local l;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail3.java
deleted file mode 100644
index cb12cb8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail3.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		class Local{}
-		Object l= new Local();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail4.java
deleted file mode 100644
index 6beaca7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail4.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//can't init in constructor - name clash
-class A{
-	A(int i){
-	}
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail5.java
deleted file mode 100644
index 9e9244c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail5.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//name clash
-class A{
-	Object i;
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail6.java
deleted file mode 100644
index 2830bdf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/cannotPromote/A_testFail6.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void f(){
-		int j=0, i= j;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement0.java
deleted file mode 100644
index 3c97977..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement0.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//disabled: none
-class A{
-	void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement1.java
deleted file mode 100644
index b55c0fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//disabled: final, method, field, construcotr
-class A{
-	void f(){
-		int i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement2.java
deleted file mode 100644
index 19b4cf7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//disabled: method, field, constructor, final
-class A{
-	void f(){
-		int i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement3.java
deleted file mode 100644
index 24ebd6d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement3.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//disabled: final
-class A{
-	void f(){
-		int i= 0;
-		i= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement4.java
deleted file mode 100644
index 2ff4177..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement4.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//disabled: constructor
-class A{
-	A(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement5.java
deleted file mode 100644
index 02c6bc1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement5.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//disabled: constructor
-class A{
-	void f(){
-		new Object(){
-			void g(){
-				int i= 0;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement6.java
deleted file mode 100644
index b0eaeb0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement6.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//disabled: constructor, field, method, final
-class A{
-	void f(){
-		new Object(){
-			void g(){
-				int i;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement7.java
deleted file mode 100644
index 153f4dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement7.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//disabled: construcotor
-class A{
-	static void f(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement8.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement8.java
deleted file mode 100644
index f90c359..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement8.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-    void f(){
-        int i= 0;
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement9.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement9.java
deleted file mode 100644
index 7c668e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PromoteTempToField/testEnablement/A_testEnablement9.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-    void f(){
-        int y= 1 +x();
-    }
-    private int x() {
-        return 0;
-    }
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test0/in/A.java
deleted file mode 100644
index 041a067..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test0/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test0/out/A.java
deleted file mode 100644
index 0f7c3de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test0/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-
-	void m() {}	
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test1/in/A.java
deleted file mode 100644
index a678d11..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test1/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	protected void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test1/out/A.java
deleted file mode 100644
index 5db597f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test1/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-	void x(){}
-
-	protected void m() {}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test10/in/A.java
deleted file mode 100644
index 180cd5e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test10/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	protected int j;
-	void a(){}
-}
-
-class B extends A {
-	protected void m() { 
-		super.j++;
-		super.j= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test10/out/A.java
deleted file mode 100644
index 1e7bf5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test10/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	protected int j;
-	void a(){}
-	protected void m() { 
-		this.j++;
-		this.j= 0;
-	}
-}
-
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test11/in/A.java
deleted file mode 100644
index 4a683ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test11/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-class A {
-	int x;
-}
-
-class B extends A {
-	protected void m() { 
-		class T extends A{
-			void t(){
-				super.x++;
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test11/out/A.java
deleted file mode 100644
index f9e0fda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test11/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-class A {
-	int x;
-
-	protected void m() { 
-		class T extends A{
-			void t(){
-				super.x++;
-			}
-		};
-	}
-}
-
-class B extends A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/in/A.java
deleted file mode 100644
index 065bec9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/in/B.java
deleted file mode 100644
index 4b081da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/in/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.io.IOException;
-class B extends A{
-	private void m() throws IOException{
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/out/A.java
deleted file mode 100644
index 80b2d1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.io.IOException;
-
-class A{	
-	void x(){}
-
-	private void m() throws IOException {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/out/B.java
deleted file mode 100644
index 3a04ba7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test12/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-import java.io.IOException;
-class B extends A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test13/in/A.java
deleted file mode 100644
index ac22e50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test13/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A {
-	protected void m() { 
-		new B();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test13/out/A.java
deleted file mode 100644
index 1b932df..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test13/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-
-	protected void m() { 
-		new B();
-	}
-}
-
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test14/in/A.java
deleted file mode 100644
index d98c9e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test14/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class A {
-void g(){
-	g();
-	}
-}
-class B extends A{
-	protected void m(){
-		List l= new ArrayList();
-		l.size();
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test14/out/A.java
deleted file mode 100644
index c10cb8a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test14/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class A {
-void g(){
-	g();
-	}
-
-protected void m() {
-	List l= new ArrayList();
-	l.size();
-}
-}
-class B extends A{	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test15/in/A.java
deleted file mode 100644
index 9ddf60c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test15/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class A {
-}
-class B extends A{
-	public void f(){}
-	void m(){
-		B b= new B();
-		b.f();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test15/out/A.java
deleted file mode 100644
index 82595fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test15/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class A {
-	protected void m(){
-		B b= new B();
-		b.f();
-	}
-
-}
-class B extends A{
-	public void f(){}
-	}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test16/in/A.java
deleted file mode 100644
index 571eeed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test16/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class A {
-}
-class B extends A{
-	public int j= 0;
-	void m(){
-		B b= new B();
-		b.j= 0;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test16/out/A.java
deleted file mode 100644
index 4807b3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test16/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class A {
-	void m(){
-		B b= new B();
-		b.j= 0;
-	}
-}
-class B extends A{
-	public int j= 0;
-	}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test17/in/A.java
deleted file mode 100644
index 1f2875c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test17/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A {
-	void m() { 
-		int i= B.ss();
-	}	
-	public static int ss() { 
-		return 9;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test17/out/A.java
deleted file mode 100644
index 61cb3bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test17/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-public class A {
-	protected void m() { 
-		int i= B.ss();
-	}	
-}
-class B extends A{
-	public static int ss() { 
-		return 9;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test18/in/A.java
deleted file mode 100644
index 35bf67f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test18/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A {
-	void m() { 
-		int i= B.ss;
-	}	
-	public static int ss= 8;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test18/out/A.java
deleted file mode 100644
index f321e72..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test18/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A {
-	protected void m() { 
-		int i= B.ss;
-	}	
-}
-class B extends A{
-	public static int ss= 8;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test19/in/A.java
deleted file mode 100644
index 85e4c69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test19/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-
-class A {
-    void m() {
-        //implementation
-    }
-}
-
-class C extends A {
-}
-
-class B extends C {
-	void m() {
-		super.m();
-		//further implementation
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test19/out/A.java
deleted file mode 100644
index 44db0ed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test19/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-class A {
-    void m() {
-        //implementation
-    }
-}
-
-class C extends A {
-
-	void m() {
-		super.m();
-		//further implementation
-	}
-}
-
-class B extends C {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test2/in/A.java
deleted file mode 100644
index 7c09b1f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test2/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	protected void mmm(){}
-	protected void n(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test2/out/A.java
deleted file mode 100644
index 125f125..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test2/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{	
-	void x(){}
-
-	protected void mmm() {}
-
-	protected void n() {}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test20/in/A.java
deleted file mode 100644
index 847cc24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test20/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-}
-
-class C extends A {
-}
-
-class B extends C {
-	void m() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test20/out/A.java
deleted file mode 100644
index 2259d5f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test20/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-
-	void m() {
-	}
-}
-
-class C extends A {
-}
-
-class B extends C {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test21/in/A.java
deleted file mode 100644
index 88d8f20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test21/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-}
-
-class C extends A {
-}
-
-class B extends C {
-	void m() {
-		super.toString();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test21/out/A.java
deleted file mode 100644
index 41cef98..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test21/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A {
-
-	void m() {
-		super.toString();
-	}
-}
-
-class C extends A {
-}
-
-class B extends C {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test22/in/A.java
deleted file mode 100644
index f9a344d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test22/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-class SuperA{
-	public void m() {
-	}
-}
-class A extends SuperA{
-}
-class B extends A{
-	public void m(){
-	}
-}
-class B1 extends A{
-	public void foo(){
-		A a= null;
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test22/out/A.java
deleted file mode 100644
index e88764d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test22/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class SuperA{
-	public void m() {
-	}
-}
-class A extends SuperA{
-
-	public void m() {
-	}
-}
-class B extends A{
-}
-class B1 extends A{
-	public void foo(){
-		A a= null;
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test23/in/A.java
deleted file mode 100644
index 9c381e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test23/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class SuperA{
-	void x(){}
-}
-class A extends SuperA{
-}
-class B extends A {
-	public void m() { 
-		super.x();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test23/out/A.java
deleted file mode 100644
index c8ddf1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test23/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class SuperA{
-	void x(){}
-}
-class A extends SuperA{
-
-	public void m() { 
-		super.x();
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test24/in/A.java
deleted file mode 100644
index 3682d51..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test24/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	int[] m() throws java.lang.Exception, Throwable{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test24/out/A.java
deleted file mode 100644
index 52640c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test24/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-
-	int[] m() throws java.lang.Exception, Throwable {
-		return null;
-	}	
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test25/in/A.java
deleted file mode 100644
index 12e437e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test25/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	int[] m()[] {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test25/out/A.java
deleted file mode 100644
index 614171e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test25/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-
-	int[] m()[] {
-		return null;
-	}	
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test26/in/A.java
deleted file mode 100644
index b53127f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test26/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	public int[] m()[] {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test26/out/A.java
deleted file mode 100644
index 8729caf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test26/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract int[] m()[];
-}
-class B extends A{
-	public int[] m()[] {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test27/in/A.java
deleted file mode 100644
index d63d4c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test27/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	public int[] m() {
-		return new int[0];
-	}
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test27/out/A.java
deleted file mode 100644
index 9426542..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test27/out/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract int[] m();
-}
-class B extends A{
-	public int[] m() {
-		return new int[0];
-	}
-}
-class C extends A{
-
-	/* (non-Javadoc)
-	 * @see p.A#m()
-	 */
-	public int[] m() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test28/in/A.java
deleted file mode 100644
index c2f357f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test28/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	void m() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test28/out/A.java
deleted file mode 100644
index dd4e49a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test28/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-abstract class A{
-
-	protected abstract void m();
-}
-class B extends A{
-	protected void m() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test29/in/A.java
deleted file mode 100644
index 36aede0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test29/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	public boolean m(int[] a) throws Exception {
-		return true;
-	}
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test29/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test29/out/A.java
deleted file mode 100644
index d036edd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test29/out/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract boolean m(int[] a) throws Exception;
-}
-class B extends A{
-	public boolean m(int[] a) throws Exception {
-		return true;
-	}
-}
-class C extends A{
-
-	/* (non-Javadoc)
-	 * @see p.A#m(int[])
-	 */
-	public boolean m(int[] a) throws Exception {
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test3/in/A.java
deleted file mode 100644
index 6cce546..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test3/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	protected void mmm(){}
-	protected void n(){}
-}
-class C extends A{
-	protected void mmm(){}
-	protected void n(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test3/out/A.java
deleted file mode 100644
index c960ade..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test3/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{	
-	void x(){}
-
-	protected void mmm() {}
-
-	protected void n() {}
-}
-class B extends A{
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test30/in/A.java
deleted file mode 100644
index 59349f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test30/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	public boolean m(int[] a) throws Exception {
-		return true;
-	}
-}
-abstract class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test30/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test30/out/A.java
deleted file mode 100644
index 298c1d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test30/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract boolean m(int[] a) throws Exception;
-}
-class B extends A{
-	public boolean m(int[] a) throws Exception {
-		return true;
-	}
-}
-abstract class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test31/in/A.java
deleted file mode 100644
index c46054b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test31/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	public boolean m(int[] a) throws Exception {
-		return true;
-	}
-}
-class B1 extends B{
-}
-abstract class C extends A{
-}
-class D extends C{
-}
-class D1 extends C{
-}
-class E extends D{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test31/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test31/out/A.java
deleted file mode 100644
index 5e6d331..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test31/out/A.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract boolean m(int[] a) throws Exception;
-}
-class B extends A{
-	public boolean m(int[] a) throws Exception {
-		return true;
-	}
-}
-class B1 extends B{
-}
-abstract class C extends A{
-}
-class D extends C{
-
-	/* (non-Javadoc)
-	 * @see p.A#m(int[])
-	 */
-	public boolean m(int[] a) throws Exception {
-		return false;
-	}
-}
-class D1 extends C{
-
-	/* (non-Javadoc)
-	 * @see p.A#m(int[])
-	 */
-	public boolean m(int[] a) throws Exception {
-		return false;
-	}
-}
-class E extends D{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test32/in/A.java
deleted file mode 100644
index 06e63fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test32/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	public int m() {
-		return 2 +3;
-	}
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test32/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test32/out/A.java
deleted file mode 100644
index 16f8edb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test32/out/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract int m();
-}
-class B extends A{
-	public int m() {
-		return 2 +3;
-	}
-}
-class C extends A{
-
-	/* (non-Javadoc)
-	 * @see p.A#m()
-	 */
-	public int m() {
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test33/in/A.java
deleted file mode 100644
index a395d92..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test33/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-}
-abstract class B extends A{
-	public abstract int m();
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test33/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test33/out/A.java
deleted file mode 100644
index 3618cb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test33/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract int m();
-}
-abstract class B extends A{
-}
-class C extends A{
-
-	/* (non-Javadoc)
-	 * @see p.A#m()
-	 */
-	public int m() {
-		return 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test34/in/A.java
deleted file mode 100644
index 247219c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test34/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	B(){
-		super();
-	}
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test34/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test34/out/A.java
deleted file mode 100644
index 3c715de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test34/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void m();
-}
-class B extends A{
-	B(){
-		super();
-	}
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test35/in/A.java
deleted file mode 100644
index 1bc8be9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test35/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	A(int i){
-		this();
-	}
-	A(){}
-}
-class B extends A{
-	B(){
-		super();
-	}
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test35/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test35/out/A.java
deleted file mode 100644
index fa3b87e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test35/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-abstract class A{
-	A(int i){
-		this();
-	}
-	A(){}
-	public abstract void m();
-}
-class B extends A{
-	B(){
-		super();
-	}
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test36/in/A.java
deleted file mode 100644
index a8009c2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test36/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	public void m() {
-	}
-}
-class B1 extends A{
-	public void m() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test36/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test36/out/A.java
deleted file mode 100644
index d2acbb9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test36/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void m();
-}
-class B extends A{
-	public void m() {
-	}
-}
-class B1 extends A{
-	public void m() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test37/in/A.java
deleted file mode 100644
index 1fdc08c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test37/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	public void m() {
-		f();
-	}
-	public void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test37/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test37/out/A.java
deleted file mode 100644
index b01d2da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test37/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-abstract class A{
-
-	public void m() {
-		f();
-	}
-
-	public abstract void f();
-}
-class B extends A{
-	public void f(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test38/in/A.java
deleted file mode 100644
index 02ea52f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test38/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-
-	public static final int A = 0;
-
-	public static void m() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test38/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test38/out/A.java
deleted file mode 100644
index 8845852..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test38/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-
-	public static final int A = 0;
-
-	public static void m() {
-	}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test39/in/A.java
deleted file mode 100644
index 396f912..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test39/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-
-	public static final int A = 0;
-
-	public static void m() {
-	}
-	
-	public static class X{
-	}
-
-	public static interface Y{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test39/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test39/out/A.java
deleted file mode 100644
index ab200e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test39/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A{
-
-	public static final int A = 0;
-
-	public static void m() {
-	}
-
-	public static class X{
-	}
-
-	public static interface Y{
-	}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/in/A.java
deleted file mode 100644
index 065bec9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/in/B.java
deleted file mode 100644
index 6d9a716..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/in/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-import java.util.List;
-class B extends A{
-	protected void m(List l){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/out/A.java
deleted file mode 100644
index 440cdf4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-import java.util.List;
-
-class A{	
-	void x(){}
-
-	protected void m(List l) {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/out/B.java
deleted file mode 100644
index 5e7bb11..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test4/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-import java.util.List;
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test40/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test40/in/A.java
deleted file mode 100644
index 396e97e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test40/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	public static void m() {
-	}
-}
-class B extends A{
-	public static void m() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test40/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test40/out/A.java
deleted file mode 100644
index 06d012a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test40/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	public static void m() {
-	}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test41/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test41/in/A.java
deleted file mode 100644
index 76a19ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test41/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	int i = 0, j = 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test41/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test41/out/A.java
deleted file mode 100644
index b0177be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test41/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-
-	int i = 0;
-}
-class B extends A{
-	int j = 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test42/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test42/in/A.java
deleted file mode 100644
index 76a19ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test42/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	int i = 0, j = 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test42/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test42/out/A.java
deleted file mode 100644
index a2870a9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test42/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-
-	int i = 0;
-	int j = 1;
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test43/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test43/in/A.java
deleted file mode 100644
index 501ca6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test43/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	/**
-	 * comment
-	 */
-	void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test43/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test43/out/A.java
deleted file mode 100644
index bc542fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test43/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-
-	/**
-	 * comment
-	 */
-	void f() {}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/in/A.java
deleted file mode 100644
index 065bec9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/in/B.java
deleted file mode 100644
index 1124d96..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B extends A{
-	protected void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/out/A.java
deleted file mode 100644
index c197fbd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{	
-	void x(){}
-
-	protected void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/out/B.java
deleted file mode 100644
index ce146be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test5/out/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test6/in/A.java
deleted file mode 100644
index 4d88e03..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test6/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	int x;
-}
-
-class B extends A {
-	protected void m() { 
-		super.x++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test6/out/A.java
deleted file mode 100644
index 9d837d1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test6/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	int x;
-
-	protected void m() { 
-		this.x++;
-	}
-}
-
-class B extends A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test7/in/A.java
deleted file mode 100644
index de2a82f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test7/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-	void a(A a){}
-}
-
-class B extends A {
-	protected void m() { 
-		a(this);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test7/out/A.java
deleted file mode 100644
index 31d68e8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test7/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void a(A a){}
-
-	protected void m() { 
-		a(this);
-	}
-}
-
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test8/in/A.java
deleted file mode 100644
index fde7237..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test8/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-class A {
-	int x;
-}
-
-class B extends A {
-	public void m() { 
-		new B(){
-			void f(){
-				super.x++;
-			}
-		};
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test8/out/A.java
deleted file mode 100644
index b2275d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test8/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-class A {
-	int x;
-
-	public void m() { 
-		new B(){
-			void f(){
-				super.x++;
-			}
-		};
-	}
-}
-
-class B extends A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test9/in/A.java
deleted file mode 100644
index 9d2963f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test9/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void a(){}
-}
-
-class B extends A {
-	public void m() { 
-		super.a();
-		super.a();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test9/out/A.java
deleted file mode 100644
index 7ccfca4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/test9/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-	void a(){}
-
-	public void m() { 
-		this.a();
-		this.a();
-	}
-}
-
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers0/in/A.java
deleted file mode 100644
index b023e99..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers0/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	protected void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers1/in/A.java
deleted file mode 100644
index a120659..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers1/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	protected void m(){ x();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers10/in/A.java
deleted file mode 100644
index 6717c0a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers10/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	public static int foo(){return 1;}
-	protected static int m=  foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers11/in/A.java
deleted file mode 100644
index 2039533..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers11/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	public static int foo(){return 1;}
-	protected int m= foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers12/in/A.java
deleted file mode 100644
index 77a9a17..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers12/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	public int foo(){return 1;}
-	protected int m(){ return foo();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers2/in/A.java
deleted file mode 100644
index 80f72fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers2/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	void x(){}
-	protected void m(){ x();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers3/in/A.java
deleted file mode 100644
index 2b77b08..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers3/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	void y(){}
-	protected void m(){ y();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers4/in/A.java
deleted file mode 100644
index 61ebcb9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers4/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	void y(){m();}
-	protected void m(){ y();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers5/in/A.java
deleted file mode 100644
index d0e65ea..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers5/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	int y= m();
-	protected int m(){ return 9;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers6/in/A.java
deleted file mode 100644
index 0a8008b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers6/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{	
-	void x(){}
-}
-class B extends A{
-	public int hashCode(){return 1;}
-	protected int m(){ return hashCode();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers7/in/A.java
deleted file mode 100644
index 8e06ac7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers7/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	public int foo(){return 1;}
-	protected static int m(){ return new B().foo();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers8/in/A.java
deleted file mode 100644
index c6abedb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers8/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	public static int foo(){return 1;}
-	protected static int m(){ return foo();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers9/in/A.java
deleted file mode 100644
index fdd816d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testAddingRequiredMembers9/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	public int foo(){return 1;}
-	protected static int m= new B().foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement0/in/A.java
deleted file mode 100644
index 501ca6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement0/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-	/**
-	 * comment
-	 */
-	void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement1/in/A.java
deleted file mode 100644
index 5aa988a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement1/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-}
-class D extends A{
-	void f(){}
-}
-class B extends A{
-	/**
-	 * comment
-	 */
-	void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement2/in/A.java
deleted file mode 100644
index 850e580..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement2/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-}
-class Outer{
-	class B extends A{
-		/**
-	 	* comment
-	 	*/
-		void f(){}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement3/in/A.java
deleted file mode 100644
index 9474bd6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testEnablement3/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail0/in/A.java
deleted file mode 100644
index 23fadf3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail0/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A {
-	int x;
-}
-
-class B extends A{
-	int x;
-	void m() { x++; }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail1/in/A.java
deleted file mode 100644
index b382d6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail1/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-	void a(A a){}
-	void a(B b){}
-}
-
-class B extends A {
-	void m() { 
-		a(this);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail10/in/A.java
deleted file mode 100644
index 9e3b26c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail10/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class B extends A {
-	private int a;
-	void m() { 
-		a++;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail10/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail10/in/B.java
deleted file mode 100644
index df913df..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail10/in/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class B extends A {
-	int a;
-	void m() { 
-		a++;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail11/in/A.java
deleted file mode 100644
index 8b7d8d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail11/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail11/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail11/in/B.java
deleted file mode 100644
index 75a13a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail11/in/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class B extends A {
-	class P{};
-	void m() { 
-		P p= new P();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail12/in/A.java
deleted file mode 100644
index 33bf30b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail12/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A {
-	void a(A a){}
-	void a(B b){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail12/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail12/in/B.java
deleted file mode 100644
index 9412a56..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail12/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class B extends A {
-	void m() { 
-		a(this);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail13/in/A.java
deleted file mode 100644
index 9d6c2c9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail13/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class A {
-}
-class B extends A{
-	public void f(){}
-	void m(){
-		f();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail14/in/A.java
deleted file mode 100644
index bdee4cc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail14/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class Bar {
-}
-
-public class A extends Bar {
-	private static class Quux {}
-	public void m() {}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail15/in/A.java
deleted file mode 100644
index ec79222..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail15/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{}
-class C1 extends A{
-	public String toString(){
-		return null;
-	}
-}
-class B extends C1 {
-	public void m() {
-		super.toString();
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail16/in/A.java
deleted file mode 100644
index 1e822c9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail16/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{}
-class C1 extends A{
-	public void m() {
-	}
-}
-class B extends C1 {
-	public void m() {
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail17/in/A.java
deleted file mode 100644
index dba9d49..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail17/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-class A{
-	public void m() {
-	}
-}
-class C2 extends A{
-}
-class C1 extends C2{
-}
-class B extends C1 {
-	public void m() {
-	}
-}
-class B1 extends C1{
-	public void foo() {
-		m();//if you move B.m() to C2 this will result in a different call
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail18/in/A.java
deleted file mode 100644
index d33e6c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail18/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class SuperA{
-	public void m() {
-	}
-}
-class A extends SuperA{
-}
-class B extends A{
-	public void m(){
-	}
-}
-class B1 extends A{
-	public void foo(){
-		m();//if you move B.m() to A this will result in a different call
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail19/in/A.java
deleted file mode 100644
index 4e429c3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail19/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{}
-class C1 extends A{
-	public int a= 0;
-}
-class B extends C1 {
-	public void m() {
-		super.a = 1;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail2/in/A.java
deleted file mode 100644
index 6a2f9f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail2/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A {
-	void m() { 
-		a();
-	}
-	private void a(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail20/in/A.java
deleted file mode 100644
index 86c5955..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail20/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{}
-class B extends A{
-	public void m() {
-	}
-	void f(){
-		A a= new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail21/in/A.java
deleted file mode 100644
index 202a8c9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail21/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	A(){}
-}
-class B extends A{
-	public void m() {
-	}
-	void f(){
-		A a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail22/in/A.java
deleted file mode 100644
index cc2bddd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail22/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-class A{
-	A(int i){}
-}
-class B extends A{
-	B(){
-		super(3);
-	}
-	public void m() {
-	}
-	void f(){
-		A a= new A(4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail23/in/A.java
deleted file mode 100644
index 275728c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail23/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{}
-class B extends A{
-	public void m() {
-	}
-}
-class B1 extends A{
-	private void m() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail24/in/A.java
deleted file mode 100644
index da01190..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail24/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{}
-class B extends A{
-	public void m() {
-	}
-}
-class B1 extends A{
-	public int m() {
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail25/in/A.java
deleted file mode 100644
index ca69911..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail25/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-public class A {
-	class Test{}
-}
-class B extends A{
-	public static class Test {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail26/in/A.java
deleted file mode 100644
index 6317af7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail26/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class Test{
-	static class A {
-	}
-}
-class B extends Test.A{
-	public static class Test {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail27/in/A.java
deleted file mode 100644
index 2e0c50b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail27/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	
-}
-class B extends A{
-	public static class A {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail28/in/A.java
deleted file mode 100644
index 5c99ac2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail28/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class Super{
-	static class A {
-	}
-}
-class B extends Super.A{
-	public static class Test {
-		static class X{
-			class Super{}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail3/in/A.java
deleted file mode 100644
index fbcea3a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail3/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A {
-	private int a;
-	void m() { 
-		a++;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail4/in/A.java
deleted file mode 100644
index 56e7c9f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail4/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A {
-	private class P{};
-	void m() { 
-		P p= new P();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail5/in/A.java
deleted file mode 100644
index aed7a46..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail5/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A {
-	void m() { 
-	}	
-}
-
-class C extends A {
-	void m() { 
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail6/in/A.java
deleted file mode 100644
index 8b7d8d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail6/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail6/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail6/in/B.java
deleted file mode 100644
index 658755a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail6/in/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class B extends A {
-	void m() { 
-		a();
-	}
-	private void a(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail7/in/A.java
deleted file mode 100644
index 9e3b26c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail7/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class B extends A {
-	private int a;
-	void m() { 
-		a++;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail7/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail7/in/B.java
deleted file mode 100644
index c9cedc1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail7/in/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class B extends A {
-	private int a;
-	void m() { 
-		a++;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail8/in/A.java
deleted file mode 100644
index 8b7d8d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail8/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail8/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail8/in/B.java
deleted file mode 100644
index f2f83c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail8/in/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class B extends A {
-	private class P{};
-	void m() { 
-		P p= new P();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail9/in/A.java
deleted file mode 100644
index 8b7d8d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail9/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail9/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail9/in/B.java
deleted file mode 100644
index 81440e6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFail9/in/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class B extends A {
-	void m() { 
-		a();
-	}
-	void a(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFailTemplate/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFailTemplate/in/A.java
deleted file mode 100644
index ff4381d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFailTemplate/in/A.java
+++ /dev/null
@@ -1 +0,0 @@
-package p;
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField0/in/A.java
deleted file mode 100644
index e5ad4e2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField0/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{	
-}
-class B extends A{
-	int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField0/out/A.java
deleted file mode 100644
index 4123128..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField0/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-
-	int i;	
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail0/in/A.java
deleted file mode 100644
index 924c59a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail0/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	int x;	
-}
-
-class B extends A{
-	int x;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail1/in/A.java
deleted file mode 100644
index f3a8c65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail1/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A{
-	int x;
-}
-class C extends A{
-	boolean x;
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail2/in/A.java
deleted file mode 100644
index b12c71d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail2/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{}
-class C1 extends A{
-	public int f= 0;
-}
-class B extends C1 {
-	public int f= 0;
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod0/in/A.java
deleted file mode 100644
index eb9e709..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod0/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A {
-	void m() { 
-		int i= f;
-	}	
-	int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod0/out/A.java
deleted file mode 100644
index 36cdc15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod0/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-
-	void m() { 
-		int i= f;
-	}
-
-	int f;
-}
-
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testTemplate/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testTemplate/in/A.java
deleted file mode 100644
index b23b2d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testTemplate/in/A.java
+++ /dev/null
@@ -1 +0,0 @@
-package p;
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testTemplate/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testTemplate/out/A.java
deleted file mode 100644
index b23b2d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testTemplate/out/A.java
+++ /dev/null
@@ -1 +0,0 @@
-package p;
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test0/in/A.java
deleted file mode 100644
index 05b3f05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test0/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	public void m() {}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test0/out/A.java
deleted file mode 100644
index 5d01caf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test0/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test1/in/A.java
deleted file mode 100644
index 05b3f05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test1/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	public void m() {}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test1/out/A.java
deleted file mode 100644
index dccef83..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test1/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-abstract class A{
-	public abstract void m();
-}
-class B extends A{
-
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test10/in/A.java
deleted file mode 100644
index c8b51b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test10/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	/**
-	 * comment
-	 */
-	public void m() {}
-}
-class B extends A{
-}
-class B1 extends B{
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test10/out/A.java
deleted file mode 100644
index 3c27d67..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test10/out/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-
-	/**
-	 * comment
-	 */
-	public void m() {}
-}
-class B1 extends B{
-}
-class C extends A{
-
-	/**
-	 * comment
-	 */
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test11/in/A.java
deleted file mode 100644
index d925575..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test11/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	/**
-	 * comment
-	 */
-	public void m() {}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test11/out/A.java
deleted file mode 100644
index 3da2ea6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test11/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-
-	/**
-	 * comment
-	 */
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test12/in/A.java
deleted file mode 100644
index c3443c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test12/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-
-	public int f;
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test12/out/A.java
deleted file mode 100644
index 39e2fc7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test12/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-
-	public int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test13/in/A.java
deleted file mode 100644
index 6835bf8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test13/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-
-	public int f, g;
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test13/out/A.java
deleted file mode 100644
index ea77920..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test13/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-
-	public int g;
-}
-class B extends A{
-
-	public int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test14/in/A.java
deleted file mode 100644
index ae28b6d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test14/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-}
-abstract class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test14/out/A.java
deleted file mode 100644
index 8c4eb4b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test14/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-}
-abstract class B extends A{
-
-	public abstract void f();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test15/in/A.java
deleted file mode 100644
index ae28b6d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test15/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-}
-abstract class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test15/out/A.java
deleted file mode 100644
index 67bf01a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test15/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-abstract class A{
-}
-abstract class B extends A{
-
-	public abstract void f();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test16/in/A.java
deleted file mode 100644
index 4dc0f8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test16/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-}
-abstract class B extends A{
-}
-class C extends A{
-	public void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test16/out/A.java
deleted file mode 100644
index 90077a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test16/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-abstract class A{
-}
-abstract class B extends A{
-
-	public abstract void f();
-}
-class C extends A{
-	public void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test17/in/A.java
deleted file mode 100644
index 4dc0f8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test17/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-}
-abstract class B extends A{
-}
-class C extends A{
-	public void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test17/out/A.java
deleted file mode 100644
index 38de40e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test17/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-}
-abstract class B extends A{
-
-	public abstract void f();
-}
-class C extends A{
-	public void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test18/in/A.java
deleted file mode 100644
index 8efa469..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test18/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-
-	public void m() {}
-}
-abstract class B extends A{
-}
-class C extends A{
-	public void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test18/out/A.java
deleted file mode 100644
index 0dd439d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test18/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-abstract class A{
-}
-abstract class B extends A{
-
-	public abstract void f();
-
-	public void m() {}
-}
-class C extends A{
-	public void f(){}
-
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test19/in/A.java
deleted file mode 100644
index 8efa469..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test19/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-
-	public void m() {}
-}
-abstract class B extends A{
-}
-class C extends A{
-	public void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test19/out/A.java
deleted file mode 100644
index b18bb3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test19/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-abstract class A{
-
-	public abstract void f();
-
-	public abstract void m();
-}
-abstract class B extends A{
-
-	public abstract void f();
-
-	public void m() {}
-}
-class C extends A{
-	public void f(){}
-
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test2/in/A.java
deleted file mode 100644
index 993b40b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test2/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-abstract class A{
-	public abstract void m();
-}
-abstract class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test2/out/A.java
deleted file mode 100644
index b925b30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test2/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-abstract class A{
-}
-abstract class B extends A{
-
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/in/A.java
deleted file mode 100644
index 07fe39f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-class A{
-
-	public Collection i;	
-
-	public List f(){ 
-		return null;
-	}
-
-	public Set m(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/in/B.java
deleted file mode 100644
index f6e6d24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/out/A.java
deleted file mode 100644
index 4daef5d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-abstract class A{
-
-	public abstract Set m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/out/B.java
deleted file mode 100644
index 643e241..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test20/out/B.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-class B extends A{
-
-	public Collection i;
-
-	public List f() { 
-		return null;
-	}
-
-	public Set m() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/A.java
deleted file mode 100644
index 4b9e68b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-abstract class A{
-
-	public Collection i;
-
-	public List f() {
-		return null;
-	}
-
-	public abstract Set m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/B.java
deleted file mode 100644
index 1eaac0b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.Set;
-
-class B extends A{
-
-	public Set m() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/C.java
deleted file mode 100644
index e3310af..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/in/C.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-abstract class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/A.java
deleted file mode 100644
index 24a0113..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-abstract class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/B.java
deleted file mode 100644
index 1d7bb00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/B.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-class B extends A{
-
-	public Collection i;
-
-	public Set m() {
-		return null;
-	}
-
-	public List f() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/C.java
deleted file mode 100644
index f41e01c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test21/out/C.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-abstract class C extends A{
-
-	public Collection i;
-
-	public abstract Set m();
-
-	public List f() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test22/in/A.java
deleted file mode 100644
index 864f6c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test22/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-
-	private int bar;
-}
-class B extends A {
-
-	private int x;
-
-	public void fred(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test22/out/A.java
deleted file mode 100644
index 071dddd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test22/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-}
-class B extends A {
-
-	private int x;
-	private int bar;
-
-	public void fred(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test23/in/A.java
deleted file mode 100644
index 68e58be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test23/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-
-	private int bar;
-}
-class B extends A {
-
-	public void fred(){
-	}
-
-	private int x;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test23/out/A.java
deleted file mode 100644
index c78a2d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test23/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-}
-class B extends A {
-
-	public void fred(){
-	}
-
-	private int x;
-	private int bar;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test24/in/A.java
deleted file mode 100644
index f6255cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test24/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-class A {
-	
-	private int foo;
-	
-	private int bar;
-}
-class B extends A {
-	
-	public void fred(){
-	}
-	
-	private int x;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test24/out/A.java
deleted file mode 100644
index e4b5794..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test24/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A {
-}
-class B extends A {
-	
-	public void fred(){
-	}
-	
-	private int x;
-	private int foo;
-	private int bar;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test25/in/A.java
deleted file mode 100644
index 5566cc1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test25/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A {
-	
-	private int bar() {
-		return foo();
-	}
-
-	public int foo() {
-		return 2;
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test25/out/A.java
deleted file mode 100644
index fe6fb48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test25/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-abstract class A {
-	
-	private int bar() {
-		return foo();
-	}
-
-	public abstract int foo();
-}
-class B extends A {
-
-	public int foo() {
-		return 2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test26/in/A.java
deleted file mode 100644
index ce7139f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test26/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-
-	public int bar() {
-		return 1;
-	}
-}
-class B extends A {
-
-	int fred;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test26/out/A.java
deleted file mode 100644
index 13b2870..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test26/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-}
-class B extends A {
-
-	int fred;
-
-	public int bar() {
-		return 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test27/in/A.java
deleted file mode 100644
index 4a05aa4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test27/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-class A {
-
-	public int bar() {
-		return 1;
-	}
-}
-class B extends A {
-
-	public int foo() {
-		return 1;
-	}
-
-	int fred;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test27/out/A.java
deleted file mode 100644
index 0f2c9e8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test27/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-
-class A {
-}
-class B extends A {
-
-	public int foo() {
-		return 1;
-	}
-
-	public int bar() {
-		return 1;
-	}
-
-	int fred;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test28/in/A.java
deleted file mode 100644
index 82126d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test28/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-class A {
-	int i= 0, j= 1;
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test28/out/A.java
deleted file mode 100644
index 995dd10..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test28/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-}
-class B extends A {
-
-	int i = 0;
-	int j = 1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test3/in/A.java
deleted file mode 100644
index d21beda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test3/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	public void m() {}
-}
-class B extends A{
-}
-class B1 extends B{
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test3/out/A.java
deleted file mode 100644
index 3e436c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test3/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-
-	public void m() {}
-}
-class B1 extends B{
-}
-class C extends A{
-
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test4/in/A.java
deleted file mode 100644
index d21beda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test4/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	public void m() {}
-}
-class B extends A{
-}
-class B1 extends B{
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test4/out/A.java
deleted file mode 100644
index 6ed73df..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test4/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-abstract class A{
-	public abstract void m();
-}
-class B extends A{
-
-	public void m() {}
-}
-class B1 extends B{
-}
-class C extends A{
-
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test5/in/A.java
deleted file mode 100644
index aafdd48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test5/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-abstract class A{
-	public abstract void m();
-}
-abstract class B extends A{
-}
-abstract class B1 extends B{
-}
-abstract class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test5/out/A.java
deleted file mode 100644
index 5cf62cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test5/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-abstract class A{
-}
-abstract class B extends A{
-
-	public abstract void m();
-}
-abstract class B1 extends B{
-}
-abstract class C extends A{
-
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test6/in/A.java
deleted file mode 100644
index 993b40b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test6/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-abstract class A{
-	public abstract void m();
-}
-abstract class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test6/out/A.java
deleted file mode 100644
index b46a7c2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test6/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-abstract class A{
-	public abstract void m();
-}
-abstract class B extends A{
-
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test7/in/A.java
deleted file mode 100644
index aafdd48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test7/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-abstract class A{
-	public abstract void m();
-}
-abstract class B extends A{
-}
-abstract class B1 extends B{
-}
-abstract class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test7/out/A.java
deleted file mode 100644
index bea3686..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test7/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-abstract class A{
-	public abstract void m();
-}
-abstract class B extends A{
-
-	public abstract void m();
-}
-abstract class B1 extends B{
-}
-abstract class C extends A{
-
-	public abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test8/in/A.java
deleted file mode 100644
index d925575..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test8/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	/**
-	 * comment
-	 */
-	public void m() {}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test8/out/A.java
deleted file mode 100644
index 60b697a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test8/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-abstract class A{
-	/**
-	 * comment
-	 */
-	public abstract void m();
-}
-class B extends A{
-
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test9/in/A.java
deleted file mode 100644
index c8b51b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test9/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	/**
-	 * comment
-	 */
-	public void m() {}
-}
-class B extends A{
-}
-class B1 extends B{
-}
-class C extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test9/out/A.java
deleted file mode 100644
index 3b8d628..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/test9/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-abstract class A{
-	/**
-	 * comment
-	 */
-	public abstract void m();
-}
-class B extends A{
-
-	public void m() {}
-}
-class B1 extends B{
-}
-class C extends A{
-
-	public void m() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers0/in/A.java
deleted file mode 100644
index d2768ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers0/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//nothing added to m
-package p;
-class A{	
-	protected void m(){}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers1/in/A.java
deleted file mode 100644
index 4e4cdca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers1/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//nothing added to m
-package p;
-class A{	
-	protected void m(){
-		f();
-	}
-	public void f(){}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers2/in/A.java
deleted file mode 100644
index ea76392..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers2/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//nothing added to m
-package p;
-class A{	
-	protected void m(){
-		f();
-	}
-	public static void f(){}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers3/in/A.java
deleted file mode 100644
index 8134178..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers3/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//f added to m
-package p;
-class A{	
-	protected void m(){
-		f();
-	}
-	private void f(){}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers4/in/A.java
deleted file mode 100644
index fff2111..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers4/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//nothing added to m, f
-package p;
-class A{	
-	protected void m(){
-		f();
-	}
-	private void f(){}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers5/in/A.java
deleted file mode 100644
index 2f886b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers5/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//f added to m
-package p;
-class A{	
-	protected void m(){
-		f++;
-	}
-	private int f;
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers6/in/A.java
deleted file mode 100644
index 4ff11d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers6/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//nothing added to m, f
-package p;
-class A{	
-	protected void m(){
-		f++;
-	}
-	private int f;
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers7/in/A.java
deleted file mode 100644
index b016fdf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers7/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//m added to f
-package p;
-class A{	
-	private int m(){
-		return 2;
-	}
-	private int f= m();
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers8/in/A.java
deleted file mode 100644
index 5f9dd72..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers8/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//m added to f
-package p;
-class A{	
-	private int m= 1;
-	private int f= m;
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers9/in/A.java
deleted file mode 100644
index bab8e48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testAddingRequiredMembers9/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//m added to f
-package p;
-class A{	
-	public int m= 1;
-	private int f= m;
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement0/in/A.java
deleted file mode 100644
index 852233b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement0/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	/**
-	 * comment
-	 */
-	void f(){}
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement1/in/A.java
deleted file mode 100644
index 94061ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement1/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement2/in/A.java
deleted file mode 100644
index 0ec26c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement2/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A extends Outer.B{
-}
-class Outer{
-	class B{
-		/**
-	 	* comment
-	 	*/
-		void f(){}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement3/in/A.java
deleted file mode 100644
index 9474bd6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testEnablement3/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-}
-class B extends A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail0/in/A.java
deleted file mode 100644
index 4bad1a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail0/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//do subclasses
-package p;
-
-class A {
-	public void f(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail1/in/A.java
deleted file mode 100644
index 09ab090..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail1/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//interface
-package p;
-
-interface A {
-	public void f();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail10/in/A.java
deleted file mode 100644
index f89d007..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail10/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//pushing foo not possible - referenced by bar
-package p;
-
-class A {
-	
-	private int bar() {
-		return foo();
-	}
-
-	private int foo() {
-		return bar();
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail11/in/A.java
deleted file mode 100644
index 0731d5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail11/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//pushing foo not possible - referenced by bar
-package p;
-
-class A {
-	
-	private int bar= foo();
-
-	private int foo() {
-		return 1;
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail12/in/A.java
deleted file mode 100644
index 6ba6999..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail12/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//pushing bar not possible - referenced by foo
-package p;
-
-class A {
-	
-	private int bar= foo();
-
-	private int foo() {
-		return bar;
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail13/in/A.java
deleted file mode 100644
index cf57b6b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail13/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//abstracting foo not possible - referencing bar
-package p;
-
-class A {
-	
-	private int bar() {
-		return foo();
-	}
-
-	public int foo() {
-		return bar();
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail2/in/A.java
deleted file mode 100644
index 04f3a08..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail2/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//already exists
-package p;
-
-class A {
-	public void f(){}
-}
-class B extends A {
-	public void f(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail3/in/A.java
deleted file mode 100644
index de53f57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail3/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//already exists
-package p;
-
-class A {
-	public int i;
-}
-class B extends A {
-	public int i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail4/in/A.java
deleted file mode 100644
index 1a6357f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail4/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//no access to m() from f
-package p;
-
-class A {
-	public void f(){
-		m();
-	}
-	private void m(){
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail5/in/A.java
deleted file mode 100644
index ac66e65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail5/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//no access to i from f
-package p;
-
-class A {
-	public void f(){
-		i++;
-	}
-	private int i;
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail6/in/A.java
deleted file mode 100644
index 01a263f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail6/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//no access to T from f
-package p;
-
-class A {
-	private static class T{}
-	public T f(){
-		return new T();
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail7/in/A.java
deleted file mode 100644
index 321fb7b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail7/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//making f abstract not possible - calls to A's constructors
-package p;
-
-class A {
-	A(){}
-	public void f(){
-	}
-}
-class B extends A {
-	void g(){
-		A a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail8/in/A.java
deleted file mode 100644
index 665ac2f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail8/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//making f abstract not possible - calls to A's constructors
-package p;
-
-class A {
-	public void f(){
-	}
-}
-class B extends A {
-	void g(){
-		A a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail9/in/A.java
deleted file mode 100644
index be0dcd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PushDown/testFail9/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//pushing f not possible - referenced by getF
-package p;
-
-class A {
-	
-	private int f;
-
-	public int getF() {
-		return f;
-	}
-}
-class B extends A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RefactoringScanner/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RefactoringScanner/A.java
deleted file mode 100644
index 2fb8d0a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RefactoringScanner/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-class A{
-	/**
-	 * TestPattern
-	 * 	 TestPattern
-	 */
-	void f(){
-	}
-	
-	/*
-	 * TestPattern
-	 * 
-	 * 	TestPattern
-	 */
-	void f1(){
-		f1();//TestPattern //org.eclipse.TestPattern
-		String g= "TestPattern";
-		String g2= "org.eclipse.TestPattern";
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RefactoringScanner/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RefactoringScanner/B.java
deleted file mode 100644
index 5e79e3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RefactoringScanner/B.java
+++ /dev/null
@@ -1,21 +0,0 @@
-class B{
-	/**
-	 * TestTestPattern
-	 * 	 TestPattern
-	 */
-	void f(){
-	}
-	
-	/*
-	 * TestTestPattern
-	 * 
-	 * 	TestPattern
-	 */
-	void f1(){
-		f1();//TestPattern //org.eclipse.TestPattern
-		String g= "TestPattern";//TestTestPattern
-		String g2= "org.eclipse.TestPattern";
-		String g3= "org.eclipse.TestPatternMatching";
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test0/in/A.java
deleted file mode 100644
index b350409..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test0/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-class A{
-	public void m(){};
-} 
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test0/out/A.java
deleted file mode 100644
index fcfc86f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test0/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-class A{
-	public void m(){};
-} 
-interface I {
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test1/in/A.java
deleted file mode 100644
index 1ef6f4d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test1/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-class A implements I{
-	public void m(){};
-} 
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test1/out/A.java
deleted file mode 100644
index e34858d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test1/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-class A implements I{
-	public void k(){};
-} 
-interface I {
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test10/in/A.java
deleted file mode 100644
index 4880ef7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test10/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-interface I{
-void m();
-}
-interface I2 extends I{
-}
-interface I3 extends I2{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test10/out/A.java
deleted file mode 100644
index bdfa91e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test10/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-interface I{
-void k();
-}
-interface I2 extends I{
-}
-interface I3 extends I2{
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test11/in/A.java
deleted file mode 100644
index 275bd81..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test11/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-interface I2{
-void m();
-}
-interface I3 extends I, I2{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test11/out/A.java
deleted file mode 100644
index 9c5c52b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test11/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-interface I2{
-void k();
-}
-interface I3 extends I, I2{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test12/in/A.java
deleted file mode 100644
index fb2dbbf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test12/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-interface I2{
-void m();
-}
-interface I3 extends I, I2{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test12/out/A.java
deleted file mode 100644
index 70a291f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test12/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-interface I2{
-void k();
-}
-interface I3 extends I, I2{
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test14/in/A.java
deleted file mode 100644
index 6440b68..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test14/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-	void m();
-}
-interface I1 extends I{
-}
-interface I2 extends I1{
-	void m();
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test14/out/A.java
deleted file mode 100644
index 3cd2392..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test14/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-	void k();
-}
-interface I1 extends I{
-}
-interface I2 extends I1{
-	void k();
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test15/in/A.java
deleted file mode 100644
index a32d285..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test15/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-	void m();
-}
-interface J{
-	void m();
-}
-interface I1 extends I{
-}
-interface J1 extends J{
-}
-interface I2 extends I1, J1{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test15/out/A.java
deleted file mode 100644
index 25c1a19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test15/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-	void k();
-}
-interface J{
-	void k();
-}
-interface I1 extends I{
-}
-interface J1 extends J{
-}
-interface I2 extends I1, J1{
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test16/in/A.java
deleted file mode 100644
index 32d0d0d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test16/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-	void m();
-}
-interface J{
-	void m();
-}
-class C implements I, J{
-	public void m(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test16/out/A.java
deleted file mode 100644
index a98d2fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test16/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-	void k();
-}
-interface J{
-	void k();
-}
-class C implements I, J{
-	public void k(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test17/in/A.java
deleted file mode 100644
index d8b4757..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test17/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-	void m();
-}
-interface J{
-	void m();
-}
-class A{
-	public void m(){};
-}
-class C extends A implements I, J{
-	public void m(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test17/out/A.java
deleted file mode 100644
index dc8dc48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test17/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-	void k();
-}
-interface J{
-	void k();
-}
-class A{
-	public void k(){};
-}
-class C extends A implements I, J{
-	public void k(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test18/in/A.java
deleted file mode 100644
index 75b5aa0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test18/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void m();
-}
-interface J{
-	void m();
-}
-interface J2 extends J{
-	void m();
-}
-
-class A{
-	public void m(){}
-}
-class C extends A implements I, J{
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test18/out/A.java
deleted file mode 100644
index 7f42185..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test18/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void k();
-}
-interface J{
-	void k();
-}
-interface J2 extends J{
-	void k();
-}
-
-class A{
-	public void k(){}
-}
-class C extends A implements I, J{
-	public void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test19/in/A.java
deleted file mode 100644
index 057ee69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test19/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void m();
-}
-interface J{
-	void m();
-}
-interface J2 extends J{
-	void m();
-}
-
-class A{
-	private void m(){}
-}
-class C extends A implements I, J{
-	public void m(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test19/out/A.java
deleted file mode 100644
index fca3cb3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test19/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void k();
-}
-interface J{
-	void k();
-}
-interface J2 extends J{
-	void k();
-}
-
-class A{
-	private void m(){}
-}
-class C extends A implements I, J{
-	public void k(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test2/in/A.java
deleted file mode 100644
index 0211b7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test2/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming I.m to k
-package p;
-class A implements I{
-	public void m(){};
-	public void m(int y){};
-} 
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test2/out/A.java
deleted file mode 100644
index 806e8b1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test2/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming I.m to k
-package p;
-class A implements I{
-	public void k(){};
-	public void m(int y){};
-} 
-interface I {
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test20/in/A.java
deleted file mode 100644
index 4606b91..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test20/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void m();
-}
-interface J{
-	void m();
-}
-interface J2 extends J{
-	void m();
-}
-
-class A{
-	public void m(){}
-}
-class C extends A implements I, J{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test20/out/A.java
deleted file mode 100644
index 0179740..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test20/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void k();
-}
-interface J{
-	void k();
-}
-interface J2 extends J{
-	void k();
-}
-
-class A{
-	public void k(){}
-}
-class C extends A implements I, J{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test21/in/A.java
deleted file mode 100644
index 6637d92..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test21/in/A.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void m();
-}
-interface J{
-	void m();
-}
-interface J2 extends J{
-	void m();
-}
-
-class A{
-	public void m(){};
-}
-class C extends A implements I, J{
-	public void m(){};
-}
-class Test{
-	void k(){
-		I i= new C();
-		i.m();
-		I ii= new I(){
-			public void m(){}
-		};
-		ii.m();
-		J j= new C();
-		j.m();
-		J jj= new J(){
-			public void m(){}
-		};
-		jj.m();
-		A a= new C();
-		((I)a).m();
-		((J)a).m();
-		((C)a).m();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test21/out/A.java
deleted file mode 100644
index d8ecabe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test21/out/A.java
+++ /dev/null
@@ -1,39 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void k();
-}
-interface J{
-	void k();
-}
-interface J2 extends J{
-	void k();
-}
-
-class A{
-	public void k(){};
-}
-class C extends A implements I, J{
-	public void k(){};
-}
-class Test{
-	void k(){
-		I i= new C();
-		i.k();
-		I ii= new I(){
-			public void k(){}
-		};
-		ii.k();
-		J j= new C();
-		j.k();
-		J jj= new J(){
-			public void k(){}
-		};
-		jj.k();
-		A a= new C();
-		((I)a).k();
-		((J)a).k();
-		((C)a).k();
-		a.k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test22/in/A.java
deleted file mode 100644
index bb8601f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test22/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-interface I{
-void m();
-}
-interface I2{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test22/out/A.java
deleted file mode 100644
index 9da5d69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test22/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-interface I{
-void k();
-}
-interface I2{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test24/in/A.java
deleted file mode 100644
index 27496f9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test24/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-interface J{
-}
-interface I extends J{
-void m();
-}
-interface I1 extends J{
-void m();
-}
-interface K extends I, I1{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test24/out/A.java
deleted file mode 100644
index 0a0a465..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test24/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-interface J{
-}
-interface I extends J{
-void k();
-}
-interface I1 extends J{
-void k();
-}
-interface K extends I, I1{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test25/in/A.java
deleted file mode 100644
index ccef3b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test25/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-interface J{
-}
-interface I extends J{
-void m();
-}
-interface I1 extends J{
-void m();
-}
-class C implements I, I1{
-public void m(){}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test25/out/A.java
deleted file mode 100644
index a27964f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test25/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-interface J{
-}
-interface I extends J{
-void k();
-}
-interface I1 extends J{
-void k();
-}
-class C implements I, I1{
-public void k(){}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test26/in/A.java
deleted file mode 100644
index 6b63346..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test26/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface I{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test26/out/A.java
deleted file mode 100644
index d3b3476..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test26/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface I{
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test27/in/A.java
deleted file mode 100644
index 9752fe0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test27/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-interface I{
-void m();
-}
-class A{
-public void m(){};
-}
-class B1 extends A{
-public void m(){};
-}
-class B2 extends A implements I{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test27/out/A.java
deleted file mode 100644
index b3b2478..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test27/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-interface I{
-void k();
-}
-class A{
-public void k(){};
-}
-class B1 extends A{
-public void k(){};
-}
-class B2 extends A implements I{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test28/in/A.java
deleted file mode 100644
index 82ab659..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test28/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-interface I{
-void m();
-}
-class A{
-public void m(){};
-}
-class B1 extends A implements J{
-}
-class B2 extends A implements I{
-}
-interface J{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test28/out/A.java
deleted file mode 100644
index 9104fdc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test28/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-interface I{
-void k();
-}
-class A{
-public void k(){};
-}
-class B1 extends A implements J{
-}
-class B2 extends A implements I{
-}
-interface J{
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test29/in/A.java
deleted file mode 100644
index e1fd825..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test29/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-interface I{
-void m();
-}
-class A{
-public void m(){};
-}
-class B1 extends A implements J{
-}
-class B2 extends A implements I{
-}
-interface J{
-void m();
-}
-class C implements J{
-public void m(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test29/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test29/out/A.java
deleted file mode 100644
index c9b5575..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test29/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-interface I{
-void k();
-}
-class A{
-public void k(){};
-}
-class B1 extends A implements J{
-}
-class B2 extends A implements I{
-}
-interface J{
-void k();
-}
-class C implements J{
-public void k(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test3/in/A.java
deleted file mode 100644
index 4dcd03a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test3/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming I.m to k
-package p;
-class B {
-	public void m(){};
-} 
-class A extends B implements I{
-} 
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test3/out/A.java
deleted file mode 100644
index 240933e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test3/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming I.m to k
-package p;
-class B {
-	public void k(){};
-} 
-class A extends B implements I{
-} 
-interface I {
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test30/in/A.java
deleted file mode 100644
index bfa4f7f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test30/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-interface I{
-void m();
-}
-class A implements I, J{
-public void m(){};
-}
-interface J{
-void m();
-}
-class B implements J, K{
-public void m(){};
-}
-interface K{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test30/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test30/out/A.java
deleted file mode 100644
index 5f224c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test30/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-interface I{
-void k();
-}
-class A implements I, J{
-public void k(){};
-}
-interface J{
-void k();
-}
-class B implements J, K{
-public void k(){};
-}
-interface K{
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test31/in/A.java
deleted file mode 100644
index 0786e6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test31/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-interface I{
-void m();
-}
-class T{
-	void m(){
-		class X implements I{
-			public void m(){}
-		};
-		X x= new X();
-		x.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test31/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test31/out/A.java
deleted file mode 100644
index 6730892..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test31/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-interface I{
-void k();
-}
-class T{
-	void m(){
-		class X implements I{
-			public void k(){}
-		};
-		X x= new X();
-		x.k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test32/in/A.java
deleted file mode 100644
index 4f67f9b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test32/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-interface I{
-void m();
-}
-class T implements I{
-	public void m(){
-		class X implements I{
-			public void m(){}
-		};
-		X x= new X();
-		x.m();
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test32/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test32/out/A.java
deleted file mode 100644
index c1f58ed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test32/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-interface I{
-void k();
-}
-class T implements I{
-	public void k(){
-		class X implements I{
-			public void k(){}
-		};
-		X x= new X();
-		x.k();
-		k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test33/in/A.java
deleted file mode 100644
index 2aedcc3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test33/in/A.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-class A1 implements I, I1{
-public void m(){}
-}
-interface I1{
-void m();
-}
-class A2 implements I1, I2{
-public void m(){}
-}
-interface I2{
-void m();
-}
-class A3 implements I3, I2{
-public void m(){}
-}
-interface I3{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test33/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test33/out/A.java
deleted file mode 100644
index 1facb63..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test33/out/A.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-class A1 implements I, I1{
-public void k(){}
-}
-interface I1{
-void k();
-}
-class A2 implements I1, I2{
-public void k(){}
-}
-interface I2{
-void k();
-}
-class A3 implements I3, I2{
-public void k(){}
-}
-interface I3{
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test34/in/A.java
deleted file mode 100644
index 255c6b9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test34/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-
-class A1 implements I{
-public void m(){}
-}
-interface I1{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test34/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test34/out/A.java
deleted file mode 100644
index 4b8563e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test34/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-
-class A1 implements I{
-public void k(){}
-}
-interface I1{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test35/in/A.java
deleted file mode 100644
index 0b18234..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test35/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-interface I2{
-void m();
-}
-interface I3 extends I, I2{
-}
-class A implements I3{
-public void m(){}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test35/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test35/out/A.java
deleted file mode 100644
index fcbe37b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test35/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-interface I2{
-void k();
-}
-interface I3 extends I, I2{
-}
-class A implements I3{
-public void k(){}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test36/in/A.java
deleted file mode 100644
index 70cb32c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test36/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-interface I2{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test36/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test36/out/A.java
deleted file mode 100644
index d8a8fe0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test36/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-interface I2{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test37/in/A.java
deleted file mode 100644
index 51f4eb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test37/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-interface I2{
-void m();
-}
-interface I3 extends I{
-}
-interface I4 extends I3, I2{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test37/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test37/out/A.java
deleted file mode 100644
index 1feeb67..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test37/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-interface I2{
-void k();
-}
-interface I3 extends I{
-}
-interface I4 extends I3, I2{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test38/in/A.java
deleted file mode 100644
index 5f67be9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test38/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-class A{
-public void m(){}
-}
-class B1 extends A implements I{
-}
-class B2 extends A {
-public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test38/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test38/out/A.java
deleted file mode 100644
index 7ab2e0d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test38/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-class A{
-public void k(){}
-}
-class B1 extends A implements I{
-}
-class B2 extends A {
-public void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test39/in/A.java
deleted file mode 100644
index 51f4eb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test39/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void m();
-}
-interface I2{
-void m();
-}
-interface I3 extends I{
-}
-interface I4 extends I3, I2{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test39/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test39/out/A.java
deleted file mode 100644
index 1feeb67..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test39/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming I.m to k
-package p;
-interface I{
-void k();
-}
-interface I2{
-void k();
-}
-interface I3 extends I{
-}
-interface I4 extends I3, I2{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test4/in/A.java
deleted file mode 100644
index 70d4d12..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test4/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-class B {
-	public void m(){};
-} 
-class A extends B implements I{
-	public void m(){};
-}
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test4/out/A.java
deleted file mode 100644
index e6bd3c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test4/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-class B {
-	public void k(){};
-} 
-class A extends B implements I{
-	public void k(){};
-}
-interface I {
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test40/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test40/in/A.java
deleted file mode 100644
index 6ac8b0e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test40/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-//renaming I.m to k
-interface I{
-	void m();
-}
-interface I2{
-	void m();
-}
-class A{
-}
-class B extends A implements I{
-public void m(){}
-}
-class C extends A implements I2{
-public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test40/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test40/out/A.java
deleted file mode 100644
index 546a461..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test40/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-//renaming I.m to k
-interface I{
-	void k();
-}
-interface I2{
-	void m();
-}
-class A{
-}
-class B extends A implements I{
-public void k(){}
-}
-class C extends A implements I2{
-public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test41/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test41/in/A.java
deleted file mode 100644
index 941088d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test41/in/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-//renaming I.m to k
-interface I{
-	void m();
-}
-interface I2{
-	void m();
-	void k();
-	
-}
-class A{
-}
-class B extends A implements I{
-public void m(){}
-}
-class C extends A implements I2{
-public void m(){}
-public void k(){}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test41/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test41/out/A.java
deleted file mode 100644
index 83eaff0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test41/out/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-//renaming I.m to k
-interface I{
-	void k();
-}
-interface I2{
-	void m();
-	void k();
-	
-}
-class A{
-}
-class B extends A implements I{
-public void k(){}
-}
-class C extends A implements I2{
-public void m(){}
-public void k(){}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test42/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test42/in/A.java
deleted file mode 100644
index 1215395..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test42/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//renaming I.m to k
-interface I{
-	void m();
-}
-interface I2{
-	void m();
-}
-class A{
-public void m(){}
-}
-class B extends A implements I{
-public void m(){}
-}
-class C extends A implements I2{
-public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test42/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test42/out/A.java
deleted file mode 100644
index c0a9e5b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test42/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//renaming I.m to k
-interface I{
-	void k();
-}
-interface I2{
-	void k();
-}
-class A{
-public void k(){}
-}
-class B extends A implements I{
-public void k(){}
-}
-class C extends A implements I2{
-public void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test43/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test43/in/A.java
deleted file mode 100644
index c210562..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test43/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void m();
-}
-class Test{
-	void k(){
-	}
-}
-class C implements I{
-	public void m(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test43/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test43/out/A.java
deleted file mode 100644
index 3945ff4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test43/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void k();
-}
-class Test{
-	void k(){
-	}
-}
-class C implements I{
-	public void k(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test44/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test44/in/A.java
deleted file mode 100644
index df5f328..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test44/in/A.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void m();
-}
-interface J{
-	void m();
-}
-interface J2 extends J{
-	void m();
-}
-
-class A{
-	public void m(){};
-}
-class C extends A implements I, J{
-	public void m(){};
-}
-class Test{
-	void k(){
-	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test44/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test44/out/A.java
deleted file mode 100644
index 3032211..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test44/out/A.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void k();
-}
-interface J{
-	void k();
-}
-interface J2 extends J{
-	void k();
-}
-
-class A{
-	public void k(){};
-}
-class C extends A implements I, J{
-	public void k(){};
-}
-class Test{
-	void k(){
-	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test45/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test45/in/A.java
deleted file mode 100644
index 27ca176..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test45/in/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-//renaming I.m to k
-interface I {
-void m();
-}
-class C1 implements I{
-	public void m(){};
-}
-class D{
-	void h(){
-		I a= new C1();
-		a.m();
-	}
-}
-class NotRel{
-	public void m(){};
-	void f(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test45/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test45/out/A.java
deleted file mode 100644
index af2fc07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test45/out/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-//renaming I.m to k
-interface I {
-void k();
-}
-class C1 implements I{
-	public void k(){};
-}
-class D{
-	void h(){
-		I a= new C1();
-		a.k();
-	}
-}
-class NotRel{
-	public void m(){};
-	void f(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test46/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test46/in/A.java
deleted file mode 100644
index c21e729..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test46/in/A.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//nor ref update
-package p;
-//renaming I.m to k
-interface I {
-void m();
-}
-class C1 implements I{
-	public void m(){};
-}
-class D{
-	void h(){
-		I a= new C1();
-		a.m();
-	}
-}
-class NotRel{
-	public void m(){};
-	void f(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test46/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test46/out/A.java
deleted file mode 100644
index a6285d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test46/out/A.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//nor ref update
-package p;
-//renaming I.m to k
-interface I {
-void k();
-}
-class C1 implements I{
-	public void m(){};
-}
-class D{
-	void h(){
-		I a= new C1();
-		a.m();
-	}
-}
-class NotRel{
-	public void m(){};
-	void f(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test47/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test47/in/A.java
deleted file mode 100644
index 2c113e2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test47/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//renaming I.m to k
-interface I {
-	void m();
-}
-class AQ implements I{
-	public void m(){}
-}
-
-class AQE extends AQ{
-	public void m(){
-		super.m();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test47/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test47/out/A.java
deleted file mode 100644
index 123757e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test47/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//renaming I.m to k
-interface I {
-	void k();
-}
-class AQ implements I{
-	public void k(){}
-}
-
-class AQE extends AQ{
-	public void k(){
-		super.k();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test5/in/A.java
deleted file mode 100644
index b85dfa1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test5/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-class B implements I{
-	public void m(){};
-} 
-class A extends B{
-	public void m(){};
-}
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test5/out/A.java
deleted file mode 100644
index 360aac9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test5/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-class B implements I{
-	public void k(){};
-} 
-class A extends B{
-	public void k(){};
-}
-interface I {
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test6/in/A.java
deleted file mode 100644
index 67da87a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test6/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-class B implements I{
-	public void m(){};
-} 
-class A extends B implements I{
-	public void m(){};
-}
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test6/out/A.java
deleted file mode 100644
index a75f6bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test6/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming I.m to k
-package p;
-class B implements I{
-	public void k(){};
-} 
-class A extends B implements I{
-	public void k(){};
-}
-interface I {
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test7/in/A.java
deleted file mode 100644
index 116b6bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test7/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void m();
-}
-interface I2 extends I{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test7/out/A.java
deleted file mode 100644
index fb57224..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/test7/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-interface I {
-	void k();
-}
-interface I2 extends I{
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail0/in/A.java
deleted file mode 100644
index c3d2d6b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail0/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-	void m();
-}
-class C implements I{
-	public void m(){}
-	public void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail1/in/A.java
deleted file mode 100644
index 7d763a1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail1/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-	void m();
-	void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail10/in/A.java
deleted file mode 100644
index 9c9d766..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail10/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//renaming I.m would require renaming a native method
-class A implements I{
-	public void m(){}
-}
-class B extends A{
-	public native void m();
-}
-interface I{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail11/in/A.java
deleted file mode 100644
index ae2f635..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail11/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//can't rename I.m to k - defined in subclass
-class A implements I{
-	public void m(){}
-}
-class B extends A{
-	public private void k(){}
-}
-interface I{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail12/in/A.java
deleted file mode 100644
index 824918a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail12/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//can't rename m to k - defined in subclass
-class A implements I{
-	public void m(){}
-}
-class B extends A{
-	public void k(){}
-}
-interface I{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail13/in/A.java
deleted file mode 100644
index 0ee357b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail13/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//can't rename m to k - defined in subclass
-class A implements I{
-	public void m(){
-	}
-}
-class B extends A{
-	static void k(){
-	}
-}
-interface I{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail14/in/A.java
deleted file mode 100644
index 3e0eeed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail14/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//can't rename m to k - defined in subclass
-class A implements I{
-	public void m(){
-	}
-}
-class B extends A{
-	private static void k(){
-	}
-}
-interface I{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail15/in/A.java
deleted file mode 100644
index b921f19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail15/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//can't rename A.m to k - defined in superclass
-class B {
-	void k(){
-	}
-}
-class A extends B implements I{
-	public void m(){
-	}
-}
-interface I{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail16/in/A.java
deleted file mode 100644
index 2ad70f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail16/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//can't rename A.m to k - defined in superclass
-class B {
-	static void k(){
-	}
-}
-class A extends B implements I{
-	public void m(){
-	}
-}
-interface I{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail17/in/A.java
deleted file mode 100644
index c4a3e84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail17/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//can't rename A.m to k - defined in superclass
-class B {
-	void k(){
-	}
-}
-class A extends B implements I{
-	public void m(){
-	}
-}
-interface I{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail18/in/A.java
deleted file mode 100644
index 1eddcad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail18/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//can't rename I.m to k - duplicate
-interface I {
-	void m();
-}
-class B implements I{
-	public void m(){}
-	private int k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail19/in/A.java
deleted file mode 100644
index 3b7102c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail19/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename A.m to k - duplicate
-class A implements I{
-	static void k(){}
-	public void m(){
-	}
-}
-interface I{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail20/in/A.java
deleted file mode 100644
index e19b316..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail20/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//can't rename A.m - declared in superclass
-class B {
-	public native void m();
-}
-class A extends B implements I{
-	public void m(){}
-}
-interface I{
-	void m();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail21/in/A.java
deleted file mode 100644
index 3d78d9c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail21/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//can't rename A.m to k
-package p;
-public class A implements I{
-	public void m(String m){
-		System.out.println("A");
-	}
-}
-class B extends A{
-	public void k(Object m){
-		System.out.println("B");
-	}
-}
-interface I{
-void m(String k);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail22/in/A.java
deleted file mode 100644
index f295f57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail22/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//can't rename A.m to k
-package p;
-public class A implements I{
-	public void m(Object m){
-		System.out.println("A");
-	}
-}
-class B extends A{
-	public void k(String m){
-		System.out.println("B");
-	}
-}
-interface I{
-void m(Object s);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail23/in/A.java
deleted file mode 100644
index 32b8728..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail23/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface I{
-	String toString();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail24/in/A.java
deleted file mode 100644
index 694796b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail24/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//can't rename I.m to k
-class B{
-	public void k(){}
-}
-class A extends B implements I{
-	public void m(){}
-}
-interface I{
-	abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail25/in/A.java
deleted file mode 100644
index 05bcab4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail25/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-void m();
-}
-class A{
-public void m(){};
-}
-class B1 extends A implements J{
-		public void k(){}
-}
-class B2 extends A implements I{
-
-}
-interface J{
-void m();
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail26/in/A.java
deleted file mode 100644
index 0e4124e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail26/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-void m();
-}
-class A{
-public void m(){};
-}
-class B1 extends A implements J{
-}
-class B2 extends A implements I{
-}
-interface J{
-void m();
-}
-class C implements J{
-public void m(){};
-public void k(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail27/in/A.java
deleted file mode 100644
index 7d8be81..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail27/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-interface I{
-void m();
-}
-class A implements I, J{
-public void m(){};
-}
-interface J{
-void m();
-}
-class B implements J, K{
-public void m(){};
-public void k(){};
-
-}
-interface K{
-void m();
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail28/in/A.java
deleted file mode 100644
index 4975fe7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail28/in/A.java
+++ /dev/null
@@ -1,25 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-void m();
-}
-class A1 implements I, I1{
-public void m(){}
-}
-interface I1{
-void m();
-}
-class A2 implements I1, I2{
-public void m(){}
-}
-interface I2{
-void m();
-}
-class A3 implements I3, I2{
-public void m(){}
-public void k(){}
-}
-interface I3{
-void m();
-void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail29/in/A.java
deleted file mode 100644
index 0832d75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail29/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-void m();
-}
-class A{
-public void m(){}
-}
-class B1 extends A implements I{
-}
-class B2 extends A {
-public void m(){}
-public void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail3/in/A.java
deleted file mode 100644
index 0dd7ffe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail3/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-	void m();
-}
-class C implements I{
-	public void m();
-	public void k();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail30/in/A.java
deleted file mode 100644
index 9be82b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail30/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//can't rename A.toString
-package p;
-interface I{
-	public java.lang.String toString();
-}
-class A implements I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail31/in/A.java
deleted file mode 100644
index f77d7bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail31/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//can't rename A.toString
-package p;
-interface I{
-	public String toString();
-}
-class A implements I{
-	public java.lang.String toString();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail32/in/A.java
deleted file mode 100644
index 266de81..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail32/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to toString
-//see the spec: 9.2
-package p;
-interface I{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail33/in/A.java
deleted file mode 100644
index 7f62c76..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail33/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to toString
-//see the spec: 9.2
-package p;
-interface I{
-	String m() throws Exception;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail34/in/A.java
deleted file mode 100644
index acdbe6a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail34/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to equals
-//see the lang spec: 9.2
-package p;
-interface I{
-	void m(Object o);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail35/in/A.java
deleted file mode 100644
index 49acc1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail35/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to equals
-//see the lang spec: 9.2
-package p;
-interface I{
-	void m(java.lang.Object o);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail36/in/A.java
deleted file mode 100644
index 66c4eb3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail36/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to getClass
-//see the lang spec: 9.2
-package p;
-interface I{
-	int m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail37/in/A.java
deleted file mode 100644
index 85bfa66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail37/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to hashCode
-//see the lang spec: 9.2
-package p;
-interface I{
-	String m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail38/in/A.java
deleted file mode 100644
index 95dfb37..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail38/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to notify
-//see the lang spec: 9.2
-package p;
-interface I{
-	String m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail39/in/A.java
deleted file mode 100644
index 41a77fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail39/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to notifyAll
-//see the lang spec: 9.2
-package p;
-interface I{
-	String m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail4/in/A.java
deleted file mode 100644
index eaeb936..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail4/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-	void m();
-}
-class C1 {
-	public void k(){}
-}
-class C2 extends C1 implements I{
-	public void m(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail40/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail40/in/A.java
deleted file mode 100644
index 4a86f82..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail40/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to wait
-//see the lang spec: 9.2
-package p;
-interface I{
-	String m(long timeout, int nanos);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail41/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail41/in/A.java
deleted file mode 100644
index 4a022be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail41/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to wait
-//see the lang spec: 9.2
-package p;
-interface I{
-	String m(long timeout) throws InterruptedException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail42/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail42/in/A.java
deleted file mode 100644
index d9c9ece..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail42/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to wait
-//see the lang spec: 9.2
-package p;
-interface I{
-	String m() throws InterruptedException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail43/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail43/in/A.java
deleted file mode 100644
index 0b159e6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail43/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//can't rename m to wait
-//see the lang spec: 9.2
-package p;
-interface I{
-	String m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail44/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail44/in/A.java
deleted file mode 100644
index 0a21f10..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail44/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming I.m to k
-package p;
-interface I extends I2{
-void m();
-}
-interface I2{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail45/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail45/in/A.java
deleted file mode 100644
index 57d503f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail45/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-interface J{
-void m();
-}
-interface I extends J{
-void m();
-}
-interface I1 extends J{
-void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail5/in/A.java
deleted file mode 100644
index ab81c78..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail5/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-	void m();
-}
-class C1 {
-	static void k(){}
-}
-class C2 extends C1 implements I{
-	public void m(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail6/in/A.java
deleted file mode 100644
index 5e1ee21..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail6/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//can't rename I.m to k
-package p;
-interface I{
-	void m();
-}
-class C1 {
-	static void k(){}
-}
-abstract class C2 extends C1 implements I{
-	abstract public void m();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail7/in/A.java
deleted file mode 100644
index 623d316..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail7/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//can't rename I.m to k
-abstract class B{
-	abstract void k();
-}
-class A extends B implements I{
-	public void m(){}
-}
-interface I{
-	public void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail8/in/A.java
deleted file mode 100644
index b0e2291..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail8/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//can't rename I.m to k
-class B{
-	public void k(int x){}
-}
-class A extends B implements I{
-	public void m(int f){}
-}
-interface I{
-	public void m(int y);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail9/in/A.java
deleted file mode 100644
index 25017e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameMethodInInterface/testFail9/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//can't rename m to k
-class C {
-	public void k(){}
-}
-class B extends C{
-}
-class A extends B implements I{
-	public void m(){}
-}
-interface I{
-	public void m();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test0/in/A.java
deleted file mode 100644
index ee6b737..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test0/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test0/out/A.java
deleted file mode 100644
index 539e442..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test0/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test1/in/A.java
deleted file mode 100644
index f31ed22..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test1/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	protected int f;
-	void m(){
-		f++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test1/out/A.java
deleted file mode 100644
index b31f55f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test1/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	protected int g;
-	void m(){
-		g++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test10/in/A.java
deleted file mode 100644
index 47d015c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test10/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	public A f;
-	public int k;
-	void m(){
-		for (int g= 0; g < 10; g++){
-		
-		}
-		f.k=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test10/out/A.java
deleted file mode 100644
index 9701909..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test10/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	public A g;
-	public int k;
-	void m(){
-		for (int g= 0; g < 10; g++){
-		
-		}
-		g.k=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test11/in/A.java
deleted file mode 100644
index 212d616..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test11/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int f;
-}
-class B extends A{
-	A a;
-	void m(){
-		int g= a.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test11/out/A.java
deleted file mode 100644
index 4c6d120..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test11/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int g;
-}
-class B extends A{
-	A a;
-	void m(){
-		int g= a.g;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test12/in/A.java
deleted file mode 100644
index cedb240..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test12/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A {
-	static int f= 0;
-	void m(){
-		A.f= 0; /**/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test12/out/A.java
deleted file mode 100644
index b62dcc2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test12/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A {
-	static int g= 0;
-	void m(){
-		A.g= 0; /**/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test13/in/A.java
deleted file mode 100644
index b2ef453..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test13/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A {
-	static int f= 0;
-	void m(){
-		p.A.f= 0; /**/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test13/out/A.java
deleted file mode 100644
index 83bd4f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test13/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class A {
-	static int g= 0;
-	void m(){
-		p.A.g= 0; /**/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test14/in/A.java
deleted file mode 100644
index 0fe2457..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test14/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//no ref update
-package p;
-public class A {
-	static int f= 0;
-	void m(){
-		p.A.f= 0; /**/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test14/out/A.java
deleted file mode 100644
index 309aa0e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test14/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//no ref update
-package p;
-public class A {
-	static int g= 0;
-	void m(){
-		p.A.f= 0; /**/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test15/in/A.java
deleted file mode 100644
index aa68794..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test15/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//no ref update
-package p;
-public class A {
-	public int f= 0;
-	void m(){
-		f= 0; /**/
-	}
-}
-class B{
-	void m(){
-		new A().f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test15/out/A.java
deleted file mode 100644
index 20f65e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test15/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//no ref update
-package p;
-public class A {
-	public int g= 0;
-	void m(){
-		f= 0; /**/
-	}
-}
-class B{
-	void m(){
-		new A().f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test16/in/A.java
deleted file mode 100644
index 62fd9d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test16/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int f;
-	public int getF() {
-		return (this.f);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test16/out/A.java
deleted file mode 100644
index 4e08471..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test16/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int g;
-	public int getF() {
-		return (this.g);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test2/in/A.java
deleted file mode 100644
index ff87d50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test2/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	int f= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test2/out/A.java
deleted file mode 100644
index c083c1b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test2/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	int g= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test3/in/A.java
deleted file mode 100644
index d084396..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test3/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	protected int f;
-	void m(){
-		f++;
-	}
-}
-class B{
-	A a;
-	void m(){
-		a.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test3/out/A.java
deleted file mode 100644
index 2f10e94..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test3/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	protected int g;
-	void m(){
-		g++;
-	}
-}
-class B{
-	A a;
-	void m(){
-		a.g= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test4/in/A.java
deleted file mode 100644
index 96cfc37..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test4/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	protected int f;
-	void m(){
-		f++;
-	}
-}
-class B extends A{
-	void m(){
-		f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test4/out/A.java
deleted file mode 100644
index 700b2f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test4/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	protected int g;
-	void m(){
-		g++;
-	}
-}
-class B extends A{
-	void m(){
-		g= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test5/in/A.java
deleted file mode 100644
index f6469d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test5/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A{
-	protected int f;
-	void m(){
-		f++;
-	}
-}
-
-class AA extends A{
-	protected int f;
-}
-
-class B{
-	A a;
-	void m(){
-		a.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test5/out/A.java
deleted file mode 100644
index 51818fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test5/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A{
-	protected int g;
-	void m(){
-		g++;
-	}
-}
-
-class AA extends A{
-	protected int f;
-}
-
-class B{
-	A a;
-	void m(){
-		a.g= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test6/in/A.java
deleted file mode 100644
index 6e60f89..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test6/in/A.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package p;
-class A{
-	protected int f;
-	void m(){
-		f++;
-	}
-}
-
-class AA extends A{
-	protected int f;
-}
-
-class B{
-	A a;
-	AA b;
-	A ab= new AA();
-	void m(){
-		a.f= 0;
-		b.f= 0;
-		ab.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test6/out/A.java
deleted file mode 100644
index d730014..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test6/out/A.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package p;
-class A{
-	protected int g;
-	void m(){
-		g++;
-	}
-}
-
-class AA extends A{
-	protected int f;
-}
-
-class B{
-	A a;
-	AA b;
-	A ab= new AA();
-	void m(){
-		a.g= 0;
-		b.f= 0;
-		ab.g= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test7/in/A.java
deleted file mode 100644
index 7553eba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test7/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	int f;
-	void m(int g){
-		this.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test7/out/A.java
deleted file mode 100644
index d332730..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test7/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	int g;
-	void m(int g){
-		this.g= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test8/in/A.java
deleted file mode 100644
index 97e3a36..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test8/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	public A f;
-	public int k;
-	void m(){
-		f.f.f.k=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test8/out/A.java
deleted file mode 100644
index 83a958b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test8/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	public A g;
-	public int k;
-	void m(){
-		g.g.g.k=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test9/in/A.java
deleted file mode 100644
index 5c15dcf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test9/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	public A f;
-	public int k;
-	void m(){
-		{
-			int g;
-		}
-		f.k=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test9/out/A.java
deleted file mode 100644
index 92d20b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/test9/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	public A g;
-	public int k;
-	void m(){
-		{
-			int g;
-		}
-		g.k=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testBug5821/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testBug5821/in/A.java
deleted file mode 100644
index 90c971f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testBug5821/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class A {
-    public int test = 0;
-
-    public static void main(String[] args) {
-        A test = new A();
-
-        test.test = 1;
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testBug5821/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testBug5821/out/A.java
deleted file mode 100644
index 8f2706a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testBug5821/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class A {
-    public int test1 = 0;
-
-    public static void main(String[] args) {
-        A test = new A();
-
-        test.test1 = 1;
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail0/in/A.java
deleted file mode 100644
index 039339c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	int f;
-	private int g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail1/in/A.java
deleted file mode 100644
index 282d63c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail1/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	public int f;
-	public String g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail10/in/A.java
deleted file mode 100644
index b1131d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail10/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	public A f;
-	public int k;
-	void m(){
-		for (int g= 0; g < 10; g++){
-			f.k=0;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail11/in/A.java
deleted file mode 100644
index b263907..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail11/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-class A{
-	int f;
-	void m(){
-		{
-				int g;
-			{
-				{
-					int y= f + 0;
-				}
-			}
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail12/in/A.java
deleted file mode 100644
index 36c9d0d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail12/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	int f;
-	void m(){
-		int g= f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail13/in/A.java
deleted file mode 100644
index b2eb79d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail13/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	int f;
-}
-class B extends A{
-	A a;
-	void m(){
-		int g= f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail14/in/A.java
deleted file mode 100644
index e09468d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail14/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	int f;
-}
-class B extends A{
-	A a;
-	int m(){
-		int g;
-		return f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail2/in/A.java
deleted file mode 100644
index 42161ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail2/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	int f;
-	public static int g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail3/in/A.java
deleted file mode 100644
index a887ae1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail3/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	protected int f;
-	private static int g;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail4/in/A.java
deleted file mode 100644
index e2e3c00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail4/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	public static int f;
-	public Object g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail5/in/A.java
deleted file mode 100644
index 731bb0e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail5/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class B {
-	int g;
-	class A {
-		final int f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail6/in/A.java
deleted file mode 100644
index 2efe7c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail6/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	private int f;
-	class B {
-		public int g;
-	}
-}	
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail7/in/A.java
deleted file mode 100644
index 0ebc1c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail7/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	int f;
-	void m(int g){
-		f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail8/in/A.java
deleted file mode 100644
index f841ee0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail8/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	int f;
-	void m(){
-		Object g;
-		f++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail9/in/A.java
deleted file mode 100644
index 58b9cd4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameNonPrivateField/testFail9/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	public A f;
-	public int k;
-	void m(){
-		A g;
-		f.f.f.k=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test0/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test0/in/r/A.java
deleted file mode 100644
index 96dae97..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test0/in/r/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test0/out/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test0/out/p1/A.java
deleted file mode 100644
index e8654fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test0/out/p1/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test1/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test1/in/r/A.java
deleted file mode 100644
index 362ea30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test1/in/r/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package r;
-class A{
-	r.A a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test1/out/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test1/out/p1/A.java
deleted file mode 100644
index b0933c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test1/out/p1/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p1;
-class A{
-	p1.A a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/in/fred/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/in/fred/A.java
deleted file mode 100644
index 4e91e5a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/in/fred/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package fred;
-import r.*;
-class A{
-	r.A a;
-	A a1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/in/r/A.java
deleted file mode 100644
index 5833a58..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/in/r/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package r;
-public class A{
-	r.A a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/out/fred/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/out/fred/A.java
deleted file mode 100644
index 2fbde2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/out/fred/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package fred;
-import p1.*;
-class A{
-	p1.A a;
-	A a1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/out/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/out/p1/A.java
deleted file mode 100644
index e4cf018..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test2/out/p1/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p1;
-public class A{
-	p1.A a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/in/fred/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/in/fred/A.java
deleted file mode 100644
index bb332c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/in/fred/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package fred;
-import r.r.*;
-class A{
-	r.r.B a;
-	A a1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/in/r/r/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/in/r/r/B.java
deleted file mode 100644
index 8620e84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/in/r/r/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package r.r;
-public class B{
-	r.r.B a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/out/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/out/r/A.java
deleted file mode 100644
index bbc81b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/out/r/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package r;
-import r.r.*;
-class A{
-	r.r.B a;
-	A a1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/out/r/r/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/out/r/r/B.java
deleted file mode 100644
index 8620e84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test3/out/r/r/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package r.r;
-public class B{
-	r.r.B a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/in/r/A.java
deleted file mode 100644
index ebb7363..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/in/r/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r;
-class C{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/in/r/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/in/r/p1/A.java
deleted file mode 100644
index 2878942..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/in/r/p1/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r.p1;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/out/q/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/out/q/A.java
deleted file mode 100644
index 5fbbe5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/out/q/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package q;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/out/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/out/r/A.java
deleted file mode 100644
index ebb7363..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test4/out/r/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r;
-class C{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test5/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test5/in/r/A.java
deleted file mode 100644
index 9307b7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test5/in/r/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//no ref update
-package r;
-class A{
-	r.A d;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test5/out/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test5/out/p1/A.java
deleted file mode 100644
index 4860a3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/test5/out/p1/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//no ref update
-package p1;
-class A{
-	r.A d;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail0/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail0/in/r/A.java
deleted file mode 100644
index 96dae97..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail0/in/r/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail1/in/r/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail1/in/r/p1/A.java
deleted file mode 100644
index 2878942..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail1/in/r/p1/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r.p1;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail10/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail10/in/r/A.java
deleted file mode 100644
index ebb7363..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail10/in/r/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r;
-class C{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail10/in/r/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail10/in/r/p1/A.java
deleted file mode 100644
index 2878942..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail10/in/r/p1/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r.p1;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail11/in/q/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail11/in/q/A.java
deleted file mode 100644
index ebb7363..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail11/in/q/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r;
-class C{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail11/in/q/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail11/in/q/p1/A.java
deleted file mode 100644
index 2878942..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail11/in/q/p1/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r.p1;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail2/in/r/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail2/in/r/p1/A.java
deleted file mode 100644
index 2878942..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail2/in/r/p1/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package r.p1;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail3/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail3/in/r/A.java
deleted file mode 100644
index 2cf2cac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail3/in/r/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package r;
-class A{
-	native void f();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail4/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail4/in/r/A.java
deleted file mode 100644
index ac8b4bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail4/in/r/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package r;
-class A{
-	class B{
-		native void f();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail5/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail5/in/r/A.java
deleted file mode 100644
index e2601f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail5/in/r/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package r;
-public class A{
-	public class B{
-		public static void main(String[] args){
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail6/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail6/in/r/A.java
deleted file mode 100644
index 09f2187..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail6/in/r/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package r;
-class A{
-	public static void main(String[] args){
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail7/in/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail7/in/p1/A.java
deleted file mode 100644
index b6a96e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail7/in/p1/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p1;
-class B{
-	void m(AA fred){
-		r.A.length();
-	}
-}
-class AA{
-	static String A;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail7/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail7/in/r/A.java
deleted file mode 100644
index 323bb3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail7/in/r/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package r;
-public class A{
-	public static int length(){return 42;};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail8/in/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail8/in/p1/A.java
deleted file mode 100644
index e561724..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail8/in/p1/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p1;
-import r.*;
-class B{
-	void m(){
-		r.A a;
-	}
-}
-class fred{
-	class A{};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail8/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail8/in/r/A.java
deleted file mode 100644
index 5ce5e47..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail8/in/r/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package r;
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail9/in/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail9/in/p1/A.java
deleted file mode 100644
index 2c4fd17..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail9/in/p1/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p1;
-class B{
-	native void m(p.A a);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail9/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail9/in/r/A.java
deleted file mode 100644
index 5ce5e47..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testFail9/in/r/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package r;
-public class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testReadOnly/in/r/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testReadOnly/in/r/A.java
deleted file mode 100644
index 9307b7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testReadOnly/in/r/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//no ref update
-package r;
-class A{
-	r.A d;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testReadOnly/out/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testReadOnly/out/p1/A.java
deleted file mode 100644
index 4860a3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePackage/testReadOnly/out/p1/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//no ref update
-package p1;
-class A{
-	r.A d;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_in.java
deleted file mode 100644
index 0519ecb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_in.java
+++ /dev/null
@@ -1 +0,0 @@
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_out.java
deleted file mode 100644
index 0519ecb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_out.java
+++ /dev/null
@@ -1 +0,0 @@
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test0_in.java
deleted file mode 100644
index f99f456..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test0_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test0_out.java
deleted file mode 100644
index a595b24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test0_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int j){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test10_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test10_in.java
deleted file mode 100644
index 35d3439..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test10_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	native void m(int i);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test10_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test10_out.java
deleted file mode 100644
index 58f2f20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test10_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	native void m(int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test11_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test11_in.java
deleted file mode 100644
index eab99a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test11_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//rename to j
-package p;
-class A{
-	int k;
-	void m(int i){
-		A a= new A(){
-			void m(int i){
-				i++;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test11_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test11_out.java
deleted file mode 100644
index 4dc6467..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test11_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//rename to j
-package p;
-class A{
-	int k;
-	void m(int j){
-		A a= new A(){
-			void m(int i){
-				i++;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test12_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test12_in.java
deleted file mode 100644
index ea84baf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test12_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//rename to j
-package p;
-class A{
-	void m(final int i){
-		A a= new A(){
-			void m(int k){
-				k= i;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test12_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test12_out.java
deleted file mode 100644
index f2afa2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test12_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//rename to j
-package p;
-class A{
-	void m(final int j){
-		A a= new A(){
-			void m(int k){
-				k= j;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test13_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test13_in.java
deleted file mode 100644
index 8682f8a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test13_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int i){
-	}
-	void n(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test13_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test13_out.java
deleted file mode 100644
index a706f40..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test13_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int j){
-	}
-	void n(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test14_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test14_in.java
deleted file mode 100644
index 7ee39c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test14_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: j
-package p;
-class A{
-	A i;
-	A m(A i){
-		return i.m(i.m(this.i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test14_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test14_out.java
deleted file mode 100644
index f9d9ef3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test14_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: j
-package p;
-class A{
-	A i;
-	A m(A j){
-		return j.m(j.m(this.i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test15_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test15_in.java
deleted file mode 100644
index 4f56552..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test15_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j, i
-package p;
-class A{
-	int m(int i, int j){
-		return i + j;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test15_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test15_out.java
deleted file mode 100644
index 14f918d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test15_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j, i
-package p;
-class A{
-	int m(int j, int i){
-		return j + i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test16_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test16_in.java
deleted file mode 100644
index b3a0098..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test16_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(int i){
-		class X{
-			int j;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test16_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test16_out.java
deleted file mode 100644
index f14f73b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test16_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(int j){
-		class X{
-			int j;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test17_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test17_in.java
deleted file mode 100644
index ed8c347..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test17_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j, i, k
-package p;
-class A{
-	int l;
-	int m(int i, int j, int k){
-		int m= 0;
-		return i + j + k + l + m;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test17_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test17_out.java
deleted file mode 100644
index 93d3e70..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test17_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j, i, k
-package p;
-class A{
-	int l;
-	int m(int j, int i, int k){
-		int m= 0;
-		return j + i + k + l + m;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test18_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test18_in.java
deleted file mode 100644
index 3e13887..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test18_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(Object i){
-		class j{}
-		i= new j();
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test18_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test18_out.java
deleted file mode 100644
index ffd9994..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test18_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(Object j){
-		class j{}
-		j= new j();
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test19_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test19_in.java
deleted file mode 100644
index 657fe9e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test19_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	A i;
-	void m(A i){
-		i.toString();
-		i.equals(i.toString());
-		i.i.i= i;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test19_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test19_out.java
deleted file mode 100644
index 263cd01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test19_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	A i;
-	void m(A j){
-		j.toString();
-		j.equals(j.toString());
-		j.i.i= j;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test1_in.java
deleted file mode 100644
index 10079c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test1_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int i){
-		i++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test1_out.java
deleted file mode 100644
index dedcb99..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test1_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int j){
-		j++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test20_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test20_in.java
deleted file mode 100644
index 10d3162..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test20_in.java
+++ /dev/null
@@ -1,16 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	Object m(i i){
-		i.i.i= i.i;
-		i:{
-			while(true){
-				break i;
-			}
-		}
-		return i;
-	};
-}
-class i{
-	i i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test20_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test20_out.java
deleted file mode 100644
index d12c537..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test20_out.java
+++ /dev/null
@@ -1,16 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	Object m(i j){
-		j.i.i= j.i;
-		i:{
-			while(true){
-				break i;
-			}
-		}
-		return j;
-	};
-}
-class i{
-	i i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test21_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test21_in.java
deleted file mode 100644
index 7ed06f6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test21_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(int i){
-		A[] o= new A[8];
-		int[] ii= new int[i];
-		for (; i == i;){
-			i++;
-			ii[++i]= i ==7 ? i: i + i;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test21_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test21_out.java
deleted file mode 100644
index 378d1d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test21_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(int j){
-		A[] o= new A[8];
-		int[] ii= new int[j];
-		for (; j == j;){
-			j++;
-			ii[++j]= j ==7 ? j: j + j;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test22_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test22_in.java
deleted file mode 100644
index 3358054..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test22_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int i;
-	void m(int i){
-		int u= i + this.i;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test22_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test22_out.java
deleted file mode 100644
index b6bb716..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test22_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int i;
-	void m(int j){
-		int u= j + this.i;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test23_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test23_in.java
deleted file mode 100644
index 8a8dec2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test23_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j, i
-package p;
-class A{
-	int j;
-	int m(final int i, int j){
-		return i + j;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test23_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test23_out.java
deleted file mode 100644
index b6a9dd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test23_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j, i
-package p;
-class A{
-	int j;
-	int m(final int j, int i){
-		return j + i;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test24_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test24_in.java
deleted file mode 100644
index 1fa6d29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test24_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int i;
-	void m(int i){
-		this.i= i;
-	};
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test24_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test24_out.java
deleted file mode 100644
index a2134c9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test24_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int i;
-	void m(int j){
-		this.i= j;
-	};
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test25_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test25_in.java
deleted file mode 100644
index 368e29e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test25_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(int i){
-		return i + m(m(i));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test25_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test25_out.java
deleted file mode 100644
index 4ade063..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test25_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(int j){
-		return j + m(m(j));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test26_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test26_in.java
deleted file mode 100644
index 415fcdd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test26_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(int i){
-		new A(){
-			int m(int i){
-				return i;
-			}
-		};
-		return i + m(m(i));
-	};
-}   
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test26_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test26_out.java
deleted file mode 100644
index 7ca75e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test26_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(int j){
-		new A(){
-			int m(int i){
-				return i;
-			}
-		};
-		return j + m(m(j));
-	};
-}   
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test27_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test27_in.java
deleted file mode 100644
index bece931..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test27_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(final int i){
-		new A(){
-			int m(int o){
-				return i;
-			}
-		};
-		return i + m(m(i));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test27_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test27_out.java
deleted file mode 100644
index c25cf40..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test27_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(final int j){
-		new A(){
-			int m(int o){
-				return j;
-			}
-		};
-		return j + m(m(j));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test28_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test28_in.java
deleted file mode 100644
index 5e4af90..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test28_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int m(int[] i){
-		i[0]= 0;
-		return 1;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test28_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test28_out.java
deleted file mode 100644
index 3f4716c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test28_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int m(int[] j){
-		j[0]= 0;
-		return 1;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test29_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test29_in.java
deleted file mode 100644
index 69716a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test29_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to b
-package p;
-class A{
-   A A;
-   A m(A A){
-     A:
-        for (;;){
-          if (A.m(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test29_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test29_out.java
deleted file mode 100644
index bcd70c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test29_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to b
-package p;
-class A{
-   A A;
-   A m(A b){
-     A:
-        for (;;){
-          if (b.m(b)==b)
-             break A;
-        }
-      return b;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test2_in.java
deleted file mode 100644
index 3ce000b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test2_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//rename to: j, k
-package p;
-class A{
-	void m(int i, int k){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test2_out.java
deleted file mode 100644
index 2e49b16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test2_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//rename to: j, k
-package p;
-class A{
-	void m(int j, int k){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test30_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test30_in.java
deleted file mode 100644
index e4ad09f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test30_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming to i, k
-package p;
-class A{
-	private void m(final int i, int j){
-		class J{
-			int k;
-			void k(){
-				k= k;
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test30_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test30_out.java
deleted file mode 100644
index 9ee3399..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test30_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming to i, k
-package p;
-class A{
-	private void m(final int i, int k){
-		class J{
-			int k;
-			void k(){
-				k= k;
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test31_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test31_in.java
deleted file mode 100644
index a4e0e9e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test31_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming to kk, j
-package p;
-class A{
-	private void m(final int i, int j){
-		new Object(){
-			int kk;
-			void fred(){
-				kk= 0;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test31_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test31_out.java
deleted file mode 100644
index 8f95274..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test31_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming to kk, j
-package p;
-class A{
-	private void m(final int kk, int j){
-		new Object(){
-			int kk;
-			void fred(){
-				kk= 0;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test32_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test32_in.java
deleted file mode 100644
index 275aaf9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test32_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	A(int i){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test32_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test32_out.java
deleted file mode 100644
index 5516e0b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test32_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	A(int j){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test33_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test33_in.java
deleted file mode 100644
index 9fffecf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test33_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to b, no ref update
-package p;
-class A{
-   A A;
-   A m(A A){
-     A:
-        for (;;){
-          if (A.m(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test33_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test33_out.java
deleted file mode 100644
index 33fdb83..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test33_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to b, no ref update
-package p;
-class A{
-   A A;
-   A m(A b){
-     A:
-        for (;;){
-          if (A.m(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test34_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test34_in.java
deleted file mode 100644
index bf71a37..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test34_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	public void m(boolean test) {
-        boolean t= (test);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test34_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test34_out.java
deleted file mode 100644
index 87bf3d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test34_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	public void m(boolean test2) {
-        boolean t= (test2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test35_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test35_in.java
deleted file mode 100644
index b9b24c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test35_in.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A{
-	/**
-	 * @param i
-	 */
-	void m(int i){
-	}
-	
-	/**
-	 * @param i
-	 */
-	void m1(int i){
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test35_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test35_out.java
deleted file mode 100644
index 6ae1707..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test35_out.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A{
-	/**
-	 * @param j
-	 */
-	void m(int j){
-	}
-	
-	/**
-	 * @param i
-	 */
-	void m1(int i){
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test36_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test36_in.java
deleted file mode 100644
index fbabcd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test36_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	//
-	void m(int i){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test36_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test36_out.java
deleted file mode 100644
index a6dc3d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test36_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	//
-	void m(int j){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test3_in.java
deleted file mode 100644
index 7676ba8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test3_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: j, j1
-package p;
-class A{
-	int m(int i, int k){
-		{
-			return i + k;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test3_out.java
deleted file mode 100644
index d1f6340..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test3_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: j, j1
-package p;
-class A{
-	int m(int j, int j1){
-		{
-			return j + j1;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test4_in.java
deleted file mode 100644
index f607274..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test4_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: k
-package p;
-class A{
-	int k;
-	void m(A i){
-		i.k= i.k;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test4_out.java
deleted file mode 100644
index 4e4b4c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test4_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: k
-package p;
-class A{
-	int k;
-	void m(A k){
-		k.k= k.k;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test5_in.java
deleted file mode 100644
index 99ea05e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test5_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: k
-package p;
-class A{
-	int i;
-	void m(int i){
-		this.i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test5_out.java
deleted file mode 100644
index b4d2054..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test5_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: k
-package p;
-class A{
-	int i;
-	void m(int k){
-		this.i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test6_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test6_in.java
deleted file mode 100644
index efa9a84..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test6_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to k
-package p;
-class A{
-	void m(int i){
-		m(i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test6_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test6_out.java
deleted file mode 100644
index 4dc489d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test6_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to k
-package p;
-class A{
-	void m(int k){
-		m(k);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test7_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test7_in.java
deleted file mode 100644
index 66d473e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test7_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//rename to k
-package p;
-class B{
-	int i;
-}
-class A extends B{
-	void m(A i){
-		super.i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test7_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test7_out.java
deleted file mode 100644
index 22e4796..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test7_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//rename to k
-package p;
-class B{
-	int i;
-}
-class A extends B{
-	void m(A k){
-		super.i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test8_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test8_in.java
deleted file mode 100644
index e458281..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test8_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-abstract class A{
-	abstract void m(int i);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test8_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test8_out.java
deleted file mode 100644
index c7cc090..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test8_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-abstract class A{
-	abstract void m(int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test9_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test9_in.java
deleted file mode 100644
index 181663e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test9_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-interface A{
-	void m(int i);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test9_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test9_out.java
deleted file mode 100644
index 39e113f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/canRename/A_test9_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-interface A{
-	void m(int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail0.java
deleted file mode 100644
index 65d173b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail0.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	void m(final int i){
-		class X{
-			int j;
-			void m(){
-				j= i;
-			}
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail1.java
deleted file mode 100644
index 4347583..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail1.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//nothing to rename
-package p;
-class A{
-	void m(){
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail10.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail10.java
deleted file mode 100644
index 536d555..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail10.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//cannot rename to: j, j
-package p;
-abstract class A{
-	abstract void m(int i, int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail11.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail11.java
deleted file mode 100644
index 275aadd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail11.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//cannot rename to: j, j
-package p;
-interface A{
-	 void m(int i, int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail12.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail12.java
deleted file mode 100644
index 6327219..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail12.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//cannot rename to j
-package p;
-class A{
-	void m(final int i){
-		A a= new A(){
-			void m(int j){
-				i++;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail13.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail13.java
deleted file mode 100644
index 14ecb4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail13.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//cannot rename to j
-package p;
-class A{
-	int j;
-	void m(int i){
-		j= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail14.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail14.java
deleted file mode 100644
index 78a687f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail14.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//cannot rename to j
-package p;
-class A{
-	int k;
-	static class j{
-		static int k;
-	}
-	void m(A i){
-		j.k= 0;
-	}
-}	
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail15.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail15.java
deleted file mode 100644
index 259c6a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail15.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	void m(int i){
-		for (int j= 0; j < 10; j++){
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail16.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail16.java
deleted file mode 100644
index dc723dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail16.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	void m(int i){
-		for (int k= 0, j= 0;;) {
-		}
-		
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail17.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail17.java
deleted file mode 100644
index 7b7cb27..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail17.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	void m(int i){
-		try{
-			m(1);
-		}
-		catch (Throwable j){
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail18.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail18.java
deleted file mode 100644
index 64c7495..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail18.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	String j;
-	void m(int i){
-		j.toString();	
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail19.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail19.java
deleted file mode 100644
index ea734b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail19.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//cannot rename to: j
-package p;
-class B{
-	int j;
-}
-class A extends B{
-	void m(int i){
-		j= 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail2.java
deleted file mode 100644
index 258a47d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//cannot rename to i, i
-package p;
-class A{
-	int m(int i, int j){
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail20.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail20.java
deleted file mode 100644
index 9022b40..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail20.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//cannot rename to: j
-package p;
-interface B{
-	int j= 0;
-}
-class A implements B{
-	void m(int i){
-		int y= j;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail21.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail21.java
deleted file mode 100644
index 98aa351..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail21.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(final int i){
-		new A(){
-			int m(int o){
-				return i;
-			}
-		};
-		return i + m(m(i));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail3.java
deleted file mode 100644
index 549fe00..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail3.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//cannot rename to: i, 9
-package p;
-class A{
-	int m(int i, int j){
-			return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail4.java
deleted file mode 100644
index ce47b19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail4.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	int m(int i){
-		int j;
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail5.java
deleted file mode 100644
index a0397a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail5.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	int m(int i){
-		{
-			int j;
-		}
-				return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail6.java
deleted file mode 100644
index fe77c6b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail6.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	int m(final int i){
-		class X{
-			int j;
-			void m(){
-				j= i;
-			}
-		}
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail7.java
deleted file mode 100644
index 752c308..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail7.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//cannot rename to: j
-package p;
-class B{
-	int j;
-}
-class A extends B{
-	int m(int i){
-		j= 0;
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail8.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail8.java
deleted file mode 100644
index dd61295..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail8.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//cannot rename to: j
-package p;
-interface B{
-	int j= 0;
-}
-class A implements B{
-	int m(int i){
-		i= j;
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail9.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail9.java
deleted file mode 100644
index 0cb5868..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/A_testFail9.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//cannot rename to: j
-package p;
-
-class B{
-	int j;
-	class A {
-		int m(int i){
-			i= j;
-			return 0;
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/a.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/a.java
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameParameters/cannotRename/a.java
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test0/in/A.java
deleted file mode 100644
index 09d7beb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test0/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	private int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test0/out/A.java
deleted file mode 100644
index 54638c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test0/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	private int g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test1/in/A.java
deleted file mode 100644
index e7b1fae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test1/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	private int f;
-	void m(){
-		f++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test1/out/A.java
deleted file mode 100644
index 62565c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test1/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	private int g;
-	void m(){
-		g++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test2/in/A.java
deleted file mode 100644
index 9b8f37b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test2/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//no ref update
-package p;
-class A{
-	private int f;
-	void m(){
-		f++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test2/out/A.java
deleted file mode 100644
index e243fcd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test2/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//no ref update
-package p;
-class A{
-	private int g;
-	void m(){
-		f++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test3/in/A.java
deleted file mode 100644
index 08b2e77..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test3/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	private int f;
-	void m(){
-		/**
-		 * f f
-		 * fgd 
-		 */
-		f++;//inc f
-		String g= "f";
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test3/out/A.java
deleted file mode 100644
index 0c6b84f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test3/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	private int gg;
-	void m(){
-		/**
-		 * gg gg
-		 * fgd 
-		 */
-		gg++;//inc gg
-		String g= "gg";
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test4/in/A.java
deleted file mode 100644
index e39ac60..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test4/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	private int fMe;
-	
-	public int getMe() {
-		return fMe;
-	}
-
-	public void setMe(int me) {
-		fMe= me;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test4/out/A.java
deleted file mode 100644
index 317cbeb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test4/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	private int fYou;
-	
-	public int getYou() {
-		return fYou;
-	}
-
-	public void setYou(int me) {
-		fYou= me;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test5/in/A.java
deleted file mode 100644
index 4bf4b08..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test5/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	private int fMe;
-	
-	public int getMe() {
-		return fMe;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test5/out/A.java
deleted file mode 100644
index 852acc2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test5/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	private int fYou;
-	
-	public int getYou() {
-		return fYou;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test6/in/A.java
deleted file mode 100644
index 947a233..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test6/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	private int fMe;
-	
-	public void setMe(int me) {
-		fMe= me;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test6/out/A.java
deleted file mode 100644
index 00f75d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test6/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	private int fYou;
-	
-	public void setYou(int me) {
-		fYou= me;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test7/in/A.java
deleted file mode 100644
index ddb5e06..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test7/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	private boolean fBig;
-	
-	public void setBig(boolean big) {
-		fBig= big;
-	}
-
-	public boolean isBig() {
-		return fBig;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test7/out/A.java
deleted file mode 100644
index ce85b2d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test7/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	private boolean fSmall;
-	
-	public void setSmall(boolean big) {
-		fSmall= big;
-	}
-
-	public boolean isSmall() {
-		return fSmall;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test8/in/A.java
deleted file mode 100644
index 78fbddd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test8/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	static int f;
-	public static int getF() {
-		return f;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test8/out/A.java
deleted file mode 100644
index ceaf43c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test8/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	static int g;
-	public static int getG() {
-		return g;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test9/in/A.java
deleted file mode 100644
index d53e88f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test9/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	private boolean fBig;
-	
-	public void setBig(boolean big) {
-		fBig= big;
-	}
-
-	public boolean getBig() {
-		return fBig;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test9/out/A.java
deleted file mode 100644
index 9f4462a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/test9/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-	private boolean fSmall;
-	
-	public void setSmall(boolean big) {
-		fSmall= big;
-	}
-
-	public boolean getSmall() {
-		return fSmall;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail0/in/A.java
deleted file mode 100644
index 331b5e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private int f;
-	private int g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail1/in/A.java
deleted file mode 100644
index 4400551..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail1/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private int f;
-	private String g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail10/in/A.java
deleted file mode 100644
index 186e8f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail10/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class setE{
-	int y;
-	public int getY() {
-		return y;
-	}
-	public void setY(int y) {
-		this.y = y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail2/in/A.java
deleted file mode 100644
index 0797e05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail2/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private int f;
-	private static int g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail3/in/A.java
deleted file mode 100644
index e1abbc3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail3/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private int f;
-	public static int g;	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail4/in/A.java
deleted file mode 100644
index 86f7550..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail4/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	private int f;
-	public Object g;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail5/in/A.java
deleted file mode 100644
index 96e2633..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail5/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class B {
-	int g;
-	class A {
-		private int f;
-	}
-}	
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail6/in/A.java
deleted file mode 100644
index d688226..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail6/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	private int f;
-	class B {
-		private int g;
-	}
-}	
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail7/in/A.java
deleted file mode 100644
index a09bd64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail7/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	private int f;
-	void m(){
-		try{
-			f++;
-		} catch (Exception g){
-			f++;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail8/in/A.java
deleted file mode 100644
index dc2e17d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail8/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A{
-	int gg;
-	class C{
-		int f;
-		void m(){
-			gg++;
-		}	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail9/in/A.java
deleted file mode 100644
index d1005b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateField/testFail9/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class getE{
-	int y;
-	public int getY() {
-		return y;
-	}
-	public void setY(int y) {
-		this.y = y;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test0/in/A.java
deleted file mode 100644
index bbcc717..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test0/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	private void m(){}
-	class B{
-		void f(){
-			m();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test0/out/A.java
deleted file mode 100644
index c4e4056..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test0/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	private void k(){}
-	class B{
-		void f(){
-			k();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test10/in/A.java
deleted file mode 100644
index 855db73..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test10/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	private void m(){}
-}
-class B {
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test10/out/A.java
deleted file mode 100644
index 8040304..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test10/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	private void k(){}
-}
-class B {
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test11/in/A.java
deleted file mode 100644
index 41938b9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test11/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	private void m(){}
-}
-class B extends A{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test11/out/A.java
deleted file mode 100644
index 4fb51dd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test11/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	private void k(){}
-}
-class B extends A{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test12/in/A.java
deleted file mode 100644
index 1bfd88f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test12/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	private void m(){}
-}
-class B extends A{
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test12/out/A.java
deleted file mode 100644
index ae12fdb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test12/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	private void k(){}
-}
-class B extends A{
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test13/in/A.java
deleted file mode 100644
index 2b3e68b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test13/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void m(){
-	}
-	void f(){
-		m();
-	}
-}
-class A extends B{
-	private void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test13/out/A.java
deleted file mode 100644
index 900894d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test13/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void m(){
-	}
-	void f(){
-		m();
-	}
-}
-class A extends B{
-	private void k(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test14/in/A.java
deleted file mode 100644
index d189f8a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test14/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void k(){
-	}
-	void f(){
-		k();
-	}
-}
-class A extends B{
-	private void m(){
-	}
-	void f(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test14/out/A.java
deleted file mode 100644
index 2919161..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test14/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void k(){
-	}
-	void f(){
-		k();
-	}
-}
-class A extends B{
-	private void k(){
-	}
-	void f(){
-		k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test15/in/A.java
deleted file mode 100644
index 489be30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test15/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	private int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test15/out/A.java
deleted file mode 100644
index 1eb3f1e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test15/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	private int k(int m){
-		return k(k(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test16/in/A.java
deleted file mode 100644
index 130501a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test16/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to fred
-class A{
-	private int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test16/out/A.java
deleted file mode 100644
index 03bab78..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test16/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to fred
-class A{
-	private int fred(int m){
-		return fred(fred(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test17/in/A.java
deleted file mode 100644
index 7ddf22d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test17/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming A.m to kk
-package p;
-public class A {
-	private void m(int m){}
-}
-class B extends A{
-	void m(boolean m){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test17/out/A.java
deleted file mode 100644
index 6d4f71c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test17/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming A.m to kk
-package p;
-public class A {
-	private void kk(int m){}
-}
-class B extends A{
-	void m(boolean m){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/in/A.java
deleted file mode 100644
index 588b82d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming B.m to kk
-package p;
-class B {
-	private void m(int m) {
-	}
-
-}
-public class A extends B {
-	void m(int m) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/in/C.java
deleted file mode 100644
index 4794cc8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/in/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class C{
-	void k(){
-		new A().m(4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/out/A.java
deleted file mode 100644
index af4db05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming B.m to kk
-package p;
-class B {
-	private void kk(int m) {
-	}
-
-}
-public class A extends B {
-	void m(int m) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/out/C.java
deleted file mode 100644
index 4794cc8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test18/out/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class C{
-	void k(){
-		new A().m(4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test2/in/A.java
deleted file mode 100644
index 36ded4c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test2/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	private void m() {
-	}
-	void k(){
-		A a= new A();
-		a
-		.
-		m ();
-	}
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test2/out/A.java
deleted file mode 100644
index a8cd235..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test2/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	private void fred() {
-	}
-	void k(){
-		A a= new A();
-		a
-		.
-		fred ();
-	}
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test20/in/A.java
deleted file mode 100644
index 357e768..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test20/in/A.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	private int m(int m) {
-		return m	(	m	)	;
-	}
-		void k(){
-		A a= new A();
-		a
-	.
-		m 
-			(
-			a
-				.
-	m	
-				(
-					6
-			)	
-			
-		);
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test20/out/A.java
deleted file mode 100644
index 47a8800..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test20/out/A.java
+++ /dev/null
@@ -1,23 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	private int fred(int m) {
-		return fred	(	m	)	;
-	}
-		void k(){
-		A a= new A();
-		a
-	.
-		fred 
-			(
-			a
-				.
-	fred	
-				(
-					6
-			)	
-			
-		);
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test23/in/A.java
deleted file mode 100644
index e19f4ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test23/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	private void m(){
-	}
-}
-class test{
-	void m(){
-		class X extends A{
-			void m(){
-		}
-	}
-}}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test23/out/A.java
deleted file mode 100644
index 572f93c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test23/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	private void k(){
-	}
-}
-class test{
-	void m(){
-		class X extends A{
-			void m(){
-		}
-	}
-}}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test24/in/A.java
deleted file mode 100644
index eb9c053..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test24/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	private void m(String s){
-	}
-}
-class B extends A{
-	void m(java.lang.String s){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test24/out/A.java
deleted file mode 100644
index cf5dc6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test24/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	private void k(String s){
-	}
-}
-class B extends A{
-	void m(java.lang.String s){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test25/in/A.java
deleted file mode 100644
index 433c5a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test25/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	private void m(String[] s){
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test25/out/A.java
deleted file mode 100644
index 1e65a26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test25/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	private void k(String[] s){
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test26/in/A.java
deleted file mode 100644
index 913e471..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test26/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	private void m(){
-		this.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test26/out/A.java
deleted file mode 100644
index 950b977..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test26/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	private void k(){
-		this.k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test27/in/A.java
deleted file mode 100644
index bb7ad49..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test27/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//no ref update
-//renaming A.m to k 
-package p;
-
-class A{
-	private void m(){
-		this.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test27/out/A.java
deleted file mode 100644
index f4deb45..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/test27/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//no ref update
-//renaming A.m to k 
-package p;
-
-class A{
-	private void k(){
-		this.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testAnon0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testAnon0/in/A.java
deleted file mode 100644
index 2526bba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testAnon0/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-public class A {
-	private void m(){}
-}
-class B{
-	void f(){
-		A a= new A(){
-			void m(){
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testAnon0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testAnon0/out/A.java
deleted file mode 100644
index 730610f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testAnon0/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-public class A {
-	private void k(){}
-}
-class B{
-	void f(){
-		A a= new A(){
-			void m(){
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail0/in/A.java
deleted file mode 100644
index 946d84c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//can't rename native methods
-class A{
- 	private native void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail1/in/A.java
deleted file mode 100644
index ef9f460..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail1/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//can't rename m to k
-class A{
- 	private void m(){}
- 	private void k(){}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail2/in/A.java
deleted file mode 100644
index 8ad56a9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail2/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//can't rename A.m to k
-package p;
-
-class X {
-	void k(){
-	}
-}
-class A {
-	private void m(){
-		System.out.println("a");
-	}
-	class B extends X{
-		void f(){
-			m();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail5/in/A.java
deleted file mode 100644
index 36269e5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenamePrivateMethod/testFail5/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A {
-	private void m(){}
-	class B{
-		void k(){
-			m();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test0/in/A.java
deleted file mode 100644
index 408f8be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test0/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	static void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test0/out/A.java
deleted file mode 100644
index a8ca53b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test0/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	static void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test1/in/A.java
deleted file mode 100644
index e48131f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test1/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A{
-	static void m(){
-	}
-	void f(){
-		m();
-	}
-	static int fred(){
-		m();
-		return 0;
-	}
-}
-class B{
-	static void m(){
-		A.m();
-		new A().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test1/out/A.java
deleted file mode 100644
index e645c03..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test1/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A{
-	static void k(){
-	}
-	void f(){
-		k();
-	}
-	static int fred(){
-		k();
-		return 0;
-	}
-}
-class B{
-	static void m(){
-		A.k();
-		new A().k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/in/A.java
deleted file mode 100644
index f269555..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A {
-
-	public static void method() {
-		System.out.println("TestA.method");
-		B.method();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/in/B.java
deleted file mode 100644
index 2cf7ae4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class B {
-
-	public static void method() {
-		System.out.println("TestB.method");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/out/A.java
deleted file mode 100644
index 8456765..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A {
-
-	public static void method() {
-		System.out.println("TestA.method");
-		B.newmethod();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/out/B.java
deleted file mode 100644
index ac1e13a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test10/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class B {
-
-	public static void newmethod() {
-		System.out.println("TestB.method");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/in/A.java
deleted file mode 100644
index 297b360..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package a;
-
-public class A
-{
-   public static void method2() //<--- refactor rename this method
-   {
-   }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/in/B.java
deleted file mode 100644
index 9d7c071..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/in/B.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package b;
-
-import a.A;
-
-public class B
-{
-   I i = new I()
-   {
-	  public void method()
-	  {
-		 A.method2();
-	  }
-   };
-}
-
-interface I
-{
-   void method();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/out/A.java
deleted file mode 100644
index 01510e3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package a;
-
-public class A
-{
-   public static void fred() //<--- refactor rename this method
-   {
-   }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/out/B.java
deleted file mode 100644
index 8d40db8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test11/out/B.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package b;
-
-import a.A;
-
-public class B
-{
-   I i = new I()
-   {
-	  public void method()
-	  {
-		 A.fred();
-	  }
-   };
-}
-
-interface I
-{
-   void method();
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test2/in/A.java
deleted file mode 100644
index 9f1d3b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test2/in/A.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package p;
-class A{
-	static void m(){
-	}
-	void f(){
-		m();
-	}
-	static int fred(){
-		m();
-		return 1;
-	}
-	{
-		A.m();
-		m();
-		new A().m();
-	}
-	static {
-		A.m();
-		m();
-		new A().m();
-	}
-}
-class D{
-	static void m(){
-		A.m();
-		new A().m();
-		m();
-	}
-	static {
-		A.m();
-		new A().m();
-		m();
-	}
-	{
-		A.m();
-		new A().m();
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test2/out/A.java
deleted file mode 100644
index 81351b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test2/out/A.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package p;
-class A{
-	static void k(){
-	}
-	void f(){
-		k();
-	}
-	static int fred(){
-		k();
-		return 1;
-	}
-	{
-		A.k();
-		k();
-		new A().k();
-	}
-	static {
-		A.k();
-		k();
-		new A().k();
-	}
-}
-class D{
-	static void m(){
-		A.k();
-		new A().k();
-		m();
-	}
-	static {
-		A.k();
-		new A().k();
-		m();
-	}
-	{
-		A.k();
-		new A().k();
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test3/in/A.java
deleted file mode 100644
index ede5a5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test3/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A{
-static void m(){}
-}
-class B extends A{
-
-}
-class Test{
-void f(){
-	new A().m();
-	A.m();
-	new B().m();
-	B.m();
-}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test3/out/A.java
deleted file mode 100644
index d010dcb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test3/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A{
-static void k(){}
-}
-class B extends A{
-
-}
-class Test{
-void f(){
-	new A().k();
-	A.k();
-	new B().k();
-	B.k();
-}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test4/in/A.java
deleted file mode 100644
index 9284825..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test4/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A{
-static void m(){}
-}
-class B extends A{
-static void m(){};
-}
-class Test{
-void f(){
-	new A().m();
-	A.m();
-	new B().m();
-	B.m();
-}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test4/out/A.java
deleted file mode 100644
index c86867f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test4/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A{
-static void k(){}
-}
-class B extends A{
-static void m(){};
-}
-class Test{
-void f(){
-	new A().k();
-	A.k();
-	new B().m();
-	B.m();
-}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test5/in/A.java
deleted file mode 100644
index 676e688..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test5/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	static void m(){}
-	class B{
-		void f(){
-			m();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test5/out/A.java
deleted file mode 100644
index d961d76..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test5/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	static void k(){}
-	class B{
-		void f(){
-			k();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test6/in/A.java
deleted file mode 100644
index d1cea87..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test6/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	static void m(){
-	}
-}
-class test1{
-	void m(){
-		class X extends A{
-			void mm(){
-		}
-	}
-}}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test6/out/A.java
deleted file mode 100644
index f1bbca3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test6/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	static void k(){
-	}
-}
-class test1{
-	void m(){
-		class X extends A{
-			void mm(){
-		}
-	}
-}}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test7/in/A.java
deleted file mode 100644
index 13de2de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test7/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	static int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test7/out/A.java
deleted file mode 100644
index f8d3899..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test7/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	static int k(int m){
-		return k(k(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test8/in/A.java
deleted file mode 100644
index b1f304f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test8/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	static int m(int m){
-		return m(m(m));
-	}
-}
-
-class B extends A{
-	static int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test8/out/A.java
deleted file mode 100644
index 3dd2377..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test8/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	static int k(int m){
-		return k(k(m));
-	}
-}
-
-class B extends A{
-	static int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test9/in/A.java
deleted file mode 100644
index 3e09fbc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test9/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//no ref update
-package p;
-//renaming A.m to k
-class A{
-	static int m(int m){
-		return m(m(m));
-	}
-}
-
-class B extends A{
-	static int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test9/out/A.java
deleted file mode 100644
index 4f11385..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/test9/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//no ref update
-package p;
-//renaming A.m to k
-class A{
-	static int k(int m){
-		return m(m(m));
-	}
-}
-
-class B extends A{
-	static int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail0/in/A.java
deleted file mode 100644
index 515cf69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//can't rename native methods
-class A{
- 	static private native void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail1/in/A.java
deleted file mode 100644
index 64520ec..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail1/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//can't rename m to k
-class A{
- 	static private void m(){}
- 	static private void k(){}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail2/in/A.java
deleted file mode 100644
index 2560341..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail2/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k
-class B{
- 	void k(){}	
-}
-class A extends B{
- 	static public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail4/in/A.java
deleted file mode 100644
index 32fda7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail4/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//can't rename m to k
-class A{
- 	static public void m(){}
- 	void k(){}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail5/in/A.java
deleted file mode 100644
index 43d650a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail5/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//can't rename native methods
-class A{
- 	static native void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail6/in/A.java
deleted file mode 100644
index 2cedaae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail6/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//can't rename m to k
-class A{
- 	static public void m(){}
- 	static public void k(){}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail7/in/A.java
deleted file mode 100644
index 9bacef7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail7/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//can't rename m to k
-class A{
- 	static public void m(){}
- 	static private void k(){}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail8/in/A.java
deleted file mode 100644
index d0d9225..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameStaticMethod/testFail8/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//can't rename m to k
-class A{
- 	static public void m(){}
- 	private void k(){}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_in.java
deleted file mode 100644
index 0519ecb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_in.java
+++ /dev/null
@@ -1 +0,0 @@
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_out.java
deleted file mode 100644
index 0519ecb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_out.java
+++ /dev/null
@@ -1 +0,0 @@
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test0_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test0_in.java
deleted file mode 100644
index f71f3f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test0_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int i){
-		/*[*/int x;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test0_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test0_out.java
deleted file mode 100644
index bf34341..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test0_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int i){
-		/*[*/int j;/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test11_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test11_in.java
deleted file mode 100644
index 67a8cd6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test11_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//rename to j
-package p;
-class A{
-	int k;
-	void m(){
-		/*[*/int i= 0;/*]*/
-		A a= new A(){
-			void m(int i){
-				i++;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test11_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test11_out.java
deleted file mode 100644
index 4978fef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test11_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//rename to j
-package p;
-class A{
-	int k;
-	void m(){
-		/*[*/int j= 0;/*]*/
-		A a= new A(){
-			void m(int i){
-				i++;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test12_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test12_in.java
deleted file mode 100644
index c16fcfb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test12_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//rename to j
-package p;
-class A{
-	void m(){
-		/*[*/final int i= 0;/*]*/
-		A a= new A(){
-			void m(int k){
-				k= i;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test12_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test12_out.java
deleted file mode 100644
index e4695ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test12_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//rename to j
-package p;
-class A{
-	void m(){
-		/*[*/final int j= 0;/*]*/
-		A a= new A(){
-			void m(int k){
-				k= j;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test13_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test13_in.java
deleted file mode 100644
index 4e72d66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test13_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(){
-		/*[*/int i= 0;/*]*/
-	}
-	void n(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test13_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test13_out.java
deleted file mode 100644
index 584acd5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test13_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(){
-		/*[*/int j= 0;/*]*/
-	}
-	void n(){
-		int i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test14_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test14_in.java
deleted file mode 100644
index 116a06b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test14_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: j
-package p;
-class A{
-	A i;
-	A m(A k){
-		/*[*/A i= k;/*]*/
-		return i.m(i.m(this.i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test14_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test14_out.java
deleted file mode 100644
index a3aa71f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test14_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: j
-package p;
-class A{
-	A i;
-	A m(A k){
-		/*[*/A j= k;/*]*/
-		return j.m(j.m(this.i));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test15_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test15_in.java
deleted file mode 100644
index 0f40090..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test15_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: j, i
-package p;
-class A{
-	int m(){
-		int i= 0;
-		int j= 0;
-		return i + j;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test15_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test15_out.java
deleted file mode 100644
index 8e32cee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test15_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: j, i
-package p;
-class A{
-	int m(){
-		int j= 0;
-		int i= 0;
-		return j + i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test16_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test16_in.java
deleted file mode 100644
index 9b7f390..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test16_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(){
-		/*[*/int i= 0;/*]*/
-		class X{
-			int j;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test16_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test16_out.java
deleted file mode 100644
index 191ba70..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test16_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(){
-		/*[*/int j= 0;/*]*/
-		class X{
-			int j;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test17_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test17_in.java
deleted file mode 100644
index fd51317..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test17_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming to: j, i, k
-package p;
-class A{
-	int l;
-	int m(){
-		int i= 0; int j= 0; int k= 0;
-		int m= 0;
-		return i + j + k + l + m;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test17_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test17_out.java
deleted file mode 100644
index 5f45c44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test17_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming to: j, i, k
-package p;
-class A{
-	int l;
-	int m(){
-		int j= 0; int i= 0; int k= 0;
-		int m= 0;
-		return j + i + k + l + m;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test18_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test18_in.java
deleted file mode 100644
index 9e77ec5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test18_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(){
-		/*[*/Object i= null;/*]*/
-		class j{}
-		i= new j();
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test18_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test18_out.java
deleted file mode 100644
index 64d3656..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test18_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(){
-		/*[*/Object j= null;/*]*/
-		class j{}
-		j= new j();
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test19_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test19_in.java
deleted file mode 100644
index 4c3e81b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test19_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	A i;
-	void m(){
-		/*[*/A i= null;/*]*/
-		i.toString();
-		i.equals(i.toString());
-		i.i.i= i;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test19_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test19_out.java
deleted file mode 100644
index f17c07e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test19_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	A i;
-	void m(){
-		/*[*/A j= null;/*]*/
-		j.toString();
-		j.equals(j.toString());
-		j.i.i= j;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test1_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test1_in.java
deleted file mode 100644
index 4b9b7f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test1_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int i){
-		/*[*/int x= 0;/*]*/
-		x++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test1_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test1_out.java
deleted file mode 100644
index 9ccc2fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test1_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void m(int i){
-		/*[*/int j= 0;/*]*/
-		j++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test20_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test20_in.java
deleted file mode 100644
index 93cfd79..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test20_in.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	Object m(){
-		/*[*/i i= new i();/*]*/
-		i.i.i= i.i;
-		i:{
-			while(true){
-				break i;
-				return i;
-			}
-		}
-	};
-}
-class i{
-	i i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test20_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test20_out.java
deleted file mode 100644
index f25454f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test20_out.java
+++ /dev/null
@@ -1,17 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	Object m(){
-		/*[*/i j= new i();/*]*/
-		j.i.i= j.i;
-		i:{
-			while(true){
-				break i;
-				return j;
-			}
-		}
-	};
-}
-class i{
-	i i;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test21_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test21_in.java
deleted file mode 100644
index 92bbaa8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test21_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(){
-		/*[*/int i= 0;/*]*/
-		int[] o= new int[8];
-		for (; i == i;){
-			i++;
-			o[++i]= i ==7 ? i: i + i;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test21_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test21_out.java
deleted file mode 100644
index b71303d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test21_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	void m(){
-		/*[*/int j= 0;/*]*/
-		int[] o= new int[8];
-		for (; j == j;){
-			j++;
-			o[++j]= j ==7 ? j: j + j;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test22_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test22_in.java
deleted file mode 100644
index 1fb8ffb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test22_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int i;
-	void m(){
-		/*[*/int i=0;/*]*/
-		int u= i + this.i;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test22_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test22_out.java
deleted file mode 100644
index d48a637..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test22_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int i;
-	void m(){
-		/*[*/int j=0;/*]*/
-		int u= j + this.i;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test23_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test23_in.java
deleted file mode 100644
index 52db869..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test23_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming to: j, i
-package p;
-class A{
-	int j;
-	int m(){
-		final int i= 0;
-		int j=0;
-		return i + j;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test23_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test23_out.java
deleted file mode 100644
index fcd2d7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test23_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming to: j, i
-package p;
-class A{
-	int j;
-	int m(){
-		final int j= 0;
-		int i=0;
-		return j + i;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test24_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test24_in.java
deleted file mode 100644
index 2d12d0e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test24_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int i;
-	void m(){
-		/*[*/int i= 0;/*]*/
-		this.i= i;
-	};
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test24_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test24_out.java
deleted file mode 100644
index fe8bce5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test24_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int i;
-	void m(){
-		/*[*/int j= 0;/*]*/
-		this.i= j;
-	};
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test25_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test25_in.java
deleted file mode 100644
index e3b0e33..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test25_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(int k){
-		/*[*/int i= 0;/*]*/
-		return i + m(m(i));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test25_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test25_out.java
deleted file mode 100644
index 49876d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test25_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(int k){
-		/*[*/int j= 0;/*]*/
-		return j + m(m(j));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test26_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test26_in.java
deleted file mode 100644
index 94012bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test26_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(int k){
-		/*[*/int i= 0;/*]*/
-		new A(){
-			int m(int i){
-				return i;
-			}
-		};
-		return i + m(m(i));
-	};
-}   
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test26_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test26_out.java
deleted file mode 100644
index 74f7290..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test26_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(int k){
-		/*[*/int j= 0;/*]*/
-		new A(){
-			int m(int i){
-				return i;
-			}
-		};
-		return j + m(m(j));
-	};
-}   
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test27_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test27_in.java
deleted file mode 100644
index e6ab7b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test27_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(final int k){
-		/*[*/final int i= 0;/*]*/
-		new A(){
-			int m(int o){
-				return i;
-			}
-		};
-		return i + m(m(i));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test27_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test27_out.java
deleted file mode 100644
index d78371c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test27_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(final int k){
-		/*[*/final int j= 0;/*]*/
-		new A(){
-			int m(int o){
-				return j;
-			}
-		};
-		return j + m(m(j));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test28_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test28_in.java
deleted file mode 100644
index 9feda86..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test28_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int m(){
-		/*[*/int[] i= null;/*]*/
-		i[0]= 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test28_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test28_out.java
deleted file mode 100644
index f7165bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test28_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int m(){
-		/*[*/int[] j= null;/*]*/
-		j[0]= 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test29_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test29_in.java
deleted file mode 100644
index d41c025..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test29_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to b
-package p;
-class A{
-   A A;
-   A m(A y){
-	/*[*/A A= new A();/*]*/
-     A:
-        for (;;){
-          if (A.m(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test29_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test29_out.java
deleted file mode 100644
index c444420..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test29_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to b
-package p;
-class A{
-   A A;
-   A m(A y){
-	/*[*/A b= new A();/*]*/
-     A:
-        for (;;){
-          if (b.m(b)==b)
-             break A;
-        }
-      return b;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test2_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test2_in.java
deleted file mode 100644
index 9c0a760..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test2_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: j, k
-package p;
-class A{
-	void m(){
-		int x;
-		int y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test2_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test2_out.java
deleted file mode 100644
index 2c78ee7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test2_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to: j, k
-package p;
-class A{
-	void m(){
-		int j;
-		int k;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test30_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test30_in.java
deleted file mode 100644
index 87c8411..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test30_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to i, k
-package p;
-class A{
-	private void m(){
-		final int i= 0;
-		/*[*/int j= 0;/*]*/
-		class J{
-			int k;
-			void k(){
-				k= k;
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test30_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test30_out.java
deleted file mode 100644
index cdf72b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test30_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to i, k
-package p;
-class A{
-	private void m(){
-		final int i= 0;
-		/*[*/int k= 0;/*]*/
-		class J{
-			int k;
-			void k(){
-				k= k;
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test31_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test31_in.java
deleted file mode 100644
index a511df2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test31_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to kk, j
-package p;
-class A{
-	private void m(){
-		/*[*/final int i= 0;/*]*/
-		int j= 0;
-		new Object(){
-			int kk;
-			void fred(){
-				kk= 0;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test31_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test31_out.java
deleted file mode 100644
index 214ad2e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test31_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to kk, j
-package p;
-class A{
-	private void m(){
-		/*[*/final int kk= 0;/*]*/
-		int j= 0;
-		new Object(){
-			int kk;
-			void fred(){
-				kk= 0;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test32_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test32_in.java
deleted file mode 100644
index cae4075..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test32_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	A(){/*[*/int i= 0;/*]*/}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test32_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test32_out.java
deleted file mode 100644
index 9d6544f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test32_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	A(){/*[*/int j= 0;/*]*/}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test33_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test33_in.java
deleted file mode 100644
index 2b9907e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test33_in.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to b, no ref update
-package p;
-class A{
-   A A;
-   A m(A a){
-   	/*[*/A A= null;/*]*/
-     A:
-        for (;;){
-          if (A.m(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test33_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test33_out.java
deleted file mode 100644
index efcb193..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test33_out.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to b, no ref update
-package p;
-class A{
-   A A;
-   A m(A a){
-   	/*[*/A b= null;/*]*/
-     A:
-        for (;;){
-          if (A.m(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test34_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test34_in.java
deleted file mode 100644
index bbac062..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test34_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int j;
-   void m(){
-   	j= 0;
-   	/*[*/int i= 0;/*]*/
-   	i++;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test34_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test34_out.java
deleted file mode 100644
index ddf5fb7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test34_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	int j;
-   void m(){
-   	j= 0;
-   	/*[*/int j= 0;/*]*/
-   	j++;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test35_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test35_in.java
deleted file mode 100644
index 6880fe7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test35_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	public void testRLV() {
-	        /*[*/boolean test = true;/*]*/
-	        boolean t= (test);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test35_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test35_out.java
deleted file mode 100644
index 0ca07bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test35_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	public void testRLV() {
-	        /*[*/boolean test2 = true;/*]*/
-	        boolean t= (test2);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test36_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test36_in.java
deleted file mode 100644
index 61a3030..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test36_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void f(){
-		int y, i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test36_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test36_out.java
deleted file mode 100644
index 02465d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test36_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void f(){
-		int j, i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test37_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test37_in.java
deleted file mode 100644
index 61a3030..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test37_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void f(){
-		int y, i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test37_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test37_out.java
deleted file mode 100644
index de555ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test37_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//rename to: j
-package p;
-class A{
-	void f(){
-		int y, j;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test38_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test38_in.java
deleted file mode 100644
index 594d3eb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test38_in.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//rename to: i
-package p;
-class A{
-void m(){
-   for(int i= 0; i < 1; i++){
-   }
-   for(int j= 0; j < 1; j++){
-   }
-}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test38_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test38_out.java
deleted file mode 100644
index 12f77ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test38_out.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//rename to: i
-package p;
-class A{
-void m(){
-   for(int i= 0; i < 1; i++){
-   }
-   for(int i= 0; i < 1; i++){
-   }
-}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test39_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test39_in.java
deleted file mode 100644
index 3f76b65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test39_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class Test {
-	private static final String G= I.GR;
-	
-	public static void c(){
-		Object cp= null;
-	}
-}
-interface I {
-	String GR= "l";
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test39_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test39_out.java
deleted file mode 100644
index 684a8c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test39_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class Test {
-	private static final String G= I.GR;
-	
-	public static void c(){
-		Object j= null;
-	}
-}
-interface I {
-	String GR= "l";
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test3_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test3_in.java
deleted file mode 100644
index 5bdf06c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test3_in.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//rename to: j1
-package p;
-class A{
-	int m(){
-		{
-				int i= 0;
-		 /*[*/int k= 0;/*]*/
-			
-			return i + k;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test3_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test3_out.java
deleted file mode 100644
index 8322129..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test3_out.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//rename to: j1
-package p;
-class A{
-	int m(){
-		{
-				int i= 0;
-		 /*[*/int j1= 0;/*]*/
-			
-			return i + j1;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test40_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test40_in.java
deleted file mode 100644
index add6925..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test40_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int i, int i2){
-		int temp= i + i2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test40_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test40_out.java
deleted file mode 100644
index 3056438..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test40_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(int j, int i2){
-		int temp= j + i2;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test41_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test41_in.java
deleted file mode 100644
index 1e4c907..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test41_in.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	 void m(int i, int k);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test41_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test41_out.java
deleted file mode 100644
index ef61197..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test41_out.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	 void m(int j, int k);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test42_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test42_in.java
deleted file mode 100644
index cb503c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test42_in.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-abstract class A{
-	abstract void m(int i);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test42_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test42_out.java
deleted file mode 100644
index cae5db3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test42_out.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-abstract class A{
-	abstract void m(int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test43_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test43_in.java
deleted file mode 100644
index 35d3439..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test43_in.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	native void m(int i);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test43_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test43_out.java
deleted file mode 100644
index 58f2f20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test43_out.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	native void m(int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test44_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test44_in.java
deleted file mode 100644
index d9a29f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test44_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename var to: j
-package p;
-abstract class Test {
-  public static final Test FOO = new Test() {
-    public void foo() {
-      int var = 1;
-    }
-  };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test44_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test44_out.java
deleted file mode 100644
index cf0ec5a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test44_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename var to: j
-package p;
-abstract class Test {
-  public static final Test FOO = new Test() {
-    public void foo() {
-      int j = 1;
-    }
-  };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test45_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test45_in.java
deleted file mode 100644
index ae5e101..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test45_in.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int xx;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test45_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test45_out.java
deleted file mode 100644
index 84a8dd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test45_out.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int j;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test46_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test46_in.java
deleted file mode 100644
index 652e982..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test46_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(){
-		int xx= 1;
-		int yy= xx;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test46_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test46_out.java
deleted file mode 100644
index 5258afa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test46_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void m(){
-		int j= 1;
-		int yy= j;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test47_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test47_in.java
deleted file mode 100644
index 46d7a51..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test47_in.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	Bar.B[] field= new Bar.B[]{
-		new Bar.B()
-	};
-	void f(){
-		int temp;
-	}
-}
-
-class Bar{
-	static class B{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test47_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test47_out.java
deleted file mode 100644
index 0293a22..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test47_out.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A {
-	Bar.B[] field= new Bar.B[]{
-		new Bar.B()
-	};
-	void f(){
-		int newname;
-	}
-}
-
-class Bar{
-	static class B{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test48_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test48_in.java
deleted file mode 100644
index 39272a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test48_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	void f(){
-		String xxxx= "xx";
-		String y= ( xxxx );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test48_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test48_out.java
deleted file mode 100644
index 2815166..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test48_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	void f(){
-		String newname= "xx";
-		String y= ( newname );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test49_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test49_in.java
deleted file mode 100644
index 16cd146..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test49_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	{
-		String xxxx= "xx";
-		String y= ( xxxx );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test49_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test49_out.java
deleted file mode 100644
index de0ec4a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test49_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	{
-		String newname= "xx";
-		String y= ( newname );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test4_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test4_in.java
deleted file mode 100644
index b61b8be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test4_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: k
-package p;
-class A{
-	int k;
-	void m(){
-		/*[*/A i= new A();/*]*/
-		i.k= i.k;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test4_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test4_out.java
deleted file mode 100644
index 8498999..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test4_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: k
-package p;
-class A{
-	int k;
-	void m(){
-		/*[*/A k= new A();/*]*/
-		k.k= k.k;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test50_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test50_in.java
deleted file mode 100644
index 0962b7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test50_in.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	static {
-		String xxxx= "xx";
-		String y= ( xxxx );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test50_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test50_out.java
deleted file mode 100644
index 73341fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test50_out.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-	static {
-		String newname= "xx";
-		String y= ( newname );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test51_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test51_in.java
deleted file mode 100644
index 7a99079..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test51_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	void m() {
-		final int a = 3;
-		final int b = 3;      
-		final int b = 3;
-		final int b = 3;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test51_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test51_out.java
deleted file mode 100644
index f8e3ca6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test51_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	void m() {
-		final int a = 3;
-		final int qwerty = 3;      
-		final int b = 3;
-		final int b = 3;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test5_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test5_in.java
deleted file mode 100644
index c31e46e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test5_in.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: k
-package p;
-class A{
-	int i;
-	void m(){
-		/*[*/int i= 0;/*]*/
-		this.i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test5_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test5_out.java
deleted file mode 100644
index 9d1eb2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test5_out.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//rename to: k
-package p;
-class A{
-	int i;
-	void m(){
-		/*[*/int k= 0;/*]*/
-		this.i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test6_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test6_in.java
deleted file mode 100644
index c8fd8a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test6_in.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to k
-package p;
-class A{
-	void m(int j){
-		/*[*/int i= 0;/*]*/
-		m(i);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test6_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test6_out.java
deleted file mode 100644
index 793677a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test6_out.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//rename to k
-package p;
-class A{
-	void m(int j){
-		/*[*/int k= 0;/*]*/
-		m(k);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test7_in.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test7_in.java
deleted file mode 100644
index 7dca340..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test7_in.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//rename to k
-package p;
-class B{
-	int i;
-}
-class A extends B{
-	void m(){
-		/*[*/A i= null;/*]*/
-		super.i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test7_out.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test7_out.java
deleted file mode 100644
index 5053c50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/canRename/A_test7_out.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//rename to k
-package p;
-class B{
-	int i;
-}
-class A extends B{
-	void m(){
-		/*[*/A k= null;/*]*/
-		super.i= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail0.java
deleted file mode 100644
index b2ff9fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail0.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	void m(){
-		/*[*/final int i= 0;/*]*/
-		class X{
-			int j;
-			void m(){
-				j= i;
-			}
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail1.java
deleted file mode 100644
index 2ee470f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//nothing to rename
-package p;
-class A{
-	void m(){
-		/*[*//*]*/
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail10.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail10.java
deleted file mode 100644
index 9926ebf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail10.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//nothing to rename
-package p;
-abstract class A{
-	/*[*/abstract void m(int i, int j);/*]*/
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail11.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail11.java
deleted file mode 100644
index ded75c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail11.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//not on interfaces
-package p;
-interface A{
-	 void m(/*[*/int i/*]*/, int j);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail12.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail12.java
deleted file mode 100644
index 9bce703..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail12.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//cannot rename to j
-package p;
-class A{
-	void m(){
-		/*[*/final int i= 0;/*]*/
-		A a= new A(){
-			void m(int j){
-				int u= i;
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail13.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail13.java
deleted file mode 100644
index aa4a36d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail13.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//cannot rename to j
-package p;
-class A{
-	int j;
-	void m(){
-		/*[*/int i;/*]*/
-		j= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail14.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail14.java
deleted file mode 100644
index 90f9301..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail14.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//cannot rename to j
-package p;
-class A{
-	int k;
-	static class j{
-		static int k;
-	}
-	void m(){
-		/*[*/A i;/*]*/
-		j.k= 0;
-	}
-}	
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail15.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail15.java
deleted file mode 100644
index f803564..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail15.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	void m(){
-		/*[*/int i;/*]*/
-		for (int j= 0; j < 10; j++){
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail16.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail16.java
deleted file mode 100644
index 5c2aab4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail16.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	void m(){
-		/*[*/int i;/*]*/
-		for (int k= 0, j= 0;;) {
-		}
-		
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail17.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail17.java
deleted file mode 100644
index be33c50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail17.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	void m(){
-		/*[*/int i;/*]*/
-		try{
-			m(1);
-		}
-		catch (Throwable j){
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail18.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail18.java
deleted file mode 100644
index 3f3745d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail18.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	String j;
-	void m(){
-		/*[*/int i=0;/*]*/
-		j.toString();	
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail19.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail19.java
deleted file mode 100644
index 93f39bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail19.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//cannot rename to: j
-package p;
-class B{
-	int j;
-}
-class A extends B{
-	void m(){
-		/*[*/int i;/*]*/
-		j= 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail2.java
deleted file mode 100644
index cf88a29..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail2.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//cannot rename to i, i
-package p;
-class A{
-	int m(){
-		int i, /*[*/int j/*]*/;
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail20.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail20.java
deleted file mode 100644
index 8a21750..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail20.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//cannot rename to: j
-package p;
-interface B{
-	int j= 0;
-}
-class A implements B{
-	void m(){
-		/*[*/int i=0;/*]*/
-		int y= j;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail21.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail21.java
deleted file mode 100644
index f469912..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail21.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-abstract class A{
-	abstract void m(/*[*/int i/*]*/);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail22.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail22.java
deleted file mode 100644
index 82c2fed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail22.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	/*[*/void m(int i);/*]*/
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail23.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail23.java
deleted file mode 100644
index 8c1d23a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail23.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//rename to j
-package p;
-class A{
-	native void m(/*[*/int i/*]*/);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail24.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail24.java
deleted file mode 100644
index b1310b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail24.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//compile error
-package p;
-class A{
-	void m(int f){
-		/*[*/final int i= 0;/*]*/
-		m(t);
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail25.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail25.java
deleted file mode 100644
index 46baa16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail25.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//cannot rename i to j
-package p;
-class A{
-	void m(){
-		/*[*/final int i= 0;/*]*/
-		new A(){
-			void f(){
-				int j= 0;
-				int i2= i;
-			}
-		};
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail26.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail26.java
deleted file mode 100644
index a1fe88a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail26.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//renaming to: j
-package p;
-class A{
-	int j;
-	int m(final int k){
-		/*[*/final int i= 0;/*]*/
-		new A(){
-			int m(int o){
-				return i;
-			}
-		};
-		return i + m(m(i));
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail27.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail27.java
deleted file mode 100644
index c0e6953..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail27.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void m(/*[*/int i/*]*/, int j){
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail28.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail28.java
deleted file mode 100644
index 1b770bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail28.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(/*[*/int i/*]*/){
-		int j;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail29.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail29.java
deleted file mode 100644
index 50fdd58..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail29.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	{
-		Object /*[*/a/*]*/= null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail3.java
deleted file mode 100644
index 9aeaa26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail3.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//cannot rename to: i, 9
-package p;
-class A{
-	int m(){
-		int i;
-		/*[*/int j;/*]*/
-			return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail30.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail30.java
deleted file mode 100644
index ea69d4d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail30.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	int f;
-	protected void primExecute(int t) {
-		this.toString();
-	}
-
-	if (image != null) {
-		Object /*[*/loc/*]*/ = null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail31.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail31.java
deleted file mode 100644
index a81d07e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail31.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	int temp; //ha! not really
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail32.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail32.java
deleted file mode 100644
index 233fd93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail32.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-	void m() {
-		final int a = 3;
-		final int b = 3;
-		final int b = 3;      
-		final int b = 3;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail4.java
deleted file mode 100644
index 02dd74c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail4.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	int m(int j){
-		/*[*/int i;/*]*/
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail5.java
deleted file mode 100644
index 42c82c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail5.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	int m(){
-		/*[*/int i;/*]*/
-		{
-			int j;
-		}
-				return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail6.java
deleted file mode 100644
index 9c7e995..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail6.java
+++ /dev/null
@@ -1,14 +0,0 @@
-//cannot rename to: j
-package p;
-class A{
-	int m(){
-		/*[*/final int i=0;/*]*/
-		class X{
-			int j;
-			void m(){
-				j= i;
-			}
-		}
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail7.java
deleted file mode 100644
index fbe1711..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail7.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//cannot rename to: j
-package p;
-class B{
-	int j;
-}
-class A extends B{
-	int m(){
-		/*[*/int i=0;/*]*/
-		j= 0;
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail8.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail8.java
deleted file mode 100644
index 4dbd094..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail8.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//cannot rename to: j
-package p;
-interface B{
-	int j= 0;
-}
-class A implements B{
-	int m(){
-		/*[*/int i=0;/*]*/
-		i= j;
-		return 0;
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail9.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail9.java
deleted file mode 100644
index fce6fd7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameTemp/cannotRename/A_testFail9.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//cannot rename to: j
-package p;
-
-class B{
-	int j;
-	class A {
-		int m(){
-			/*[*/int i=0;/*]*/
-			i= j;
-			return 0;
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test0/in/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test0/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test0/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test0/out/B.java
deleted file mode 100644
index d110d65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test0/out/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test1/in/A.java
deleted file mode 100644
index bddabc6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test1/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-  A a;
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test1/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test1/out/B.java
deleted file mode 100644
index 7cad311..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test1/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-  B a;
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test10/in/A.java
deleted file mode 100644
index 8d59977..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test10/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-   A A;
-   A A(A A){
-     A:
-        for (;;){
-          if (A.A(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test10/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test10/out/B.java
deleted file mode 100644
index 2eafbb8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test10/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class B{
-   B A;
-   B A(B A){
-     A:
-        for (;;){
-          if (A.A(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/in/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/in/AA.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/in/AA.java
deleted file mode 100644
index 480ae03..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/in/AA.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class AA extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/out/AA.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/out/AA.java
deleted file mode 100644
index 20face0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/out/AA.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class AA extends B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/out/B.java
deleted file mode 100644
index d110d65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test11/out/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test12/in/A.java
deleted file mode 100644
index 6c84ebf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test12/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-  void m(){
-    A a = (A)new Object();
-  };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test12/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test12/out/B.java
deleted file mode 100644
index 1cb62a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test12/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B{
-  void m(){
-    B a = (B)new Object();
-  };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test13/in/A.java
deleted file mode 100644
index cd57777..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test13/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-  void m(){
-    boolean b = (new A()) instanceof A;
-  };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test13/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test13/out/B.java
deleted file mode 100644
index 5925007..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test13/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B{
-  void m(){
-    boolean b = (new B()) instanceof B;
-  };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test14/in/A.java
deleted file mode 100644
index 1a3912e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test14/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-  A a = new A();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test14/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test14/out/B.java
deleted file mode 100644
index 926aaed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test14/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-  B a = new B();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test15/in/A.java
deleted file mode 100644
index cd26dd8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test15/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-   static void s(){};
-}
-class AA{
-   AA(){ 
-     A.s();
-   };   
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test15/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test15/out/B.java
deleted file mode 100644
index 6fc6056..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test15/out/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class B{
-   static void s(){};
-}
-class AA{
-   AA(){ 
-     B.s();
-   };   
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test16/in/A.java
deleted file mode 100644
index 65fdbac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test16/in/A.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package p;
-class A{
-   boolean A = new A() instanceof A;
-   A A(A A){
-     A:
-        for (;;){
-          if (A.A(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
-class AA extends A{
-   A A = (A) new A();
-   A A(A A){
-     A:
-        for (;;){
-          if (A.A(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test16/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test16/out/B.java
deleted file mode 100644
index e2d8732..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test16/out/B.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package p;
-class B{
-   boolean A = new B() instanceof B;
-   B A(B A){
-     A:
-        for (;;){
-          if (A.A(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
-class AA extends B{
-   B A = (B) new B();
-   B A(B A){
-     A:
-        for (;;){
-          if (A.A(A)==A)
-             break A;
-        }
-      return A;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test17/in/A.java
deleted file mode 100644
index dd850ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test17/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-interface I{
-  int A = 0;
-}
-class A{
-  int A = I.A; 
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test17/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test17/out/B.java
deleted file mode 100644
index 77da929..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test17/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-interface I{
-  int A = 0;
-}
-class B{
-  int A = I.A; 
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test18/in/A.java
deleted file mode 100644
index 791c40d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test18/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A extends Exception{
-}
-class AA{
-  void m(){
-    try {
-      throw new A();
-    }
-    catch(A a){}
-  }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test18/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test18/out/B.java
deleted file mode 100644
index f7ee99a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test18/out/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class B extends Exception{
-}
-class AA{
-  void m(){
-    try {
-      throw new B();
-    }
-    catch(B a){}
-  }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test19/in/A.java
deleted file mode 100644
index e9efa72..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test19/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A extends Exception{
-  void m(){
-    try {
-      throw new A();
-    }
-    catch(A A){}
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test19/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test19/out/B.java
deleted file mode 100644
index 3d493fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test19/out/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class B extends Exception{
-  void m(){
-    try {
-      throw new B();
-    }
-    catch(B A){}
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test2/in/A.java
deleted file mode 100644
index efd6ca8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test2/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-  int A;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test2/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test2/out/B.java
deleted file mode 100644
index 96d20fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test2/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-  int A;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test20/in/A.java
deleted file mode 100644
index 42c0104..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test20/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package A;
-class A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test20/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test20/out/B.java
deleted file mode 100644
index f585c27..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test20/out/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package A;
-class B{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test21/in/A.java
deleted file mode 100644
index 9674a71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test21/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-  void m(){
-    for (A A=new A();;) continue;
-  };
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test21/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test21/out/B.java
deleted file mode 100644
index e7079e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test21/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B{
-  void m(){
-    for (B A=new B();;) continue;
-  };
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test22/in/A.java
deleted file mode 100644
index efd0589..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test22/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-  A(){};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test22/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test22/out/B.java
deleted file mode 100644
index 0154750..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test22/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-  B(){};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test23/in/A.java
deleted file mode 100644
index 200fbc9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test23/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-  A[] a = new A[5];
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test23/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test23/out/B.java
deleted file mode 100644
index e13f8d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test23/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-  B[] a = new B[5];
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test24/in/A.java
deleted file mode 100644
index b258bf2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test24/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A extends Exception{
-  void m() throws A
-  {};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test24/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test24/out/B.java
deleted file mode 100644
index 6bb1219..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test24/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B extends Exception{
-  void m() throws B
-  {};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test25/in/A.java
deleted file mode 100644
index 91b863c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test25/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-  Class c = A.class;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test25/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test25/out/B.java
deleted file mode 100644
index 5e58762..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test25/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-  Class c = B.class;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test26/in/A.java
deleted file mode 100644
index 36252a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test26/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-  int x;
-  class Inner{
-    void m(){
-      A.this.x++;
-    }
-  }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test26/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test26/out/B.java
deleted file mode 100644
index 23e2e05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test26/out/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class B{
-  int x;
-  class Inner{
-    void m(){
-      B.this.x++;
-    }
-  }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test27/in/A.java
deleted file mode 100644
index ea5823b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test27/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class Super{
-  int x;
-}
-class A extends Super{
-  String x;
-  class Inner{
-    void m(){
-      A.super.x++;
-    }
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test27/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test27/out/B.java
deleted file mode 100644
index e65f694..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test27/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class Super{
-  int x;
-}
-class B extends Super{
-  String x;
-  class Inner{
-    void m(){
-      B.super.x++;
-    }
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test28/in/A.java
deleted file mode 100644
index c56d8e4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test28/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class Super{
-  void m1(){};
-}
-class A extends Super{
-  class Inner{
-    void m(){
-      A.super.m1();
-    }
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test28/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test28/out/B.java
deleted file mode 100644
index fbb2b02..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test28/out/B.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class Super{
-  void m1(){};
-}
-class B extends Super{
-  class Inner{
-    void m(){
-      B.super.m1();
-    }
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/in/A.java
deleted file mode 100644
index b047e01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-public class A{};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/in/C.java
deleted file mode 100644
index ffcf8fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/in/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-import p.A;
-class C{}; 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/out/B.java
deleted file mode 100644
index 9840770..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/out/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-public class B{};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/out/C.java
deleted file mode 100644
index 3e07200..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test29/out/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-import p.B;
-class C{}; 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test3/in/A.java
deleted file mode 100644
index 6857903..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test3/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-}
-class AA extends A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test3/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test3/out/B.java
deleted file mode 100644
index 72a47fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test3/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class B{
-}
-class AA extends B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/in/A.java
deleted file mode 100644
index 9bbb4ae..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-   static int f;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/in/AA.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/in/AA.java
deleted file mode 100644
index 47f9fc0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/in/AA.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class AA{
-   AA(){ A.f=0; };   
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/out/AA.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/out/AA.java
deleted file mode 100644
index aaf251b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/out/AA.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class AA{
-   AA(){ B.f=0; };   
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/out/B.java
deleted file mode 100644
index ab72f87..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test30/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-   static int f;
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/in/A.java
deleted file mode 100644
index 061be77..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class A{};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/in/AA.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/in/AA.java
deleted file mode 100644
index 0bd204c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/in/AA.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class AA{
-   Object a = new A(){
-              };
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/out/AA.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/out/AA.java
deleted file mode 100644
index 4cc1669..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/out/AA.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class AA{
-   Object a = new B(){
-              };
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/out/B.java
deleted file mode 100644
index 4c03080..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test31/out/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class B{};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test32/in/A.java
deleted file mode 100644
index 3486407..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test32/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-}
-class C{
-  C(A a){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test32/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test32/out/B.java
deleted file mode 100644
index a7c1128..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test32/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B{
-}
-class C{
-  C(B a){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test33/in/A.java
deleted file mode 100644
index de8a1e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test33/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A extends Exception{
-}
-class C{
-  C() throws A {};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test33/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test33/out/B.java
deleted file mode 100644
index 730a0ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test33/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B extends Exception{
-}
-class C{
-  C() throws B {};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test34/in/A.java
deleted file mode 100644
index 7fe39a7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test34/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-// 2 occurences
-package p;
-public class A {
-	{A a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test34/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test34/out/B.java
deleted file mode 100644
index cedeb23..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test34/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-// 2 occurences
-package p;
-public class B {
-	{B a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test35/in/A.java
deleted file mode 100644
index d3969f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test35/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//2 occurences
-package p;
-public class A {
-	static {A a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test35/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test35/out/B.java
deleted file mode 100644
index 161b651..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test35/out/B.java
+++ /dev/null
@@ -1,5 +0,0 @@
-//2 occurences
-package p;
-public class B {
-	static {B a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test36/in/A.java
deleted file mode 100644
index 80671d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test36/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//3 occurences
-package p;
-public class A {
-	static {A a;}
-	static {A a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test36/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test36/out/B.java
deleted file mode 100644
index d99b282..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test36/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//3 occurences
-package p;
-public class B {
-	static {B a;}
-	static {B a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test37/in/A.java
deleted file mode 100644
index a5cf5ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test37/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//3 occurences
-package p;
-public class A {
-	static {A a;}
-	{A a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test37/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test37/out/B.java
deleted file mode 100644
index 0a55f97..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test37/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-//3 occurences
-package p;
-public class B {
-	static {B a;}
-	{B a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test38/in/A.java
deleted file mode 100644
index 9b76ec0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test38/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//2 occurences
-package p;
-public class A {
-}
-
-class C{
-	{A a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test38/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test38/out/B.java
deleted file mode 100644
index 9084847..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test38/out/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//2 occurences
-package p;
-public class B {
-}
-
-class C{
-	{B a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test39/in/A.java
deleted file mode 100644
index 806e5a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test39/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//2 occurences
-package p;
-public class A {
-}
-
-class C{
-	static {A a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test39/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test39/out/B.java
deleted file mode 100644
index f7855ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test39/out/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//2 occurences
-package p;
-public class B {
-}
-
-class C{
-	static {B a;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test4/in/A.java
deleted file mode 100644
index 1091280..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test4/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-   void A(){};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test4/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test4/out/B.java
deleted file mode 100644
index 4f70464..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test4/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-   void A(){};
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test40/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test40/in/A.java
deleted file mode 100644
index ad31dc6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test40/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//1 occurence
-public class A {
-}
-
-class C {
-	void m() {
-		class A{
-		}
-		new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test40/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test40/out/B.java
deleted file mode 100644
index 3e19bb4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test40/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//1 occurence
-public class B {
-}
-
-class C {
-	void m() {
-		class A{
-		}
-		new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test41/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test41/in/A.java
deleted file mode 100644
index 04f17fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test41/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A {
-	A(A A){}
-	A A(A A){
-		A= new A(new A(A));
-		return A;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test41/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test41/out/B.java
deleted file mode 100644
index dddd152..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test41/out/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class B {
-	B(B A){}
-	B A(B A){
-		A= new B(new B(A));
-		return A;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test42/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test42/in/A.java
deleted file mode 100644
index 5418dd9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test42/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {
-	A(A A){}
-	A A(A A){
-		A= new A(new A(A));
-		return A;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test42/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test42/out/B.java
deleted file mode 100644
index 744edb4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test42/out/B.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class B {
-	B(B A){}
-	B A(B A){
-		A= new B(new B(A));
-		return A;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test43/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test43/in/A.java
deleted file mode 100644
index d187f54..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test43/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
-public class A {
-	static A A;
-}
-class X extends p.A{
-	void x(){
-		p.A.A= A.A;//fields come first
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test43/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test43/out/B.java
deleted file mode 100644
index 20e2727..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test43/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
-public class B {
-	static B A;
-}
-class X extends p.B{
-	void x(){
-		p.B.A= A.A;//fields come first
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test44/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test44/in/A.java
deleted file mode 100644
index 04c067d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test44/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//renaming A to B
-package p;
-interface A {
-}
-class K implements A{
-}
-interface C extends A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test44/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test44/out/B.java
deleted file mode 100644
index f9d3d92..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test44/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//renaming A to B
-package p;
-interface B {
-}
-class K implements B{
-}
-interface C extends B{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test45/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test45/in/A.java
deleted file mode 100644
index 18d05b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test45/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
- class A {
-	static A A;
-}
-class X extends p.A{
-	void x(){
-		p.A.A= A.A;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test45/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test45/out/B.java
deleted file mode 100644
index 61d6943..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test45/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
- class B {
-	static B A;
-}
-class X extends p.B{
-	void x(){
-		p.B.A= A.A;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/in/A.java
deleted file mode 100644
index b047e01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-public class A{};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/in/C.java
deleted file mode 100644
index ffcf8fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/in/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-import p.A;
-class C{}; 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/out/B.java
deleted file mode 100644
index 9840770..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/out/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-public class B{};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/out/C.java
deleted file mode 100644
index 3e07200..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test46/out/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-import p.B;
-class C{}; 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test47/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test47/in/A.java
deleted file mode 100644
index 6ae44a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test47/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
-class A{
-	A	( ){};
-};
-class C{
-	void s(){
-	new A ( );
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test47/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test47/out/B.java
deleted file mode 100644
index 6d95d4f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test47/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
-class B{
-	B	( ){};
-};
-class C{
-	void s(){
-	new B ( );
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test48/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test48/in/A.java
deleted file mode 100644
index 92da31a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test48/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
-class A{
-	A	( ){};
-};
-class C{
-	void s(){
-	new p . A ( );
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test48/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test48/out/B.java
deleted file mode 100644
index 6fc2e7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test48/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
-class B{
-	B	( ){};
-};
-class C{
-	void s(){
-	new p . B ( );
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test49/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test49/in/A.java
deleted file mode 100644
index dc7c33d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test49/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//renaming A to B
-package p;
-class A{
-	A	( ){};
-	static int fgT;
-};
-class C{
-	void s(){
-	new p . A ( );
-	p
-	.
-	A
-	.
-	fgT
-	=
-	6;
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test49/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test49/out/B.java
deleted file mode 100644
index 9c92c70..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test49/out/B.java
+++ /dev/null
@@ -1,18 +0,0 @@
-//renaming A to B
-package p;
-class B{
-	B	( ){};
-	static int fgT;
-};
-class C{
-	void s(){
-	new p . B ( );
-	p
-	.
-	B
-	.
-	fgT
-	=
-	6;
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test5/in/A.java
deleted file mode 100644
index efce98d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test5/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-   void m(A a){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test5/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test5/out/B.java
deleted file mode 100644
index bfca111..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test5/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-   void m(B a){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test50/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test50/in/A.java
deleted file mode 100644
index 4c07c67..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test50/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
-class A{
-	A( ){};
-};
-class C extends A{
-	C(){
-		super();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test50/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test50/out/B.java
deleted file mode 100644
index 6e53cb1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test50/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-//renaming A to B
-package p;
-class B{
-	B( ){};
-};
-class C extends B{
-	C(){
-		super();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/in/A.java
deleted file mode 100644
index c57bddf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
- public class X{}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/in/C.java
deleted file mode 100644
index a10bebd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/in/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-import p.A.*;
-class C{}; 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/out/B.java
deleted file mode 100644
index dfa16de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class B{
- public class X{}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/out/C.java
deleted file mode 100644
index 149a043..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test51/out/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-import p.B.*;
-class C{}; 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test52/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test52/in/A.java
deleted file mode 100644
index 5e98305..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test52/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class A{
-	A[] m(){
-		return (A[])new A[3];
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test52/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test52/out/B.java
deleted file mode 100644
index 28cefd2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test52/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class B{
-	B[] m(){
-		return (B[])new B[3];
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test53/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test53/in/A.java
deleted file mode 100644
index 8237dbe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test53/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//no ref update
-package p;
-public class A{
-	A(){}
-	A(A A){}
-	A m(){
-		return (A)new A();
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test53/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test53/out/B.java
deleted file mode 100644
index 9afa2e5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test53/out/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//no ref update
-package p;
-public class B{
-	B(){}
-	B(A A){}
-	A m(){
-		return (A)new A();
-	}
-};
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test54/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test54/in/A.java
deleted file mode 100644
index 67a5e75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test54/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-//rename X to XYZ
-package p;
-public class A{
-	class X{
-		X(X X){new X(null);}
-	}
-	A(){}
-	A(A A){}
-	A m(){
-		new X(null);
-		return (A)new A();
-	}
-};
-class B{
-	A.X ax= new A().new X(null);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test54/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test54/out/A.java
deleted file mode 100644
index efea233..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test54/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-//rename X to XYZ
-package p;
-public class A{
-	class XYZ{
-		XYZ(XYZ X){new XYZ(null);}
-	}
-	A(){}
-	A(A A){}
-	A m(){
-		new XYZ(null);
-		return (A)new A();
-	}
-};
-class B{
-	A.XYZ ax= new A().new XYZ(null);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test55/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test55/in/A.java
deleted file mode 100644
index 5abee52..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test55/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-//rename X to XYZ - no ref update
-package p;
-public class A{
-	class X{
-		X(X X){new X(null);}
-	}
-	A(){}
-	A(A A){}
-	A m(){
-		new X(null);
-		return (A)new A();
-	}
-};
-class B{
-	A.X ax= new A().new X(null);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test55/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test55/out/A.java
deleted file mode 100644
index 3a6a288..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test55/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-//rename X to XYZ - no ref update
-package p;
-public class A{
-	class XYZ{
-		XYZ(X X){new X(null);}
-	}
-	A(){}
-	A(A A){}
-	A m(){
-		new X(null);
-		return (A)new A();
-	}
-};
-class B{
-	A.X ax= new A().new X(null);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/A.java
deleted file mode 100644
index 92da053..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package a.a;
-class A {
-    A() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/B.java
deleted file mode 100644
index 66b8fb2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package a.a;
-class B {
-public A theA;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/default/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/default/A.java
deleted file mode 100644
index c3f152c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/in/default/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-class A {
-    A() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/A.java
deleted file mode 100644
index 92da053..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package a.a;
-class A {
-    A() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/B.java
deleted file mode 100644
index 66b8fb2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package a.a;
-class B {
-public A theA;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/default/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/default/B.java
deleted file mode 100644
index c21ade7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test56/out/default/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-class B {
-    B() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test57/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test57/in/A.java
deleted file mode 100644
index d540e4e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test57/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-/**
- * p.A 
- * AA A
- */
-public class A{
-	A a;//A
-	String aa= "A";
-};
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test57/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test57/out/B.java
deleted file mode 100644
index 3a6a99a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test57/out/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-/**
- * p.B 
- * AA B
- */
-public class B{
-	B a;//B
-	String aa= "B";
-};
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test58/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test58/in/A.java
deleted file mode 100644
index 0b139ce..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test58/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class Sup{
-	static int CONSTANT= 0;
-}
-class A extends Sup {
-}
-
-class Test {
-  public static void main(String[] arguments) {
-    System.out.println(A.CONSTANT);
-  }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test58/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test58/out/B.java
deleted file mode 100644
index d6da1b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test58/out/B.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class Sup{
-	static int CONSTANT= 0;
-}
-class B extends Sup {
-}
-
-class Test {
-  public static void main(String[] arguments) {
-    System.out.println(B.CONSTANT);
-  }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test59/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test59/in/A.java
deleted file mode 100644
index 3faabb5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test59/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void f(){
-		A a= ( A )this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test59/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test59/out/B.java
deleted file mode 100644
index f8e4430..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test59/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B {
-	void f(){
-		B a= ( B )this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test6/in/A.java
deleted file mode 100644
index c96f5c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test6/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-   void m(A A){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test6/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test6/out/B.java
deleted file mode 100644
index e32d1a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test6/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-   void m(B A){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test60/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test60/in/A.java
deleted file mode 100644
index 05032ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test60/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-/**
- * p.A 
- * AA A
- */
-public class A{
-	A a;//A
-	String aa= "C:\\A.java";
-};
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test60/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test60/out/B.java
deleted file mode 100644
index 965f4b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test60/out/B.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-/**
- * p.B 
- * AA B
- */
-public class B{
-	B a;//B
-	String aa= "C:\\B.java";
-};
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test7/in/A.java
deleted file mode 100644
index ff50450..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test7/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-   A m(){return null;};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test7/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test7/out/B.java
deleted file mode 100644
index 38e8cf2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test7/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-   B m(){return null;};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test8/in/A.java
deleted file mode 100644
index 8d3c292..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test8/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-   void m(){
-     A: return;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test8/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test8/out/B.java
deleted file mode 100644
index 62858b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test8/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B{
-   void m(){
-     A: return;
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test9/in/A.java
deleted file mode 100644
index 5d48bdf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test9/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-   void m(){
-     A A; 
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test9/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test9/out/B.java
deleted file mode 100644
index 3f6c10b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/test9/out/B.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class B{
-   void m(){
-     B A; 
-   };
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail0/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail00/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail00/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail00/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail01/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail01/in/A.java
deleted file mode 100644
index f6daf1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail01/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-}
-class C extends A{
-}
-class B extends C{
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail02/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail02/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail02/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail03/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail03/in/A.java
deleted file mode 100644
index f6daf1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail03/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-}
-class C extends A{
-}
-class B extends C{
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail04/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail04/in/A.java
deleted file mode 100644
index f6daf1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail04/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-}
-class C extends A{
-}
-class B extends C{
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail1/in/A.java
deleted file mode 100644
index f6daf1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail1/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-}
-class C extends A{
-}
-class B extends C{
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail10/in/A.java
deleted file mode 100644
index a7cbe67..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail10/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-  class AA{
-     class AAA{
-        class B{
-        }
-     }
-  }
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail11/in/A.java
deleted file mode 100644
index b376073..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail11/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-  class A{}
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail12/in/A.java
deleted file mode 100644
index 179edb2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail12/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-  interface B{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail16/in/A.java
deleted file mode 100644
index e325f6a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail16/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class Outer{
-  class A{}
-  class B{}
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail17/in/A.java
deleted file mode 100644
index ae12ea2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail17/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class Outer{
-  class A{}
-  interface B{}
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail18/in/A.java
deleted file mode 100644
index ad30f07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail18/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class Outer{
-  class Inner{
-    class A{}
-    class B{}
-  }
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail19/in/A.java
deleted file mode 100644
index ad30f07..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail19/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class Outer{
-  class Inner{
-    class A{}
-    class B{}
-  }
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail2/in/A.java
deleted file mode 100644
index 304ff48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail2/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A extends B{
-}
-class B{
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail20/in/A.java
deleted file mode 100644
index 7ca9bbb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail20/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-public class A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail20/in/AA.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail20/in/AA.java
deleted file mode 100644
index 74916a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail20/in/AA.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p2;
-import p1.*;
-class AA extends A{}
-class B extends AA{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail21/in/A.java
deleted file mode 100644
index 77c8e44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail21/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-class A{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail21/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail21/in/C.java
deleted file mode 100644
index 3681e46..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail21/in/C.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1.B;
-class C{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail22/in/A.java
deleted file mode 100644
index 32ba7d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail22/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class A{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail22/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail22/in/B.java
deleted file mode 100644
index 7c55812..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail22/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-interface B{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/A.java
deleted file mode 100644
index 25ac9bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-public class A{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/B.java
deleted file mode 100644
index 1e8902b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p3;
-public class B{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/Bogus.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/Bogus.java
deleted file mode 100644
index c10e59b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail23/in/Bogus.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p2;
-import p1.A;
-import p3.B;
-class Bogus{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail24/in/A.java
deleted file mode 100644
index 25ac9bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail24/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-public class A{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail24/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail24/in/B.java
deleted file mode 100644
index 3945a49..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail24/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2;
-import p1.A;
-class B{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail25/in/A.java
deleted file mode 100644
index 25ac9bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail25/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-public class A{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail25/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail25/in/B.java
deleted file mode 100644
index 042c455..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail25/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p2;
-import p1.A;
-interface B{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail26/in/A.java
deleted file mode 100644
index 61b6e6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail26/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-import p2.B;
-public class A{} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail26/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail26/in/B.java
deleted file mode 100644
index 8a3f9bf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail26/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p2;
-public interface B{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail27/in/A.java
deleted file mode 100644
index 8071f64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail27/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p1;
-import p2.B;
-public class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail27/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail27/in/B.java
deleted file mode 100644
index 16d5100..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail27/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p2;
-public class B{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail28/in/A.java
deleted file mode 100644
index 056876b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail28/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-   static int length = 17;
-   int m(){
-     int[] B = new int[1];
-     return A.length;
-   }
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail29/in/A.java
deleted file mode 100644
index 61d3566..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail29/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-   static int length = 17;
-   int m(int[] B){
-     return A.length;
-   }
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail3/in/A.java
deleted file mode 100644
index ad40c78..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail3/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A extends C{
-}
-class B{
-}
-class C extends B{
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail30/in/A.java
deleted file mode 100644
index 4ab0bf3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail30/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-   static int length = 17;
-   int[] B = new int[1];
-   int m(){
-     return A.length;
-   }
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/A.java
deleted file mode 100644
index 4edb6e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-public class A{}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/B.java
deleted file mode 100644
index c16f798..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p2;
-public class B{}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/C.java
deleted file mode 100644
index 1b13cad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail31/in/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p3;
-import p1.*;
-import p2.B;
-class C{
-   Object o = new A();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail32/in/A.java
deleted file mode 100644
index 7b5d176..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail32/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-import p1.*;
-public class A{
-   Object o = new B();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail32/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail32/in/B.java
deleted file mode 100644
index 568eb40..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail32/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-public class B{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail33/in/A.java
deleted file mode 100644
index cc55de5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail33/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//2 occurences
-//disallow - shadowing
-public class A {
-}
-
-class C {
-	void m() {
-		class B {
-		}
-		new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail34/in/A.java
deleted file mode 100644
index 6462581..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail34/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//2 occurences
-//disallow - obscuring
-public class A {
-	static int length= 1;
-}
-
-class C {
-	void m() {
-		int[] B= {42};
-		A.length= 0;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail35/in/A.java
deleted file mode 100644
index 7dad132..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail35/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//2 occurences
-//disallow - obscuring
-public class A {
-	static int length= 1;
-}
-
-class C {
-	void m(int[] B) {
-		A.length= 0;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail36/in/A.java
deleted file mode 100644
index 00a75d1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail36/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//2 occurences
-//disallow - obscuring
-public class A {
-	static int length= 1;
-}
-
-class C {
-	int[] B= {4};
-	void m() {
-		A.length= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail37/in/A.java
deleted file mode 100644
index 71df552..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail37/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail37/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail37/in/B.java
deleted file mode 100644
index 6cb383e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail37/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class B{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail38/in/A.java
deleted file mode 100644
index b7438c3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail38/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	private static interface I{
-		class C{
-		native void j();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail39/in/A.java
deleted file mode 100644
index 94de0d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail39/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class A{
-	native void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail4/in/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail4/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail4/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail4/in/B.java
deleted file mode 100644
index 3613892..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail4/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B extends A{
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail40/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail40/in/A.java
deleted file mode 100644
index 71e4836..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail40/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class A{
-	class C{
-		native void m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail41/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail41/in/A.java
deleted file mode 100644
index 1172b81..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail41/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class A{
-	public static int length(){ return 0;};
-}
-class F{
-	int m(){
-		String B= null;
-		return A.length();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail42/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail42/in/A.java
deleted file mode 100644
index 81eaf64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail42/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A{
-	public static int length(){ return 0;};
-}
-class F{
-	int m(String B){
-		return A.length();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail43/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail43/in/A.java
deleted file mode 100644
index 65fb284..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail43/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class A{
-	public static int length(){ return 0;};
-}
-class F{
-	String B;
-	int m(){
-		return A.length();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail44/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail44/in/A.java
deleted file mode 100644
index f65c292..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail44/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-public class A{
-	public static int length(){ return 0;};
-}
-class F{
-	String B;
-}
-class FF extends F{
-	int m(){
-		return A.length();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail45/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail45/in/A.java
deleted file mode 100644
index 5554553..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail45/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-public class A{
-	public static int length(){ return 0;};
-}
-interface I{
-	String B= "fred";
-}
-class FF implements I{
-	int m(){
-		return A.length();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail46/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail46/in/A.java
deleted file mode 100644
index 2c0539c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail46/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class A{
-	static int MAX_VALUE = 2;
-}
-class S{
-	int m(){
-		Integer B= null;
-		return A.MAX_VALUE;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail47/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail47/in/A.java
deleted file mode 100644
index a6af04d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail47/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-public class A{
-	static int MAX_VALUE = 2;
-}
-class S{
-	int m(Integer B){
-		return A.MAX_VALUE;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail48/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail48/in/A.java
deleted file mode 100644
index 730681c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail48/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	A a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail49/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail49/in/A.java
deleted file mode 100644
index 6e5046d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail49/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	A m(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/A.java
deleted file mode 100644
index 6291b80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/B.java
deleted file mode 100644
index 3d18e87..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B extends C{
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/C.java
deleted file mode 100644
index 293a290..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail5/in/C.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class C extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail50/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail50/in/A.java
deleted file mode 100644
index ce74207..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail50/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	void m(A a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail51/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail51/in/A.java
deleted file mode 100644
index 223883f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail51/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	X(A a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail52/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail52/in/A.java
deleted file mode 100644
index 7129fc6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail52/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A extends Exception{
-}
-class X{
-	class B extends Exception{
-	}
-	void m() throws A{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail53/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail53/in/A.java
deleted file mode 100644
index 917fe91..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail53/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A extends Exception{
-}
-class X{
-	class B extends Exception{
-	}
-	X() throws A{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail54/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail54/in/A.java
deleted file mode 100644
index de4ae47..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail54/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	void m(){
-		A a;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail55/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail55/in/A.java
deleted file mode 100644
index 45a7007..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail55/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A extends Exception{
-}
-class X{
-	class B extends Exception{
-	}
-	void m() throws A{
-	}
-	void k(){
-		try {
-			m();
-		} catch (A a){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail56/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail56/in/A.java
deleted file mode 100644
index 927609b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail56/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A extends Exception{
-}
-class X{
-	class B extends Exception{
-	}
-	Object o= A.class;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail57/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail57/in/A.java
deleted file mode 100644
index 222d305..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail57/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	Object o= new A();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail58/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail58/in/A.java
deleted file mode 100644
index eaab62a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail58/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	Object o= new A(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail59/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail59/in/A.java
deleted file mode 100644
index 5b3be05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail59/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	Object o= new A[0];
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/A.java
deleted file mode 100644
index 07a2149..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A extends C{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/B.java
deleted file mode 100644
index d110d65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/C.java
deleted file mode 100644
index b2c3c43..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail6/in/C.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class C extends B{
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail60/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail60/in/A.java
deleted file mode 100644
index 2b19f3b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail60/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	Object m(Object o){
-		return (A)o;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail61/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail61/in/A.java
deleted file mode 100644
index 33ee468..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail61/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	boolean m(Object o){
-		return o instanceof A;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail62/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail62/in/A.java
deleted file mode 100644
index d6c2750..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail62/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	static int x;
-}
-class X{
-	static class B{
-		static int x;
-	}
-	int m(Object o){
-		return A.x;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail63/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail63/in/A.java
deleted file mode 100644
index 78f81e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail63/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-	static int x(){return 42;};
-}
-class X{
-	static class B{
-		static int x(){return 42;};
-	}
-	int m(Object o){
-		return A.x();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail64/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail64/in/A.java
deleted file mode 100644
index aca1914..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail64/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class X{
-	class B{
-	}
-	class Fred extends A{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail65/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail65/in/A.java
deleted file mode 100644
index 773ea1e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail65/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{}
-		A a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail66/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail66/in/A.java
deleted file mode 100644
index cbd2947..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail66/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{};
-		class C{
-			A m(){
-				return null;
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail67/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail67/in/A.java
deleted file mode 100644
index 1bd4502..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail67/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{};
-		class C{
-			void m(A b){
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail68/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail68/in/A.java
deleted file mode 100644
index 9f6c653..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail68/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{
-		};
-		class C{
-			C(A b){
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail69/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail69/in/A.java
deleted file mode 100644
index 4109948..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail69/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A extends Exception{
-}
-class X{
-	void m(){
-		class B extends Exception{}
-		class C{
-			void m() throws A{
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail7/in/A.java
deleted file mode 100644
index dd7b3a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail7/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-}
-class B{}
-
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail70/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail70/in/A.java
deleted file mode 100644
index 0f3f1b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail70/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A extends Exception{
-}
-class X{
-	void m(){
-		class B extends Exception{}
-		class C{
-			C() throws A{
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail71/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail71/in/A.java
deleted file mode 100644
index f26e1b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail71/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-}
-class X{
-	void m(){
-		class B{}
-		class C{
-			A a;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail72/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail72/in/A.java
deleted file mode 100644
index 3e9e83e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail72/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-class A extends Exception {
-}
-class X {
-	void f() {
-		class B extends Exception {
-		};
-		class C {
-			void m() throws A {
-			}
-			void k() {
-				try {
-					m();
-				} catch (A a) {
-				}
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail73/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail73/in/A.java
deleted file mode 100644
index 98430b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail73/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A {}
-class X{
-	void m(){
-		class B	{}
-		Object o= A.class;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail74/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail74/in/A.java
deleted file mode 100644
index 10d8bfe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail74/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{}
-		Object o= new A();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail75/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail75/in/A.java
deleted file mode 100644
index f6cdea7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail75/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{}
-		Object o= new A(){};
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail76/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail76/in/A.java
deleted file mode 100644
index 48f65c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail76/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{}
-		Object o= new A[0];
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail77/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail77/in/A.java
deleted file mode 100644
index a4d5354..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail77/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{}
-		class C{
-			Object m(Object o){
-				return (A)o;
-			}
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail78/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail78/in/A.java
deleted file mode 100644
index b2d42cb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail78/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{	}
-		class C{
-			boolean m(Object o){
-				return o instanceof A;
-			}
-		}	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail79/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail79/in/A.java
deleted file mode 100644
index 8eb9ad9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail79/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-}
-class X{
-	void m(){
-		class B{}
-		class Fred extends A{
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail8/in/A.java
deleted file mode 100644
index 4a3f223..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail8/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail8/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail8/in/B.java
deleted file mode 100644
index d5d34df..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail8/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B{}
- 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail80/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail80/in/A.java
deleted file mode 100644
index 8e56da5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail80/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		class B{}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail81/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail81/in/A.java
deleted file mode 100644
index d2dc781..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail81/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	class C{
-		void m(){
-			class B{}
-		}
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail82/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail82/in/A.java
deleted file mode 100644
index 96d072c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail82/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{}
-class X{
-	class B extends A{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail83/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail83/in/A.java
deleted file mode 100644
index ffe08d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail83/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//can't rename A to Cloneable
-package p;
-interface A{}
-class X{
-	void m(){
-		class C implements A, Cloneable{}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail84/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail84/in/A.java
deleted file mode 100644
index 236e5c2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail84/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-//can't rename A to List
-package p;
-import java.util.List;
-class A{}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail85/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail85/in/A.java
deleted file mode 100644
index 7e9bfb1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail85/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	class C{
-		class D{
-			native void n();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail86/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail86/in/A.java
deleted file mode 100644
index fef1289..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail86/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{}
-class C{
-	native void n(A a);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail87/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail87/in/A.java
deleted file mode 100644
index 9c0c81c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail87/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{}
-class C{
-	class D{
-		native void n(A a);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail88/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail88/in/A.java
deleted file mode 100644
index 2c1bc51..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail88/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void m(){
-		class C{
-			native void m();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail89/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail89/in/A.java
deleted file mode 100644
index da0e6dd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail89/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	class Inner{
-		void m(){
-			class C{
-				native void m();
-			}
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail9/in/A.java
deleted file mode 100644
index 8c0da8d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail9/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-class A{
-  class B{}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail90/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail90/in/A.java
deleted file mode 100644
index 51cffbb6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail90/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-public class A{
-	public static int length(){ return 0;};
-}
-class F{
-	static class B{
-		public static int length(){ return 42;};
-	};
-}
-class FF extends F{
-	int m(){
-		return A.length();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail91/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail91/in/A.java
deleted file mode 100644
index a830c1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail91/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-public class A{
-	public static int length(){ return 0;};
-}
-interface I{
-	static class B{
-		public static int length(){ return 0;};
-	}
-}
-class FF implements I{
-	int m(){
-		return A.length();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail92/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail92/in/A.java
deleted file mode 100644
index 639b145..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail92/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-public class A{
-	void f(){
-		class X{
-			class B{}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail93/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail93/in/A.java
deleted file mode 100644
index 40039ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail93/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class A{
-	void f(){
-		class X{
-			class B{
-				native void m();
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail94/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail94/in/A.java
deleted file mode 100644
index ff0cb15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail94/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{}
-class B{
-	native void m(A a);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail95/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail95/in/A.java
deleted file mode 100644
index ac49ce4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFail95/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A {
-	class Z {
-		void o() {
-			{
-				class F {
-					{
-						class B {
-							void hj() {
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFailRegression1GCRKMQ/in/Blinky.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFailRegression1GCRKMQ/in/Blinky.java
deleted file mode 100644
index 4140567..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testFailRegression1GCRKMQ/in/Blinky.java
+++ /dev/null
@@ -1,9 +0,0 @@
-import java.util.*; 
-import java.io.File;
-
-public class Blinky{
-
-	public static void main(String[] args) {
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalInnerClass/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalInnerClass/in/A.java
deleted file mode 100644
index b376073..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalInnerClass/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-  class A{}
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName1/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName1/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName2/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName2/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName3/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName3/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName4/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName4/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName5/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName5/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName6/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName6/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName7/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName7/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName8/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName8/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName9/in/A.java
deleted file mode 100644
index 2ffd296..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testIllegalTypeName9/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A {
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testNoOp/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testNoOp/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testNoOp/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/in/A.java
deleted file mode 100644
index 23fae3e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class A {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/in/build.xml b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/in/build.xml
deleted file mode 100644
index 20d736e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/in/build.xml
+++ /dev/null
@@ -1 +0,0 @@
-p.A
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/out/B.java
deleted file mode 100644
index 4059e22..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-
-class B {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/out/build.xml b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/out/build.xml
deleted file mode 100644
index efbc725..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testQualifiedName1/out/build.xml
+++ /dev/null
@@ -1 +0,0 @@
-p.B
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg1/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg1/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg2/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg2/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg3/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg3/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg4/in/A.java
deleted file mode 100644
index 6f63ab9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameType/testWrongArg4/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A {
-}
-class B extends A{
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test1/in/A.java
deleted file mode 100644
index b390b33..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test1/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//renaming A.m to k
-abstract class A {
-	abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test1/out/A.java
deleted file mode 100644
index 1c62c61..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test1/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//renaming A.m to k
-abstract class A {
-	abstract void k();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test10/in/A.java
deleted file mode 100644
index 189c1ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test10/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	void m(){}
-}
-class B {
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test10/out/A.java
deleted file mode 100644
index 39cbee9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test10/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	void k(){}
-}
-class B {
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test11/in/A.java
deleted file mode 100644
index 73b0420f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test11/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	void m(){}
-}
-class B extends A{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test11/out/A.java
deleted file mode 100644
index 43cb647..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test11/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	void k(){}
-}
-class B extends A{
-	void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test12/in/A.java
deleted file mode 100644
index eba14d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test12/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	void m(){}
-}
-class B extends A{
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test12/out/A.java
deleted file mode 100644
index dff6414..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test12/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m to k
-class A {
-	void k(){}
-}
-class B extends A{
-	public void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test13/in/A.java
deleted file mode 100644
index 0e114b1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test13/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void m(){
-	}
-	void f(){
-		m();
-	}
-}
-class A extends B{
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test13/out/A.java
deleted file mode 100644
index aa8b9db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test13/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void m(){
-	}
-	void f(){
-		m();
-	}
-}
-class A extends B{
-	void k(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test14/in/A.java
deleted file mode 100644
index 962ae44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test14/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void k(){
-	}
-	void f(){
-		k();
-	}
-}
-class A extends B{
-	void m(){
-	}
-	void f(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test14/out/A.java
deleted file mode 100644
index 978ee42..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test14/out/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void k(){
-	}
-	void f(){
-		k();
-	}
-}
-class A extends B{
-	void k(){
-	}
-	void f(){
-		k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test15/in/A.java
deleted file mode 100644
index 0dc48af..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test15/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test15/out/A.java
deleted file mode 100644
index 1459a9a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test15/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	int k(int m){
-		return k(k(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test16/in/A.java
deleted file mode 100644
index ab6d0b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test16/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to fred
-class A{
-	int m(int m){
-		return m(m(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test16/out/A.java
deleted file mode 100644
index f701b63..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test16/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//renaming A.m to fred
-class A{
-	int fred(int m){
-		return fred(fred(m));
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test17/in/A.java
deleted file mode 100644
index 9e7294f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test17/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming A.m to kk
-package p;
-public class A {
-	void m(int m){}
-}
-class B extends A{
-	void m(boolean m){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test17/out/A.java
deleted file mode 100644
index 4c21116..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test17/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming A.m to kk
-package p;
-public class A {
-	void kk(int m){}
-}
-class B extends A{
-	void m(boolean m){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/in/A.java
deleted file mode 100644
index 6208aa1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming B.m to kk
-package p;
-class B {
-	void m(int m) {
-	}
-
-}
-public class A extends B {
-	void m(int m) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/in/C.java
deleted file mode 100644
index 4794cc8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/in/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class C{
-	void k(){
-		new A().m(4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/out/A.java
deleted file mode 100644
index 763c416..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming B.m to kk
-package p;
-class B {
-	void kk(int m) {
-	}
-
-}
-public class A extends B {
-	void kk(int m) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/out/C.java
deleted file mode 100644
index 493535e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test18/out/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class C{
-	void k(){
-		new A().kk(4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test19/in/A.java
deleted file mode 100644
index 00408da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test19/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	void m() {
-	}
-}
-
-class B{
-	void k(){
-		A a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test19/out/A.java
deleted file mode 100644
index ce31818..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test19/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	void fred() {
-	}
-}
-
-class B{
-	void k(){
-		A a= new A();
-		a.fred();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test2/in/A.java
deleted file mode 100644
index 34ca89c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test2/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	void m() {
-	}
-}
-
-class B{
-	void k(){
-		A a= new A();
-		a
-		.
-		m ();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test2/out/A.java
deleted file mode 100644
index d7ddb59..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test2/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	void fred() {
-	}
-}
-
-class B{
-	void k(){
-		A a= new A();
-		a
-		.
-		fred ();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test20/in/A.java
deleted file mode 100644
index 726d3fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test20/in/A.java
+++ /dev/null
@@ -1,25 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	int m(int m) {
-		return m	(	m	)	;
-	}
-}
-
-class B{
-	void k(){
-		A a= new A();
-		a
-	.
-		m 
-			(
-			a
-				.
-	m	
-				(
-					6
-			)	
-			
-		);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test20/out/A.java
deleted file mode 100644
index 0750d28..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test20/out/A.java
+++ /dev/null
@@ -1,25 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	int fred(int m) {
-		return fred	(	m	)	;
-	}
-}
-
-class B{
-	void k(){
-		A a= new A();
-		a
-	.
-		fred 
-			(
-			a
-				.
-	fred	
-				(
-					6
-			)	
-			
-		);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test21/in/A.java
deleted file mode 100644
index 4d69649..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test21/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	int m(int m) {
-		return m	(	m	)	;
-	}
-}
-class B extends A{
-	void f(){
-		super .
-		m (4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test21/out/A.java
deleted file mode 100644
index e16a39c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test21/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-//renaming A.m to fred
-package p;
-public class A{
-	int fred(int m) {
-		return fred	(	m	)	;
-	}
-}
-class B extends A{
-	void f(){
-		super .
-		fred (4);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test22/in/A.java
deleted file mode 100644
index 56d0efa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test22/in/A.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void m(){
-		System.out.println("B.m");	
-	}
-	void fred(){
-		m();
-		B b= new B();
-		b.m();	
-		B b1= new A();
-		b1.m();
-		B bc= new C();
-		bc.m();
-		
-		A ba= new A();
-		ba.m();
-		A ac= new C();
-		ac.m();
-		C c= new C();
-		c.m();
-		
-	}
-}
-class A extends B{
-	void m(){
-		System.out.println("A.m");	
-	}
-}
-class C extends A{
-	void m(){
-		System.out.println("C.m");	
-	}
-}
-
-class test{
-	public static void main(String[] args){
-		new B().fred();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test22/out/A.java
deleted file mode 100644
index c09b947..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test22/out/A.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package p;
-//renaming A.m to k
-class B{
-	private void m(){
-		System.out.println("B.m");	
-	}
-	void fred(){
-		m();
-		B b= new B();
-		b.m();	
-		B b1= new A();
-		b1.m();
-		B bc= new C();
-		bc.m();
-		
-		A ba= new A();
-		ba.k();
-		A ac= new C();
-		ac.k();
-		C c= new C();
-		c.k();
-		
-	}
-}
-class A extends B{
-	void k(){
-		System.out.println("A.m");	
-	}
-}
-class C extends A{
-	void k(){
-		System.out.println("C.m");	
-	}
-}
-
-class test{
-	public static void main(String[] args){
-		new B().fred();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test23/in/A.java
deleted file mode 100644
index 34da048..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test23/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	void m(){
-	}
-}
-class test{
-	void m(){
-		class X extends A{
-			void m(){}
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test23/out/A.java
deleted file mode 100644
index ad18f1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test23/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	void k(){
-	}
-}
-class test{
-	void k(){
-		class X extends A{
-			void k(){}
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test24/in/A.java
deleted file mode 100644
index 751eff5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test24/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	void m(String s){
-	}
-}
-class B extends A{
-	void m(java.lang.String s){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test24/out/A.java
deleted file mode 100644
index 692f888..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test24/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//renaming A.m to k
-class A{
-	void k(String s){
-	}
-}
-class B extends A{
-	void k(java.lang.String s){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test25/in/A.java
deleted file mode 100644
index b7498e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test25/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void m(){
-		System.out.println("a");
-	}
-	class B{
-		class C {
-			void f(){
-				m();
-			}
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test25/out/A.java
deleted file mode 100644
index a0ccb4d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test25/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void k(){
-		System.out.println("a");
-	}
-	class B{
-		class C {
-			void f(){
-				k();
-			}
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test26/in/A.java
deleted file mode 100644
index a89eb28..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test26/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void m(){}
-}
-class B{
-	static {
-		new A().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test26/out/A.java
deleted file mode 100644
index 0f715d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test26/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void k(){}
-}
-class B{
-	static {
-		new A().k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test27/in/A.java
deleted file mode 100644
index 23de065..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test27/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void m(){}
-}
-class B{
-	{
-		new A().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test27/out/A.java
deleted file mode 100644
index 6b618dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test27/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void k(){}
-}
-class B{
-	{
-		new A().k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test28/in/A.java
deleted file mode 100644
index 4a44acd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test28/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void m(){}
-	{
-		new A().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test28/out/A.java
deleted file mode 100644
index 73719a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test28/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void k(){}
-	{
-		new A().k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test29/in/A.java
deleted file mode 100644
index d3cb7ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test29/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void m(){}
-	static {
-		new A().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test29/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test29/out/A.java
deleted file mode 100644
index 833cebf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test29/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void k(){}
-	static {
-		new A().k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test30/in/A.java
deleted file mode 100644
index 1fdbd9b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test30/in/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class B{
-	A f(){
-		return null;
-	}
-}
-
-class A{
-	B m(){
-		return null;
-	}
-}
-
-class C{
-	void f(B b){
-		b.f().m().f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test30/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test30/out/A.java
deleted file mode 100644
index cf5f404..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test30/out/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class B{
-	A f(){
-		return null;
-	}
-}
-
-class A{
-	B k(){
-		return null;
-	}
-}
-
-class C{
-	void f(B b){
-		b.f().k().f().k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test31/in/A.java
deleted file mode 100644
index 60f4b48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test31/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void m(){
-		this.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test31/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test31/out/A.java
deleted file mode 100644
index 5325623..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test31/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-//renaming A.m to k 
-package p;
-
-class A{
-	void k(){
-		this.k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test32/in/A.java
deleted file mode 100644
index db159df..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test32/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//no ref update
-//renaming A.m to k 
-package p;
-
-class A{
-	void m(){
-		this.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test32/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test32/out/A.java
deleted file mode 100644
index d129128..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test32/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-//no ref update
-//renaming A.m to k 
-package p;
-
-class A{
-	void k(){
-		this.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test33/in/A.java
deleted file mode 100644
index e955c8b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test33/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming A.m to k 
-package p;
-class A{
-	public void m(){}
-}
-
-class AQE extends A{
-	public void m(){
-		super.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test33/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test33/out/A.java
deleted file mode 100644
index 7eafaed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test33/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-//renaming A.m to k 
-package p;
-class A{
-	public void k(){}
-}
-
-class AQE extends A{
-	public void k(){
-		super.k();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test34/in/A.java
deleted file mode 100644
index 3a6c8d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test34/in/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A {
-/**
-*  Comment section
-*
-**/
-  public A() {
-  }
-
-  protected void A() {
-  }
-}
-
-class B extends A {
-  public B() {
-     super(); 
-  }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test34/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test34/out/A.java
deleted file mode 100644
index 3a6c8d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test34/out/A.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package p;
-class A {
-/**
-*  Comment section
-*
-**/
-  public A() {
-  }
-
-  protected void A() {
-  }
-}
-
-class B extends A {
-  public B() {
-     super(); 
-  }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test35/in/A.java
deleted file mode 100644
index 7f8b386..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test35/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-  protected void foo(Object o){}
-  protected void foo(String s){}
-}
-class B extends A{
-	protected void foo(Object o){}
-	protected void foo(String s){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test35/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test35/out/A.java
deleted file mode 100644
index f76e88f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test35/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A {
-  protected void bar(Object o){}
-  protected void foo(String s){}
-}
-class B extends A{
-	protected void bar(Object o){}
-	protected void foo(String s){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test36/in/A.java
deleted file mode 100644
index 065d28b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test36/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A extends F {
-  void foo(String s){}
-}
-class F {
-  void foo(F b){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test36/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test36/out/A.java
deleted file mode 100644
index de317ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test36/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A extends F {
-  void bar(String s){}
-}
-class F {
-  void foo(F b){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test37/in/A.java
deleted file mode 100644
index ccb0786..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test37/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-  void foo(A b){}
-}
-class F extends A {
-  void foo(String s){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test37/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test37/out/A.java
deleted file mode 100644
index 85b0a81..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/test37/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A {
-  void bar(A b){}
-}
-class F extends A {
-  void foo(String s){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testAnon0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testAnon0/in/A.java
deleted file mode 100644
index 09ece35..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testAnon0/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-public class A {
-	void m(){}
-}
-class B{
-	void f(){
-		A a= new A(){
-			void m(){
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testAnon0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testAnon0/out/A.java
deleted file mode 100644
index 3ebde2a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testAnon0/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//renaming A.m to k
-public class A {
-	void k(){}
-}
-class B{
-	void f(){
-		A a= new A(){
-			void k(){
-			}
-		};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail0/in/A.java
deleted file mode 100644
index e6c4867..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail0/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//can't rename native methods
-class A{
- 	native m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail1/in/A.java
deleted file mode 100644
index 630221d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail1/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//toString can't be renamed - it's a special case (it's called implicitly)
- class A{
-	public String toString(){
-		return null;
-	}; 	
- }
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail10/in/A.java
deleted file mode 100644
index f7b9bb4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail10/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k
-class B{
-	void k(){}
-}
-class A extends B{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail11/in/A.java
deleted file mode 100644
index 5f055ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail11/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k
-class B{
-	static void k(){}
-}
-class A extends B{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail12/in/A.java
deleted file mode 100644
index 9c02f0c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail12/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k
-class B{
-	void k(){}
-}
-abstract class A extends B{
-	abstract void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail13/in/A.java
deleted file mode 100644
index 4333b65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail13/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k
-abstract class B{
-	abstract void k();
-}
-class A extends B{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail14/in/A.java
deleted file mode 100644
index e835268..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail14/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k
-class B{
-	void k(int x){}
-}
-class A extends B{
-	void m(int f){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail15/in/A.java
deleted file mode 100644
index c1f7d7b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail15/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename m to k
-class C {
-	void k(){}
-}
-class B extends C{
-}
-class A extends B{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail17/in/A.java
deleted file mode 100644
index 9eb829a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail17/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//renaming A.m would require renaming a native method
-class A {
-	void m(){}
-}
-class B extends A{
-	native void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail18/in/A.java
deleted file mode 100644
index a1da779..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail18/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k - defined in subclass
-class A {
-	void m(){}
-}
-class B extends A{
-	private void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail19/in/A.java
deleted file mode 100644
index 8b3a74e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail19/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k - defined in subclass
-class A {
-	void m(){}
-}
-class B extends A{
-	public void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail2/in/A.java
deleted file mode 100644
index 6ef68c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail2/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m in A  - must do it in B
-class B{
-	void m(){}
-}
-class A extends B{
-	void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail20/in/A.java
deleted file mode 100644
index 90c07d1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail20/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename m to k - defined in subclass
-class A {
-	void m(){
-	}
-}
-class B extends A{
-	public void k(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail21/in/A.java
deleted file mode 100644
index a16713b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail21/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename m to k - defined in subclass
-class A {
-	void m(){
-	}
-}
-class B extends A{
-	static void k(){
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail22/in/A.java
deleted file mode 100644
index 5a15474..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail22/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename m to k - defined in subclass
-class A {
-	void m(){
-	}
-}
-class B extends A{
-	private static void k(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail23/in/A.java
deleted file mode 100644
index 3d07a65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail23/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename A.m to k - defined in superclass
-class B {
-	void k(){
-	}
-}
-class A extends B{
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail24/in/A.java
deleted file mode 100644
index a53fdd9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail24/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename A.m to k - defined in superclass
-class B {
-	static void k(){
-	}
-}
-class A extends B{
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail25/in/A.java
deleted file mode 100644
index 3d07a65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail25/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename A.m to k - defined in superclass
-class B {
-	void k(){
-	}
-}
-class A extends B{
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail26/in/A.java
deleted file mode 100644
index 6b4353a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail26/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//can't rename A.m to k - duplicate
-class A {
-	void k(){}
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail27/in/A.java
deleted file mode 100644
index aba458a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail27/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//can't rename A.m to k - duplicate
-class A {
-	private void k(){}
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail28/in/A.java
deleted file mode 100644
index bf6ed6a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail28/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//can't rename A.m to k - duplicate
-class A {
-	static void k(){}
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail29/in/A.java
deleted file mode 100644
index 3af831e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail29/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename A.m - defined in superclass
-class B{
-	void m(){
-	}
-}
-class A extends B{
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail3/in/A.java
deleted file mode 100644
index 102bf12..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail3/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename m in A - must do it in B
-class B{
-	int m(){}
-}
-class C extends B{
-}
-class A extends C{
-	int m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail30/in/A.java
deleted file mode 100644
index d467ff8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail30/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename A.m - declared in superclass
-class B {
-	native void m();
-}
-class A extends B{
-	void m(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail31/in/A.java
deleted file mode 100644
index d756bca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail31/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//can't rename A.m to k
-package p;
-public class A {
-	void m(String m){
-		System.out.println("A");
-	}
-}
-class B extends A{
-	void k(Object m){
-		System.out.println("B");
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail32/in/A.java
deleted file mode 100644
index 8fcdbd8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail32/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-//can't rename A.m to k
-package p;
-public class A {
-	void m(Object m){
-		System.out.println("A");
-	}
-}
-class B extends A{
-	void k(String m){
-		System.out.println("B");
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail33/in/A.java
deleted file mode 100644
index c917be1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail33/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-//can't rename A.toString
-package p;
-class A{
-	public java.lang.String toString(){
-		return "fred";
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail34/in/A.java
deleted file mode 100644
index 1c72cc2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail34/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename A.m to k
-class A{
-	void m(String s){
-	}
-}
-class B extends A{
-	void k(java.lang.String s){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail35/in/A.java
deleted file mode 100644
index 237d8d3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail35/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-//can't rename A.m to k
-package p;
-class A{
-	void m(){
-	}
-}
-class X{
-	void k(){
-	}
-	class B{
-		void k(){
-		}
-		class C extends A{
-			void f(){
-				m();
-			}
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail36/in/A.java
deleted file mode 100644
index 98e2eed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail36/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename A.m to k
-class B{
-	static void k(){}	
-}
-class A extends B{
- 	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail37/in/A.java
deleted file mode 100644
index d4c4e40..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail37/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename A.m to k
-class A{
-	void m(){};
-}
-class B extends A{
- 	static public void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail38/in/A.java
deleted file mode 100644
index 524f740..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail38/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//can't rename A.m to k
-class A{
-	void m(){};
-	class B {
-		void k(){
-			m();
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail4/in/A.java
deleted file mode 100644
index 3fc227b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail4/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-//renaming m in A would require renaming it in I
-class A{
- public void m(){}
-}
-
-class B extends A implements I{
-}
-
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail5/in/A.java
deleted file mode 100644
index ff8d75e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail5/in/A.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-//renaming m in A would require renaming it in I
-class A{
- 	public void m(){}
-}
-
-class B extends A implements I2{
-}
-
-
-interface I {
-	void m();
-}
-
-interface I2 extends I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail6/in/A.java
deleted file mode 100644
index 7d0529c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail6/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//renaming m in A would require renaming it in I
-class A implements I{
-	void m(){}
-}
-
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail7/in/A.java
deleted file mode 100644
index 64b78f3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail7/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//can't rename m to k
-class A{
-	void m(){}
-	void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail8/in/A.java
deleted file mode 100644
index b3f4cac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail8/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//can't rename m to k
-class A{
-	void m(){}
-}
-class B extends A{
-	void k(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail9/in/A.java
deleted file mode 100644
index fe8816e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testFail9/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//can't rename m to k
-class A{
-	int m(int i){}
-}
-class B extends A{
-	
-}
-class C extends B{
-	int k(int i){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testLocal0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testLocal0/in/A.java
deleted file mode 100644
index ed6caf7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testLocal0/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A {
-  void m() {
-  }
-  void baz() {
-  	class B extends A {
-  		void m() {
-  		}
-  		
-  	}
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testLocal0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testLocal0/out/A.java
deleted file mode 100644
index 8dfe74b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/RenameVirtualMethodInClass/testLocal0/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-class A {
-  void k() {
-  }
-  void baz() {
-  	class B extends A {
-  		void k() {
-  		}
-  		
-  	}
-  }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/A.java
deleted file mode 100644
index 10b23af..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/B.java
deleted file mode 100644
index 8a349d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class B{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/launcher.gif b/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/launcher.gif
deleted file mode 100644
index 961894a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/launcher.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/p1/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/p1/A.java
deleted file mode 100644
index fd8eb8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/ReorgTests/p1/A.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p1;
-class A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail0/in/A.java
deleted file mode 100644
index 3b19265..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail0/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A{}
-class B extends A{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail1/in/A.java
deleted file mode 100644
index 9d71109..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail1/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{}
-class B 
-{
-	void v(){
-	new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail10/in/A.java
deleted file mode 100644
index ecd28f7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail10/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-static int x(){
-	A.x();
-};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail11/in/A.java
deleted file mode 100644
index 4389790..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail11/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-class B{
-	void d(){
-		new A();
-	}
-}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail12/in/A.java
deleted file mode 100644
index c19b365..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail12/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{}
-class B{
-	void f(){
-		new A(){
-			void k(){}
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail13/in/A.java
deleted file mode 100644
index 1a3a47f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail13/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-}
-class B{
-	void x(){
-		class X extends A(){
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail14/in/A.java
deleted file mode 100644
index f13d2a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail14/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	class B{
-	}
-}
-class C{
-	void b(){
-		A.B g;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail15/in/A.java
deleted file mode 100644
index 6fdf183..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail15/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{}
-class B 
-{
-	void v(A a){
-	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail16/in/A.java
deleted file mode 100644
index 56fb44c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail16/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-}
-class B{
-	void f(){
-		Object d= A.class;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail17/in/A.java
deleted file mode 100644
index 15dc856..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail17/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-static int x(){};
-}
-class B{
-	void f(){
-		Object f= (A)new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail18/in/A.java
deleted file mode 100644
index 4092371..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail18/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	class B{}
-}
-class C{
-	void f(){
-		new A().new B();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail19/in/A.java
deleted file mode 100644
index b9f3830..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail19/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface I{}
-class B implements A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail2/in/A.java
deleted file mode 100644
index eb9849f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail2/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-}
-class B{
-	A f(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail20/in/A.java
deleted file mode 100644
index 6f946e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail20/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A extends Exception{
-}
-class B{
- void m() throws A{
- }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail21/in/A.java
deleted file mode 100644
index 75dbf31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail21/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-class A extends Exception{
- void m() throws A{
- }
-	void j(){
- 	try{
- 		m();
- 	}
- 	catch (A a){
- 	}
- }
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail3/in/A.java
deleted file mode 100644
index 85e031d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail3/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-static int x(){};
-}
-class B{
-	void g(){A.x();}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail4/in/A.java
deleted file mode 100644
index 1362380..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail4/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{}
-class B{
- {
-  new A();
- }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail5/in/A.java
deleted file mode 100644
index 780bc11..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail5/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{}
-class B{
- static {
-  new A();
- }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail6/in/A.java
deleted file mode 100644
index 47efdd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail6/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-static int x(){};
-}
-class B{
-	class C{
-		void f(){
-		new A();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail7/in/A.java
deleted file mode 100644
index 1c6765e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail7/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-static int x(){};
-}
-class B{
-	class C extends A{
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail8/in/A.java
deleted file mode 100644
index 08b5afd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail8/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		new A();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail9/in/A.java
deleted file mode 100644
index 4b7553a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SafeDeleteType/testFail9/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-static int x;
-	void a(){
-	A.x= A.x;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/.cvsignore
deleted file mode 100644
index f59f514..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.metadata
-bin
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.cvsignore
deleted file mode 100644
index 4fdcfd7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-bin
-.classpath
-*.class
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.project b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.project
deleted file mode 100644
index 3605d74..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>SefTests</name>
-	<comment></comment>
-	<projects>
-	</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/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/A.java
deleted file mode 100644
index 287ef37..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-public class A {
-	public int field;
-	
-	public void foo() {
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/X.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/X.java
deleted file mode 100644
index 2f8058f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/X.java
+++ /dev/null
@@ -1,11 +0,0 @@
-public class X {
-	private String fField;
-
-	protected void setField(String field) {
-		fField = field;
-	}
-
-	protected String getField() {
-		return fField;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/Y.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/Y.java
deleted file mode 100644
index 5a675a8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/Y.java
+++ /dev/null
@@ -1,5 +0,0 @@
-public class Y extends X {
-	void foo() {
-		setField("d");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestFinal.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestFinal.java
deleted file mode 100644
index 25a186b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestFinal.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package base_in;
-
-public class TestFinal {
-	final int field= 0;
-	
-	public void foo() {
-		int i= field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPostfixInt.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPostfixInt.java
deleted file mode 100644
index ec1e90b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPostfixInt.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package base_in;
-
-public class TestPostfixInt {
-	int field;
-	
-	public void foo() {
-		field++;
-		field--;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPrefixBoolean.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPrefixBoolean.java
deleted file mode 100644
index a4a6fd0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPrefixBoolean.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package base_in;
-
-public class TestPrefixBoolean {
-	boolean field;
-	
-	public void foo() {
-		boolean b;
-		b= !field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPrefixInt.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPrefixInt.java
deleted file mode 100644
index dadb237..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestPrefixInt.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package base_in;
-
-public class TestPrefixInt {
-	int field;
-	
-	public void foo() {
-		++field;
-		--field;
-		int i;
-		i= +field;
-		i= - field;
-		i= ~field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestThisExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestThisExpression.java
deleted file mode 100644
index 633d90f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestThisExpression.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package base_in;
-
-public class TestThisExpression {
-	int field;
-	
-	public void foo() {
-		this.field= 10;
-		new TestThisExpression().field= 11;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestThisExpressionInner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestThisExpressionInner.java
deleted file mode 100644
index 9e3c546..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_in/TestThisExpressionInner.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package base_in;
-
-public class TestThisExpressionInner {
-	int field;
-
-	class Inner {
-		int field;
-		public void foo() {
-			field= 10;
-			TestThisExpressionInner.this.field= 11;
-		}
-	}
-	
-	public void foo() {
-		field= 10;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestFinal.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestFinal.java
deleted file mode 100644
index 1ee5640..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestFinal.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package base_out;
-
-public class TestFinal {
-	private final int field= 0;
-	
-	public void foo() {
-		int i= getField();
-	}
-
-	int getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPostfixInt.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPostfixInt.java
deleted file mode 100644
index edeae91..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPostfixInt.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package base_out;
-
-public class TestPostfixInt {
-	private int field;
-	
-	public void foo() {
-		setField(getField() + 1);
-		setField(getField() - 1);
-	}
-
-	void setField(int field) {
-		this.field = field;
-	}
-
-	int getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPrefixBoolean.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPrefixBoolean.java
deleted file mode 100644
index df465c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPrefixBoolean.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package base_out;
-
-public class TestPrefixBoolean {
-	private boolean field;
-	
-	public void foo() {
-		boolean b;
-		b= !isField();
-	}
-
-	void setField(boolean field) {
-		this.field = field;
-	}
-
-	boolean isField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPrefixInt.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPrefixInt.java
deleted file mode 100644
index 0423ebf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestPrefixInt.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package base_out;
-
-public class TestPrefixInt {
-	private int field;
-	
-	public void foo() {
-		setField(getField() + 1);
-		setField(getField() - 1);
-		int i;
-		i= +getField();
-		i= - getField();
-		i= ~getField();
-	}
-
-	void setField(int field) {
-		this.field = field;
-	}
-
-	int getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestThisExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestThisExpression.java
deleted file mode 100644
index a8f8679..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestThisExpression.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package base_out;
-
-public class TestThisExpression {
-	private int field;
-	
-	public void foo() {
-		this.setField(10);
-		new TestThisExpression().setField(11);
-	}
-
-	void setField(int field) {
-		this.field = field;
-	}
-
-	int getField() {
-		return field;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestThisExpressionInner.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestThisExpressionInner.java
deleted file mode 100644
index ca4b78a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/base_out/TestThisExpressionInner.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package base_out;
-
-public class TestThisExpressionInner {
-	private int field;
-
-	class Inner {
-		int field;
-		public void foo() {
-			field= 10;
-			TestThisExpressionInner.this.setField(11);
-		}
-	}
-	
-	public void foo() {
-		setField(10);
-	}
-
-	void setField(int field) {
-		this.field = field;
-	}
-
-	int getField() {
-		return field;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/bb.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/bb.java
deleted file mode 100644
index 9738665..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/bb.java
+++ /dev/null
@@ -1,3 +0,0 @@
-public class bb {
-	public static Object bb;
-}	
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/invalid/TestInvalidOverwrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/invalid/TestInvalidOverwrite.java
deleted file mode 100644
index e8bed86..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/invalid/TestInvalidOverwrite.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalid;
-
-public class TestInvalidOverwrite extends A {
-	public int field;
-}
-
-class A {
-	public Class getField() {
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/invalid/TestPostfixExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/invalid/TestPostfixExpression.java
deleted file mode 100644
index 196adc4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/invalid/TestPostfixExpression.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalid;
-
-public class TestPostfixExpression {
-	int field;
-	
-	public void foo() {
-		int i;
-		i= field++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestArrayRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestArrayRead.java
deleted file mode 100644
index d34a01b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestArrayRead.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package object_in;
-
-public class TestArrayRead {
-	private Object[] field;
-
-	public TestArrayRead() {
-		field= new Object[0];
-	}
-	public void basicRun() {
-		System.err.println(field.length);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite.java
deleted file mode 100644
index 6c33a90..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package object_in;
-
-public class TestCompoundWrite {
-	String field;
-	
-	public void foo() {
-		field+= "d";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite2.java
deleted file mode 100644
index a472092..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite2.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package object_in;
-
-public class TestCompoundWrite2 {
-	String field;
-	
-	public void foo() {
-		field+= "d" + "e";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite3.java
deleted file mode 100644
index 1705e30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestCompoundWrite3.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package object_in;
-
-public class TestCompoundWrite3 {
-	TestCompoundWrite3 a;
-	String field;
-	
-	public void foo() {
-		a.a.field+= "d";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestFinalField.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestFinalField.java
deleted file mode 100644
index df16e5d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestFinalField.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package object_in;
-
-public class TestFinalField {
-	private final Object field;
-	TestFinalField(Object y) {
-		field = y;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestNestedRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestNestedRead.java
deleted file mode 100644
index 4787ec9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestNestedRead.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package object_in;
-
-public class TestNestedRead {
-	public TestNestedRead field;
-	public int i;
-	
-	public int foo() {
-		return field.field.field.field.i;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterAsReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterAsReceiver.java
deleted file mode 100644
index 84a383e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterAsReceiver.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package object_in;
-
-public class TestSetterAsReceiver {
-	String field;
-	
-	public void foo() {
-		TestSetterAsReceiver a= null;
-		(a.field= "d").length();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInAssignment.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInAssignment.java
deleted file mode 100644
index 3e49e76..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInAssignment.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package object_in;
-
-public class TestSetterInAssignment {
-	String field;
-	
-	public void foo() {
-		TestSetterInAssignment a= null;
-		String t= null;
-		t= a.field= "d";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInExpression.java
deleted file mode 100644
index 9d21604..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInExpression.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package object_in;
-
-public class TestSetterInExpression {
-	String field;
-	
-	public void foo() {
-		TestSetterInExpression a= null;
-		if ((a.field= "d") == "d")
-			foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInInitialization.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInInitialization.java
deleted file mode 100644
index 26ca7ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSetterInInitialization.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package object_in;
-
-public class TestSetterInInitialization {
-	String field;
-	
-	public void foo() {
-		TestSetterInInitialization a= null;
-		String t= a.field= "d";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleRead.java
deleted file mode 100644
index 88fd832..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleRead.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package object_in;
-
-public class TestSimpleRead {
-	public String field;
-	
-	public void foo() {
-		String s= field;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleReadWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleReadWrite.java
deleted file mode 100644
index 32e4d92..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleReadWrite.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package object_in;
-
-public class TestSimpleReadWrite {
-	public String field;
-	
-	public void foo() {
-		field= field + "field";
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleWrite.java
deleted file mode 100644
index cda6ebc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_in/TestSimpleWrite.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package object_in;
-
-public class TestSimpleWrite {
-	public String field;
-	
-	public void foo() {
-		field= "field";
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestArrayRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestArrayRead.java
deleted file mode 100644
index ff5fbaf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestArrayRead.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package object_out;
-
-public class TestArrayRead {
-	private Object[] field;
-
-	public TestArrayRead() {
-		setField(new Object[0]);
-	}
-	private void setField(Object[] field) {
-		this.field = field;
-	}
-	private Object[] getField() {
-		return field;
-	}
-	public void basicRun() {
-		System.err.println(getField().length);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite.java
deleted file mode 100644
index adea2cc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package object_out;
-
-public class TestCompoundWrite {
-	private String field;
-	
-	public void foo() {
-		setField(getField() + "d");
-	}
-
-	void setField(String field) {
-		this.field = field;
-	}
-
-	String getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite2.java
deleted file mode 100644
index 3510e95..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite2.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package object_out;
-
-public class TestCompoundWrite2 {
-	private String field;
-	
-	public void foo() {
-		setField(getField() + ("d" + "e"));
-	}
-
-	void setField(String field) {
-		this.field = field;
-	}
-
-	String getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite3.java
deleted file mode 100644
index 0386cf4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestCompoundWrite3.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package object_out;
-
-public class TestCompoundWrite3 {
-	TestCompoundWrite3 a;
-	private String field;
-	
-	public void foo() {
-		a.a.setField(a.a.getField() + "d");
-	}
-
-	void setField(String field) {
-		this.field = field;
-	}
-
-	String getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestFinalField.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestFinalField.java
deleted file mode 100644
index ea472dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestFinalField.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package object_out;
-
-public class TestFinalField {
-	private final Object field;
-	TestFinalField(Object y) {
-		field = y;
-	}
-	private Object getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestNestedRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestNestedRead.java
deleted file mode 100644
index 89d89b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestNestedRead.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package object_out;
-
-public class TestNestedRead {
-	private TestNestedRead field;
-	public int i;
-	
-	public int foo() {
-		return getField().getField().getField().getField().i;
-	}
-
-	public void setField(TestNestedRead field) {
-		this.field = field;
-	}
-
-	public TestNestedRead getField() {
-		return field;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterAsReceiver.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterAsReceiver.java
deleted file mode 100644
index 73af17e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterAsReceiver.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package object_out;
-
-public class TestSetterAsReceiver {
-	private String field;
-	
-	public void foo() {
-		TestSetterAsReceiver a= null;
-		(a.setField("d")).length();
-	}
-
-	String setField(String field) {
-		return this.field = field;
-	}
-
-	String getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInAssignment.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInAssignment.java
deleted file mode 100644
index e2fc0ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInAssignment.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package object_out;
-
-public class TestSetterInAssignment {
-	private String field;
-	
-	public void foo() {
-		TestSetterInAssignment a= null;
-		String t= null;
-		t= a.setField("d");
-	}
-
-	String setField(String field) {
-		return this.field = field;
-	}
-
-	String getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInExpression.java
deleted file mode 100644
index 4928121..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInExpression.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package object_out;
-
-public class TestSetterInExpression {
-	private String field;
-	
-	public void foo() {
-		TestSetterInExpression a= null;
-		if ((a.setField("d")) == "d")
-			foo();
-	}
-
-	String setField(String field) {
-		return this.field = field;
-	}
-
-	String getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInInitialization.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInInitialization.java
deleted file mode 100644
index ad359ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSetterInInitialization.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package object_out;
-
-public class TestSetterInInitialization {
-	private String field;
-	
-	public void foo() {
-		TestSetterInInitialization a= null;
-		String t= a.setField("d");
-	}
-
-	String setField(String field) {
-		return this.field = field;
-	}
-
-	String getField() {
-		return field;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleRead.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleRead.java
deleted file mode 100644
index 43d9fe4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleRead.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package object_out;
-
-public class TestSimpleRead {
-	private String field;
-	
-	public void foo() {
-		String s= getField();
-	}
-
-	public void setField(String field) {
-		this.field = field;
-	}
-
-	public String getField() {
-		return field;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleReadWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleReadWrite.java
deleted file mode 100644
index 5a6a56a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleReadWrite.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package object_out;
-
-public class TestSimpleReadWrite {
-	private String field;
-	
-	public void foo() {
-		setField(getField() + "field");
-	}
-
-	public void setField(String field) {
-		this.field = field;
-	}
-
-	public String getField() {
-		return field;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleWrite.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleWrite.java
deleted file mode 100644
index e94c499..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SefWorkSpace/SefTests/object_out/TestSimpleWrite.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package object_out;
-
-public class TestSimpleWrite {
-	private String field;
-	
-	public void foo() {
-		setField("field");
-	}
-
-	public void setField(String field) {
-		this.field = field;
-	}
-
-	public String getField() {
-		return field;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/.cvsignore
deleted file mode 100644
index 48dd041..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-.metadata
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/.cvsignore
deleted file mode 100644
index 4fdcfd7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-bin
-.classpath
-*.class
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test010.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test010.java
deleted file mode 100644
index 880e1b6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test010.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test010 {
-	public void /*]*/foo() {
-		foo();
-	}/*[*/
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test011.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test011.java
deleted file mode 100644
index 1adf115..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test011.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test011 {
-	public void foo() {
-		/*]*/foo(/*[*/);
-	}
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test012.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test012.java
deleted file mode 100644
index c89c75f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test012.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test012 {
-	public void foo() {
-		/*]*/f();
-		g(/*[*/);
-	}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test013.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test013.java
deleted file mode 100644
index b92d74d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test013.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test013 {
-	public void foo() {/*[*/
-		f();
-		g();
-	}/*[*/
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test014.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test014.java
deleted file mode 100644
index de28005..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test014.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test014 {
-	public void foo() /*]*/{
-		foo();
-	}/*[*/
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test015.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test015.java
deleted file mode 100644
index 32e0e13..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test015.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package invalidSelection;
-
-public class A_test015 {
-	public void foo() /*]*/{
-		f();
-		g();
-	/*]*/}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test020.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test020.java
deleted file mode 100644
index d99ed0f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test020.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package invalidSelection;
-
-public class A_test020 {
-	public void foo(int x) {
-		switch(x) {
-			/*]*/case 10:
-				f();
-				break;/*[*/
-			case 11:
-				g();
-				break;
-			default:
-				f();
-				g();		
-		}
-	}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test021.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test021.java
deleted file mode 100644
index a104c30..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test021.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package invalidSelection;
-
-public class A_test021 {
-	public void foo(int x) {
-		/*]*/switch(x) {
-			case 10:
-				f();
-				break;/*[*/
-			case 11:
-				g();
-				break;
-			default:
-				f();
-				g();		
-		}
-	}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test022.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test022.java
deleted file mode 100644
index e256a20..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test022.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package invalidSelection;
-
-public class A_test022 {
-	public void foo(int x) {
-		switch(x) {
-			/*]*/case 10:
-				f();
-				break;
-			case 11:
-				g();
-				break;
-			default:
-				f();
-				g();		
-		/*]*/}
-	}
-	
-	public void f() {
-	}
-	public void g() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test030.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test030.java
deleted file mode 100644
index 79812d7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test030.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test030 {
-	public void foo(int x) {
-		{/*[*/
-			f();
-		}/*[*/
-	}	
-	public void f() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test031.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test031.java
deleted file mode 100644
index b8fc35b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test031.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test031 {
-	public void foo(int x) {
-		/*]*/{
-			f();
-		/*]*/}
-	}	
-	public void f() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test040.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test040.java
deleted file mode 100644
index f7a17c4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test040.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test040 {
-	public void foo() {
-		for (int i= 0; i /*]*/</*[*/ 10; i++)
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test042.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test042.java
deleted file mode 100644
index 87baa6f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test042.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test042 {
-	public void foo() {
-		for (int i= 0; i < 10; /*]*/i++/*[*/)
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test043.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test043.java
deleted file mode 100644
index 6782f44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test043.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test043 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)/*[*/
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test044.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test044.java
deleted file mode 100644
index eba8d19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test044.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test044 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)
-			foo(/*[*/);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test045.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test045.java
deleted file mode 100644
index 8553338..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test045.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test045 {
-	public void foo() {
-		for /*]*/(int i= 0; i < 10; i++)
-			foo();/*[*/
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test046.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test046.java
deleted file mode 100644
index ad867fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test046.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test046 {
-	public void foo() {
-		for (int i= 10; i < 10; i++)
-			for (int z= 10; z < 10; z++)
-				/*]*/foo();
-		foo()/*[*/;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test047.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test047.java
deleted file mode 100644
index a84e445..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test047.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package invalidSelection;
-
-public class A_test047 {
-	public void foo() {
-		for (int i= 10; i < 10; i++)
-			/*]*/for (int z= 10; z < 10; z++)
-				foo();
-		foo()/*[*/;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test050.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test050.java
deleted file mode 100644
index 1321a16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test050.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test050 {
-	public void foo() {
-		while(1 /*]*/</*[*/ 10)
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test051.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test051.java
deleted file mode 100644
index e91b2d4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test051.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test051 {
-	public void foo() {
-		/*]*/while(1 < 10)/*[*/
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test052.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test052.java
deleted file mode 100644
index b374911..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test052.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package invalidSelection;
-
-public class A_test052 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		while(b())/*[*/
-			while(b())
-				foo();
-		foo()/*[*/;		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test060.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test060.java
deleted file mode 100644
index e1b6bdd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test060.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test060 {
-	public void foo() {
-		do 
-			foo();
-		while(100 /*]*/>/*[*/  10);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test061.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test061.java
deleted file mode 100644
index a1e56d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test061.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test061 {
-	public void foo() {
-		do 
-			/*]*/foo();
-		while(1 < 10);/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test062.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test062.java
deleted file mode 100644
index 4913526..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test062.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package invalidSelection;
-
-public class A_test062 {
-	public void foo() {
-		/*]*/do 
-			foo();/*[*/
-		while(1 < 10);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test063.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test063.java
deleted file mode 100644
index f5105cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test063.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-import invalidSelection.*;
-
-public class A_test063 {
-	public void foo() {
-		do/*[*/
-			foo();
-		/*]*/while(1 < 10);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test070.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test070.java
deleted file mode 100644
index f2b6365..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test070.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package invalidSelection;
-
-public class A_test070 {
-	public int foo() {
-		int i= foo();
-		switch/*[*/ (i) {
-			case 1:
-				foo();
-			case 2:
-				foo();
-				foo();
-			case 3:
-				foo();
-			default:
-				foo();	
-		}/*[*/
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test071.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test071.java
deleted file mode 100644
index 1e29c19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test071.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package invalidSelection;
-
-public class A_test071 {
-	public int foo() {
-		int i= foo();
-		/*]*/switch (i) {
-			case 1:
-				foo();
-			case 2:
-				foo();
-				foo();
-			case 3:
-				foo();
-			default:
-				foo();	
-		/*]*/}
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test072.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test072.java
deleted file mode 100644
index 786a188..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test072.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package invalidSelection;
-
-public class A_test072 {
-	public int foo() {
-		int i= foo();
-		switch (i) {
-			case 1/*]*/:
-				foo()/*[*/;
-			case 2:
-				foo();
-				foo();
-			case 3:
-				foo();
-			default:
-				foo();	
-		}
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test073.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test073.java
deleted file mode 100644
index 921196e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test073.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package invalidSelection;
-
-public class A_test073 {
-	public int foo() {
-		int i= foo();
-		switch (i) {
-			case 1:/*[*/
-				foo();
-			case/*[*/2:
-				foo();
-				foo();
-			case 3:
-				foo();
-			default:
-				foo();	
-		}
-		return i;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test081.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test081.java
deleted file mode 100644
index 088e444..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test081.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test081 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();
-		else
-			/*]*/foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test082.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test082.java
deleted file mode 100644
index 8e1e3bc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test082.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test082 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();/*[*/
-		else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test083.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test083.java
deleted file mode 100644
index 05af41d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test083.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test083 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();
-		/*]*/else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test084.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test084.java
deleted file mode 100644
index 42cf868..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test084.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test084 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();
-		else/*[*/
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test085.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test085.java
deleted file mode 100644
index 7969c16..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test085.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test085 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			foo();
-		/*]*/else
-			foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test100.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test100.java
deleted file mode 100644
index 8113e0b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test100.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test100 {
-	public void foo() {
-		try /*]*/{
-			foo();
-		}/*[*/ catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test101.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test101.java
deleted file mode 100644
index 26e171f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test101.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test101 {
-	public void foo() {
-		try /*]*/{
-			foo();
-		/*]*/} catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test102.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test102.java
deleted file mode 100644
index 39fd3ff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test102.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test102 {
-	public void foo() {
-		try {/*[*/
-			foo();
-		}/*[*/ catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test103.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test103.java
deleted file mode 100644
index ffe0310..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test103.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test103 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) /*]*/{
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test104.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test104.java
deleted file mode 100644
index 6bb367b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test104.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test104 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {/*[*/
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test105.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test105.java
deleted file mode 100644
index d8f6c1f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test105.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test105 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) /*]*/{
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test106.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test106.java
deleted file mode 100644
index d5c166f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test106.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test106 {
-	public void foo() {
-		try {
-			foo();
-		} finally /*]*/{
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test107.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test107.java
deleted file mode 100644
index 4d8f1bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test107.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test107 {
-	public void foo() {
-		try {
-			foo();
-		} finally {/*[*/
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test108.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test108.java
deleted file mode 100644
index 4c79c88..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test108.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test108 {
-	public void foo() {
-		try {
-			foo();
-		} finally /*]*/{
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test109.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test109.java
deleted file mode 100644
index fa68c05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test109.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test109 {
-	public void foo() {
-		/*]*/try {
-			foo();
-		} finally {
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test110.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test110.java
deleted file mode 100644
index 6ecade3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test110.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test110 {
-	public void foo() {
-		try/*[*/{
-			foo();
-		} finally {
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test111.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test111.java
deleted file mode 100644
index c9903ff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test111.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test111 {
-	public void foo() {
-		try {
-			foo();
-		} catch (/*]*/Exception e/*[*/) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test112.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test112.java
deleted file mode 100644
index 689f857..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test112.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test112 {
-	public void foo() {
-		try {
-			foo();
-		} /*]*/catch (Exception e) {
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test113.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test113.java
deleted file mode 100644
index 2c2db9b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test113.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test113 {
-	public void foo() {
-		/*]*/try {
-			foo();
-		}/*[*/ catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test114.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test114.java
deleted file mode 100644
index 1cfce05..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test114.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test114 {
-	public void foo() {
-		try {
-			foo();
-		} /*]*/finally {
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test115.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test115.java
deleted file mode 100644
index 37a6af2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test115.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test115 {
-	public void foo() {
-		try {
-			foo();
-		} catch /*]*/(Exception e)/*[*/ {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test120.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test120.java
deleted file mode 100644
index a5fad98..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test120.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test120 {
-	public boolean foo() {
-		/*]*/return/*[*/ false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test131.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test131.java
deleted file mode 100644
index 81471a2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test131.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package invalidSelection;
-
-public class A_test131 {
-	public void foo() {
-		
-		/*]*/class Inner {
-		}
-		foo();/*[*/
-		
-		Inner inner= new Inner();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test150.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test150.java
deleted file mode 100644
index 942d696..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test150.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test151.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test151.java
deleted file mode 100644
index aa41b19..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test151.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test152.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test152.java
deleted file mode 100644
index 91d26c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test152.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test153.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test153.java
deleted file mode 100644
index eedcc24..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test153.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test160.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test160.java
deleted file mode 100644
index 965967c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test160.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package invalidSelection;
-
-public class A_test160 {
-	/*]*/public static class Inner {
-	}/*[*/
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test161.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test161.java
deleted file mode 100644
index ee94548..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test161.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package invalidSelection;
-
-public class A_test161 {
-	public void foo() {
-		class /*]*/Inner {
-		}/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test170.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test170.java
deleted file mode 100644
index bda6db9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test170.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test170 {
-	public void foo() {
-		String tab[] = /*]*/{"hello", "world" } /*[*/;       
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test171.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test171.java
deleted file mode 100644
index cac9b44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test171.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test171 {
-	public void foo() {
-		String /*]*/str = "ggg"/*[*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test172.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test172.java
deleted file mode 100644
index eca6057..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test172.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package invalidSelection;
-
-public class A_test172 {
-	public void foo() {
-		/*]*/int i= 10/*[*/, j= 20;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test173.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test173.java
deleted file mode 100644
index e9364fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/invalidSelection/A_test173.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package invalidSelection;
-
-public class A_test173 {
-	public void foo() {
-		/*]*/int i= 10, j= 20;/*[*/
-		g(j);
-		g(i);
-	}
-	public void g(int i) {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test1.java
deleted file mode 100644
index c12b372..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package selection;
-
-public class A_test1 {
-	public void foo() {
-		/*[*/foo()/*]*/;
-	}
-} 
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test2.java
deleted file mode 100644
index 06787fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package selection;
-
-public class A_test2 {
-	public void foo() {
-		/*[*/foo()/*[*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test3.java
deleted file mode 100644
index b8e0567..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test3.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package selection;
-
-public class A_test3 {
-	public void foo() {
-		/*]*/foo()/*]*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test4.java
deleted file mode 100644
index 5f984e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/selection/A_test4.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package selection;
-
-public class A_test4 {
-	public void foo() {
-		/*]*/foo()/*[*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test041_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test041_.java
deleted file mode 100644
index cf01258..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test041_.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test041_ {
-	public void foo() {
-		for (/*]*/int i= 0/*[*/; i < 10; i++)
-			foo();
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test048_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test048_.java
deleted file mode 100644
index c5b966c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test048_.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package validSelection;
-
-import java.util.Enumeration;
-
-public class A_test048_ {
-	public boolean flag;
-	public void foo() {
-		for (/*]*/Enumeration e= tests()/*[*/; e.hasMoreElements(); ) {
-			if (flag)
-				break;
-		}
-	}	
-	public Enumeration tests() {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test080_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test080_.java
deleted file mode 100644
index 3e0390b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test080_.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test080_ {
-	public boolean fBoolean;
-	public void foo() {
-		if (/*]*/fBoolean/*[*/)
-			foo();
-		else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test090_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test090_.java
deleted file mode 100644
index 57f8a41..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test090_.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test090_ {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			/*]*/break/*[*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test091_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test091_.java
deleted file mode 100644
index b79bc12..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test091_.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test091_ {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			/*]*/continue/*[*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test092_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test092_.java
deleted file mode 100644
index feddadd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test092_.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test092_ {
-	public void foo() {
-		while (true)
-			/*]*/break/*[*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test093_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test093_.java
deleted file mode 100644
index 62a2331..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test093_.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test093_ {
-	public void foo() {
-		while (true)
-			/*]*/continue/*[*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test094_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test094_.java
deleted file mode 100644
index 922cb1f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test094_.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test094_ {
-	public void foo() {
-		do
-			/*]*/break/*[*/;
-		while(true);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test095_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test095_.java
deleted file mode 100644
index fe52406..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test095_.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test095_ {
-	public void foo() {
-		do
-			/*]*/continue/*[*/;
-		while(true);
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test096_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test096_.java
deleted file mode 100644
index 2b3bce0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test096_.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test096_ {
-	public void foo() {
-		int i= 10;
-		switch(i) {
-			case 10:
-				foo();
-				/*]*/break/*[*/;
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test121_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test121_.java
deleted file mode 100644
index 3461ad9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test121_.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test121_ {
-	public void foo() {
-		int x= 1;
-		int y= 2;
-		
-		/*]*/x= y + x;
-		y= x + y;/*[*/
-		
-		x++;
-		y++;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test122_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test122_.java
deleted file mode 100644
index 20e6fba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test122_.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test122_ {
-	public void foo() {
-		int x= 1;
-
-		/*]*/x= x + 2;
-		int y= 10;/*[*/
-		
-		x+= y + 20;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test130_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test130_.java
deleted file mode 100644
index b6c4fcf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test130_.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test130_ {
-	public void foo() {
-		class Inner {
-		}
-		
-		/*]*/Inner inner= new Inner();
-		foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test140_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test140_.java
deleted file mode 100644
index 988f958..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test140_.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package validSelection;
-
-public class A_test140_ {
-	public boolean flag;
-	public int foo() {
-		int i= 10;
-		/*]*/switch(i) {
-			case 1:
-				if (flag)
-					break;
-				foo();	
-			case 2:
-				return 10;
-			default:
-				throw new NullPointerException();
-		}/*[*/
-			
-		return 10;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test141_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test141_.java
deleted file mode 100644
index 9a3f1c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test141_.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test141_ {
-	private boolean flag;
-	public int foo() {
-		/*]*/while(flag)
-			return 20;/*[*/
-		return 10;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test142_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test142_.java
deleted file mode 100644
index a7b870f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test142_.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test142_ {
-	private boolean flag;
-	public int foo() {
-		int i= 10;
-		/*]*/if (flag) {
-			i++;
-			return i;
-		}/*[*/
-		int y= i + 10;
-		return y;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test143_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test143_.java
deleted file mode 100644
index a0e6c9c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test143_.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test143_ {
-	public boolean foo() {
-		/*]*/try {
-			return true;
-		} catch (Exception e) {
-		}/*[*/
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test144_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test144_.java
deleted file mode 100644
index 1b7c327..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test144_.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test144_ {
-	public boolean foo() {
-		/*]*/try {
-		} catch (Exception e) {
-			return true;
-		}/*[*/
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test145_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test145_.java
deleted file mode 100644
index 2dbb584..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test145_.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package validSelection;
-
-public class A_test145_ {
-	boolean flag;
-	public boolean foo() {
-		/*]*/do {
-			if (flag)
-				break;
-			return false;
-		} while (flag);/*[*/
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test146_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test146_.java
deleted file mode 100644
index b471104..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test146_.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package validSelection;
-
-public class A_test146_ {
-	boolean flag;
-	public boolean foo() {
-		while (flag) {
-			/*]*/for (int i= 0; i < 10; i++) {
-				if (flag)
-					break;
-			}
-			if (flag)
-				break;
-			return false;/*[*/
-		}
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test147_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test147_.java
deleted file mode 100644
index 5583b6d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test147_.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package validSelection;
-
-public class A_test147_ {
-	boolean flag;
-	public boolean foo() {
-		/*]*/target: {
-			for (int i= 0; i < 10; i++) {
-				if (flag)
-					break;
-				else
-					break target;
-			}
-			return false;
-		}/*[*/
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test148_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test148_.java
deleted file mode 100644
index 12f40f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test148_.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package validSelection;
-
-public class A_test148_ {
-	boolean flag;
-	public boolean foo() {
-		int i= 0;
-		/*]*/switch (i) {
-			case 1:
-				return false;
-			case 2:
-				return true;
-		}/*[*/
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test149_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test149_.java
deleted file mode 100644
index 65fe830..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test149_.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package validSelection;
-
-public class A_test149_ {
-	boolean flag;
-	public boolean foo() {
-		int i= 0;
-		/*]*/switch (i) {
-			case 1:
-				break;
-			case 2:
-				return true;
-			default:
-				return false;
-		}/*[*/
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test180_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test180_.java
deleted file mode 100644
index 5bdc94c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test180_.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package validSelection;
-
-public class A_test180_ {
-	public A_test180_() {
-		/*]*/this(10);
-		foo();/*[*/
-	}
-	public A_test180_(int i) {
-		super();
-	}
-	public void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test181_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test181_.java
deleted file mode 100644
index 6fb4e50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test181_.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test181_ {
-	public A_test181_() {
-		/*]*/super();
-		foo();/*[*/
-	}
-	public void foo() {
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test190_.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test190_.java
deleted file mode 100644
index 8c098d5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test190_.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package validSelection;
-
-public class A_test190_ {
-	public int foo() {
-		int i= 10;
-		/*]*/switch(i) {
-			case 1:
-				foo();
-				break;
-			case 2:
-				foo();
-			default:
-				return 10;
-		}/*[*/
-		
-		return 20;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test200.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test200.java
deleted file mode 100644
index 8d570be..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test200.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package validSelection;
-
-public class A_test200 {
-	public void foo() {
-		/*]*/foo();/*[*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test201.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test201.java
deleted file mode 100644
index 62c304e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test201.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package validSelection;
-
-public class A_test201 {
-	public void foo() {/*[*/
-		foo();
-	/*]*/} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test202.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test202.java
deleted file mode 100644
index d8733ef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test202.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test202 {
-	public void foo() {
-		/*]*/foo();
-		foo();/*[*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test203.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test203.java
deleted file mode 100644
index 2edb220..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test203.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test203 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)
-			foo();
-		foo();/*[*/
-	} 
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test230.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test230.java
deleted file mode 100644
index 3035340..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test230.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test230 {
-	public void foo() {
-		{/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test231.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test231.java
deleted file mode 100644
index 3d61594..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test231.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test231 {
-	public void foo() {
-		{
-			/*]*/foo()/*[*/;
-		}
-		{
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test232.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test232.java
deleted file mode 100644
index a3b5456..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test232.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test232 {
-	public void foo() {
-		/*]*/{
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test233.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test233.java
deleted file mode 100644
index 75b3868..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test233.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test233 {
-	public void foo() {
-		{
-			foo();
-		}
-		{
-			/*]*/foo()/*[*/;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test234.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test234.java
deleted file mode 100644
index 265b903..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test234.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test234 {
-	public void foo() {
-		{
-			foo();
-		}
-		{/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test235.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test235.java
deleted file mode 100644
index 876b188..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test235.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test235 {
-	public void foo() {
-		{/*[*/
-			foo();
-		/*]*/}
-		{
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test240.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test240.java
deleted file mode 100644
index 00c0091..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test240.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test240 {
-	public void foo() {/*[*/
-		for (int i= 0; i < 10; i++)
-			foo();
-	/*]*/}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test241.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test241.java
deleted file mode 100644
index b3bb0e2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test241.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test241 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)
-			foo();/*[*/
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test242.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test242.java
deleted file mode 100644
index 29518a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test242.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test242 {
-	public void foo() {
-		/*]*/for (int i= 0; i < 10; i++)
-			foo()/*]*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test243.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test243.java
deleted file mode 100644
index 082e61c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test243.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test243 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)/*[*/
-			foo()/*]*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test244.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test244.java
deleted file mode 100644
index 897ade3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test244.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test244 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			/*]*/foo()/*]*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test245.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test245.java
deleted file mode 100644
index af752d2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test245.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test245 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			/*]*/foo();/*[*/
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test246.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test246.java
deleted file mode 100644
index 40a1cd1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test246.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test246 {
-	public void foo() {
-		for (int i= 0; i < 10; i++) {
-			/*]*/foo();/*[*/
-		}
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test247.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test247.java
deleted file mode 100644
index 4d5b6aa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test247.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test247 {
-	public void foo() {
-		for (int i= 10; i < 10; i++)/*[*/
-			for (int z= 10; z < 10; z++)
-				foo();
-		/*]*/foo();	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test248.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test248.java
deleted file mode 100644
index 5509aa2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test248.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test248 {
-	public void foo() {
-		for (int i= 0; i < 10; i++)
-			foo();
-			
-		/*]*/foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test249.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test249.java
deleted file mode 100644
index 9315dc8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test249.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test249 {
-	public void foo() {
-		/*]*/foo();/*[*/
-		
-		for (int i= 0; i < 10; i++)
-			foo();	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test250.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test250.java
deleted file mode 100644
index 18755cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test250.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test250 {
-	public void foo() {
-		while(1 < 10)/*[*/
-			foo();
-	/*]*/}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test251.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test251.java
deleted file mode 100644
index c82df32..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test251.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package validSelection;
-
-public class A_test251 {
-	public void foo() {
-		/*]*/while(1 < 10)
-			foo()/*]*/;
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test252.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test252.java
deleted file mode 100644
index 7358876..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test252.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test252 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		while(b())
-			while(b())/*[*/
-				foo();
-		/*]*/foo();		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test253.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test253.java
deleted file mode 100644
index dffc377..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test253.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test253 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		while(b())
-			/*]*/while(b())
-				foo();
-		/*]*/foo();		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test254.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test254.java
deleted file mode 100644
index 5eb1cc7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test254.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test254 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		while(b())
-			foo();
-			
-		/*]*/foo();/*[*/		
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test255.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test255.java
deleted file mode 100644
index af3ef80..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test255.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test255 {
-	public boolean b() {
-		return true;
-	}
-	
-	public void foo() {
-		/*]*/foo();/*[*/
-		
-		while(b())
-			foo();	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test260.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test260.java
deleted file mode 100644
index 31a00b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test260.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test260 {
-	public void foo() {
-		/*]*/do
-			foo();
-		while(1 < 10);/*[*/	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test261.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test261.java
deleted file mode 100644
index 1ce96b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test261.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package validSelection;
-
-public class A_test261 {
-	public void foo() {
-		do /*[*/
-			foo();
-		/*]*/while(1 < 10);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test262.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test262.java
deleted file mode 100644
index d6942a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test262.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test262 {
-	public boolean fBoolean;
-	public void foo() {
-		do 
-			foo();
-		while(fBoolean);
-		
-		/*]*/foo()/*[*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test263.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test263.java
deleted file mode 100644
index b628328..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test263.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test263 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/foo()/*[*/;
-		
-		do 
-			foo();
-		while(fBoolean);		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test270.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test270.java
deleted file mode 100644
index f9446bb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test270.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test270 {
-	public void foo() {
-		/*]*/switch(1) {
-			case 1:
-				foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test271.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test271.java
deleted file mode 100644
index d99c995..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test271.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test271 {
-	public void foo() {
-		switch(1) {
-			case 1:/*[*/
-				foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test272.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test272.java
deleted file mode 100644
index 0648fc5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test272.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test272 {
-	public void foo() {
-		switch(1) {
-			case 1:
-				foo();
-				/*]*/foo()/*[*/;
-				foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test273.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test273.java
deleted file mode 100644
index 191695b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test273.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test273 {
-	public void foo() {
-		switch(1) {
-			case 1:/*[*/
-				foo();
-			/*]*/case 2:
-				foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test274.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test274.java
deleted file mode 100644
index 93749cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test274.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test274 {
-	public void foo() {
-		switch(1) {
-			case 1:
-				foo();
-			case 2:
-				foo();
-		}
-		
-		/*]*/foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test275.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test275.java
deleted file mode 100644
index 3e5c359..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test275.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test275 {
-	public void foo() {
-		/*]*/foo();/*[*/
-		
-		switch(1) {
-			case 1:
-				foo();
-			case 2:
-				foo();
-		}		
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test280.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test280.java
deleted file mode 100644
index 33d1996..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test280.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test280 {
-	public boolean fBoolean;
-	public void foo() {
-		/*]*/if (fBoolean)
-			foo();
-		else
-			foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test281.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test281.java
deleted file mode 100644
index 7048e9e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test281.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test281 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			/*]*/foo()/*[*/;
-		else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test282.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test282.java
deleted file mode 100644
index 4bd8856..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test282.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test282 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)/*[*/
-			foo();
-		/*]*/else
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test283.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test283.java
deleted file mode 100644
index 262306e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test283.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test283 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean) {
-		} else {
-			/*]*/foo();/*[*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test284.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test284.java
deleted file mode 100644
index ac651a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test284.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test284 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			foo();
-			
-		if (fBoolean) {
-		} else {
-			/*]*/foo();/*[*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test285.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test285.java
deleted file mode 100644
index 43fa03e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test285.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package validSelection;
-
-public class A_test285 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			/*[*/foo();/*]*/
-			
-		if (fBoolean) {
-		} else {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test286.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test286.java
deleted file mode 100644
index 8de156e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test286.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test286 {
-	public boolean fBoolean;
-	public void foo() {
-		/*[*/foo();/*]*/	
-		if (fBoolean)
-			foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test287.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test287.java
deleted file mode 100644
index bc5a019..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test287.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package validSelection;
-
-public class A_test287 {
-	public boolean fBoolean;
-	public void foo() {
-		if (fBoolean)
-			foo();
-		/*[*/foo();/*]*/	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test300.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test300.java
deleted file mode 100644
index e95eda5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test300.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test300 {
-	public void foo() {
-		try {/*[*/
-			foo();
-		/*]*/} catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test301.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test301.java
deleted file mode 100644
index 84b93a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test301.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test301 {
-	public void foo() {
-		try {
-			/*]*/foo()/*[*/;
-		} catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test302.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test302.java
deleted file mode 100644
index 5e0f55f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test302.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test302 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test303.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test303.java
deleted file mode 100644
index 003b7b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test303.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test303 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			/*]*/foo()/*[*/;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test304.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test304.java
deleted file mode 100644
index 23cc5fb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test304.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package validSelection;
-
-public class A_test304 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		} catch (Throwable t) {
-			/*]*/foo();/*[*/
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test305.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test305.java
deleted file mode 100644
index aa531b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test305.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package validSelection;
-
-public class A_test305 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			/*]*/foo();/*[*/
-		} catch (Throwable t) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test306.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test306.java
deleted file mode 100644
index 45338ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test306.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package validSelection;
-
-public class A_test306 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		} catch (Error e) {
-			/*]*/foo();/*[*/
-		} catch (Throwable t) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test307.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test307.java
deleted file mode 100644
index 141a152..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test307.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test307 {
-	public void foo() {
-		try {
-			foo();
-		} finally {/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test308.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test308.java
deleted file mode 100644
index 5e598b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test308.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package validSelection;
-
-public class A_test308 {
-	public void foo() {
-		try {
-			foo();
-		} finally {/*[*/
-			foo();
-		/*]*/}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test309.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test309.java
deleted file mode 100644
index f0dc5b0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test309.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package validSelection;
-
-public class A_test309 {
-	public void foo() {
-		/*]*/try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		} finally {
-			foo();
-		}/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test310.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test310.java
deleted file mode 100644
index cf121db..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test310.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test310 {
-	public void foo() {
-		try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		}
-		/*]*/foo();/*[*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test311.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test311.java
deleted file mode 100644
index 2a0c75c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test311.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package validSelection;
-
-public class A_test311 {
-	public void foo() {
-		/*]*/foo();/*[*/
-		try {
-			foo();
-		} catch (Exception e) {
-			foo();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test350.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test350.java
deleted file mode 100644
index 69940c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test350.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test351.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test351.java
deleted file mode 100644
index 758accd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test351.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test352.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test352.java
deleted file mode 100644
index acfd893..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test352.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test353.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test353.java
deleted file mode 100644
index f92ec2f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SelectionAnalyzerWorkSpace/SelectionAnalyzerTests/validSelection/A_test353.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test0.java
deleted file mode 100644
index 83c7430..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test0.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test0_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test0_out.txt
deleted file mode 100644
index 8bd85dc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test0_out.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-		m();
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test1.java
deleted file mode 100644
index 69f22e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test1.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + /*[*/1/*]*/;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test10.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test10.java
deleted file mode 100644
index 5e6cf5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test10.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-		if (i < 0){
-			i += i;
-			return;
-		} else
-		 m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test10_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test10_out.txt
deleted file mode 100644
index 1a5a117..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test10_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-1 + 1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test11.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test11.java
deleted file mode 100644
index 5e6cf5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test11.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-		if (i < 0){
-			i += i;
-			return;
-		} else
-		 m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test11_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test11_out.txt
deleted file mode 100644
index 1a5a117..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test11_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-1 + 1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test12.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test12.java
deleted file mode 100644
index 5e6cf5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test12.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-		if (i < 0){
-			i += i;
-			return;
-		} else
-		 m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test12_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test12_out.txt
deleted file mode 100644
index 1a5a117..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test12_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-1 + 1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test13.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test13.java
deleted file mode 100644
index 5e6cf5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test13.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-		if (i < 0){
-			i += i;
-			return;
-		} else
-		 m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test13_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test13_out.txt
deleted file mode 100644
index a6d0770..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test13_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-i= 1 + 1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test14.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test14.java
deleted file mode 100644
index 5e6cf5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test14.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-		if (i < 0){
-			i += i;
-			return;
-		} else
-		 m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test14_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test14_out.txt
deleted file mode 100644
index a6d0770..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test14_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-i= 1 + 1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test15.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test15.java
deleted file mode 100644
index 519a5d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test15.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void m(int t){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test15_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test15_out.txt
deleted file mode 100644
index 523b42f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test15_out.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-void m(int t){
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test16.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test16.java
deleted file mode 100644
index 81a7a66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test16.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{       
-	void m(){m();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test16_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test16_out.txt
deleted file mode 100644
index 71df1f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test16_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-m()
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test17.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test17.java
deleted file mode 100644
index c81256b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test17.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{    
-	/**
-	 * method comment
-	 */   
-	void m(){
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test17_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test17_out.txt
deleted file mode 100644
index e97da26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test17_out.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-class A{    
-	/**
-	 * method comment
-	 */   
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test18.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test18.java
deleted file mode 100644
index 7ebd961..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test18.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{    
-	void m(){
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test18_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test18_out.txt
deleted file mode 100644
index 9705b03..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test18_out.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-class A{    
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test19.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test19.java
deleted file mode 100644
index 5e6cf5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test19.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-		if (i < 0){
-			i += i;
-			return;
-		} else
-		 m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test19_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test19_out.txt
deleted file mode 100644
index 699755f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test19_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-return;
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test1_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test1_out.txt
deleted file mode 100644
index e6c6dc0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test1_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-1 + /*[*/1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test2.java
deleted file mode 100644
index 3044647..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test2.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test20.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test20.java
deleted file mode 100644
index 3044647..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test20.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test20_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test20_out.txt
deleted file mode 100644
index 1a5a117..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test20_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-1 + 1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test21.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test21.java
deleted file mode 100644
index ae91c6e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test21.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	public void foo(int arg);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test21_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test21_out.txt
deleted file mode 100644
index d7895bc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test21_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-public void foo(int arg);
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test22.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test22.java
deleted file mode 100644
index ae91c6e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test22.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface A{
-	public void foo(int arg);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test22_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test22_out.txt
deleted file mode 100644
index d7895bc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test22_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-public void foo(int arg);
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test23.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test23.java
deleted file mode 100644
index 52a8c3c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test23.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	void m(){
-		try{
-		} catch (Exception e){
-			m();			
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test23_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test23_out.txt
deleted file mode 100644
index d5ae539..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test23_out.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-catch (Exception e){
-			m();			
-		}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test24.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test24.java
deleted file mode 100644
index ae74271..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test24.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void f(){
-		f();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test24_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test24_out.txt
deleted file mode 100644
index 8741679..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test24_out.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-void f(){
-		f();
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test25.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test25.java
deleted file mode 100644
index bcf2e69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test25.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	void m0(){
-	}
-	void m(){
-	}
-	void m1(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test25_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test25_out.txt
deleted file mode 100644
index 1a53499..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test25_out.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-void m(){
-	}
-	void m1(){
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test26.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test26.java
deleted file mode 100644
index bcf2e69..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test26.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-class A{
-	void m0(){
-	}
-	void m(){
-	}
-	void m1(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test26_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test26_out.txt
deleted file mode 100644
index f831328..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test26_out.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-void m0(){
-	}
-	void m(){
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test27.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test27.java
deleted file mode 100644
index d2035f3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test27.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-}
-class B{}
-class C{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test27_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test27_out.txt
deleted file mode 100644
index c9ffcde..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test27_out.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-class B{}
-class C{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test28.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test28.java
deleted file mode 100644
index d2035f3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test28.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-}
-class B{}
-class C{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test28_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test28_out.txt
deleted file mode 100644
index d6bbd7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test28_out.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-class A{
-}
-class B{}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test29.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test29.java
deleted file mode 100644
index 779530a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test29.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A {
-	void f(){
-		if (true)
-			f();
-		f();	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test29_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test29_out.txt
deleted file mode 100644
index 2f75758..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test29_out.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-if (true)
-			f();
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test2_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test2_out.txt
deleted file mode 100644
index a6d0770..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test2_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-i= 1 + 1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test3.java
deleted file mode 100644
index 3044647..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test3.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test30.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test30.java
deleted file mode 100644
index 0a2b8f4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test30.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void m(int t){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test30_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test30_out.txt
deleted file mode 100644
index 7d6914b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test30_out.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-void m(int t){
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test31.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test31.java
deleted file mode 100644
index 2249ad9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test31.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void mm(int t){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test31_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test31_out.txt
deleted file mode 100644
index 3595034..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test31_out.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-void mm(int t){
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test32.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test32.java
deleted file mode 100644
index 80a8c1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test32.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class AA{
-	void mm(int t){
-		AA a= ( AA )this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test32_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test32_out.txt
deleted file mode 100644
index 6c376d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test32_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-AA
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test33.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test33.java
deleted file mode 100644
index bb8528c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test33.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class AA{
-	void mm(int t){
-		String xx= "";
-		String yy= ( xx );
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test33_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test33_out.txt
deleted file mode 100644
index 59b66ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test33_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-xx
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test34.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test34.java
deleted file mode 100644
index 2167c9f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test34.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class AA{
-	void mm(int t){
-		if (true){
-			break;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test34_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test34_out.txt
deleted file mode 100644
index 8cb76cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test34_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-break;
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test35.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test35.java
deleted file mode 100644
index fcf46a3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test35.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class AA{
-	void mm(int t){
-		if (true){
-			continue;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test35_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test35_out.txt
deleted file mode 100644
index 45127c0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test35_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-continue;
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test36.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test36.java
deleted file mode 100644
index c8ac58c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test36.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	void f1(int i){
-		switch(i){
-			case 1:
-			 break;
-			default:
-	    	 break;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test36_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test36_out.txt
deleted file mode 100644
index 1d69da7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test36_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-case 1:
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test37.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test37.java
deleted file mode 100644
index c8ac58c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test37.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A {
-	void f1(int i){
-		switch(i){
-			case 1:
-			 break;
-			default:
-	    	 break;
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test37_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test37_out.txt
deleted file mode 100644
index 9aff9e3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test37_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-default:
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test38.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test38.java
deleted file mode 100644
index 7aedaf6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test38.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A {
-	void f2(){}
-	/***/
-	void f1(){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test38_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test38_out.txt
deleted file mode 100644
index 48b14b8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test38_out.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-void f2(){}
-	/***/
-	void f1(){}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test39.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test39.java
deleted file mode 100644
index 28ed338..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test39.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-		Inner(){
-			super();
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test39_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test39_out.txt
deleted file mode 100644
index 1cadcee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test39_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-super();
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test3_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test3_out.txt
deleted file mode 100644
index 2017592..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test3_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-int i= 1 + 1;
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test4.java
deleted file mode 100644
index 6b73dac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test4.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	/*[*/void m(){
-		int i= 1 + 1;
-	}/*]*/
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test40.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test40.java
deleted file mode 100644
index 6bcc76f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test40.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A{
-	class Inner{
-		Inner(int t){}
-		Inner(){
-			this(3);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test40_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test40_out.txt
deleted file mode 100644
index b0bfbda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test40_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-this(3);
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test4_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test4_out.txt
deleted file mode 100644
index 1c454e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test4_out.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-class A{
-	/*[*/void m(){
-		int i= 1 + 1;
-	}/*]*/
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test5.java
deleted file mode 100644
index 0ee5d2a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test5.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void m(){
-		if (true){
-			/*[*/int i= 1 + 1;/*]*/
-		}	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test5_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test5_out.txt
deleted file mode 100644
index e6ba032..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test5_out.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-			/*[*/int i= 1 + 1;/*]*/
-		}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test6.java
deleted file mode 100644
index a4424c7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test6.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	void m(){
-		if (true)/*[*/{
-			int i= 1 + 1;
-		}/*]*/
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test6_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test6_out.txt
deleted file mode 100644
index d14356b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test6_out.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-if (true)/*[*/{
-			int i= 1 + 1;
-		}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test7.java
deleted file mode 100644
index ac09c77..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test7.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void m(){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test7_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test7_out.txt
deleted file mode 100644
index 1c2aa1f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test7_out.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-void m(){
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test8.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test8.java
deleted file mode 100644
index 81a7a66..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test8.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{       
-	void m(){m();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test8_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test8_out.txt
deleted file mode 100644
index 968af3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test8_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-m();
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test9.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test9.java
deleted file mode 100644
index 519a5d6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test9.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-class A{
-	void m(int t){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test9_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test9_out.txt
deleted file mode 100644
index 523b42f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_test9_out.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-void m(int t){
-	}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testWholeCu.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testWholeCu.java
deleted file mode 100644
index 3044647..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testWholeCu.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testWholeCu_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testWholeCu_out.txt
deleted file mode 100644
index 3044647..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testWholeCu_out.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testZeroLength0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testZeroLength0.java
deleted file mode 100644
index 3044647..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testZeroLength0.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testZeroLength0_out.txt b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testZeroLength0_out.txt
deleted file mode 100644
index 1a5a117..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/A_testZeroLength0_out.txt
+++ /dev/null
@@ -1 +0,0 @@
-1 + 1
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/OffsetTest.java b/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/OffsetTest.java
deleted file mode 100644
index 5e6cf5c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/StructureSelectionAction/OffsetTest.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	void m(){
-		int i= 1 + 1;
-		if (i < 0){
-			i += i;
-			return;
-		} else
-		 m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/.cvsignore
deleted file mode 100644
index 9caf6f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.metadata
-bin
-*.class
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/.cvsignore b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/.cvsignore
deleted file mode 100644
index 4fdcfd7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-bin
-.classpath
-*.class
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/.project b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/.project
deleted file mode 100644
index 48a8e0a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>SurroundWithTests</name>
-	<comment></comment>
-	<projects>
-	</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/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/A.java
deleted file mode 100644
index ab44e52..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-import java.io.File;
-import java.net.URL;
-
-class A {
-	public void foo() {
-		File file= null;
-		
-		URL url= file.toURL();
-		
-		url= null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/D.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/D.java
deleted file mode 100644
index 583b741..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/D.java
+++ /dev/null
@@ -1,7 +0,0 @@
-import java.io.*;
-
-
-/* comment */
-public class D {
-    private InputStream input= new FileInputStream("myfile");
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestAlreadyCaught.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestAlreadyCaught.java
deleted file mode 100644
index 03bfd682..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestAlreadyCaught.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestAlreadyCaught {
-	public void foo() {
-		File file= null;
-		try {
-			/*]*/file.toURL();/*[*/
-		} catch(MalformedURLException e) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestDeclarationInitializer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestDeclarationInitializer.java
deleted file mode 100644
index 8454084..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestDeclarationInitializer.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-import java.net.URL;
-
-class TestDeclarationInitializer {
-	public void foo() {
-		File file= null;
-		
-		/*[*/URL url= file.toURL();/*]*/
-		url= null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExceptionOrder.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExceptionOrder.java
deleted file mode 100644
index 9f02974..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExceptionOrder.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package trycatch_in;
-
-public class TestExceptionOrder {
-	public static class Exception_1 extends Exception {
-	}
-	public static class Exception_2 extends Exception_1 {
-	}
-	
-	public void throw1() throws Exception_1 {
-	}
-	
-	public void throw2() throws Exception_2 {
-	}
-	
-	public void foo() {
-		/*[*/throw1();
-		throw2();/*]*/
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExpression.java
deleted file mode 100644
index 1913421..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExpression.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package trycatch_in;
-import java.io.File;
-
-class TestExpression{	
-	void fg(){
-		File file= null;
-		
-		/*[*/int i= 3 * (2 + 1);
-		file.toURL();/*]*/
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExpressionStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExpressionStatement.java
deleted file mode 100644
index 4a8122b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestExpressionStatement.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package trycatch_in;
-
-import java.net.URL;
-
-public class TestExpressionStatement {
-	public void foo() {
-		/*[*/new URL("http://www.eclipse.org")/*]*/;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInitializer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInitializer.java
deleted file mode 100644
index b9e540a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInitializer.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package trycatch_in;
-
-import java.io.FileInputStream;
-import java.io.InputStream;
-
-public class TestInitializer {
-    private static InputStream input;
-
-    static {
-		/*[*/input = new FileInputStream("myfile");/*]*/
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInitializerThrowsException.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInitializerThrowsException.java
deleted file mode 100644
index 3477608..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInitializerThrowsException.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-import java.net.URL;
-
-public class TestInitializerThrowsException {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/URL url= file.toURL();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInvalidParent1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInvalidParent1.java
deleted file mode 100644
index d9f3e50..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInvalidParent1.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestInvalidParent1 {
-	public void foo() {
-		File file= null;
-		if (/*]*/file.toURL() == null/*[*/)
-			return;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInvalidParent2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInvalidParent2.java
deleted file mode 100644
index 6cac896..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestInvalidParent2.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-import java.net.URL;
-
-public class TestInvalidParent2 {
-	public void foo() {
-		File file= null;
-		URL url= /*]*/file.toURL();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestMultiLine.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestMultiLine.java
deleted file mode 100644
index 534a8fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestMultiLine.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestMultiLine {
-	public void foo() {
-		File file= null;
-		foo();/*]*/file.toURL();
-		file.toURL();
-		file.toURL();/*]*/foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestNested.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestNested.java
deleted file mode 100644
index 878cde0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestNested.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package trycatch_in;
-
-public class TestNested {
-	public void foo() {
-		try {
-			throw new Exception();
-		} catch (Exception e) {
-			/*[*/throw new Exception();/*]*/
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestNoException.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestNoException.java
deleted file mode 100644
index a06082c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestNoException.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package trycatch_in;
-
-public class TestNoException {
-	public void foo() {
-		/*]*/foo();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestOneLine.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestOneLine.java
deleted file mode 100644
index f1e2517..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestOneLine.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestOneLine {
-	public void foo() {
-		File file= null;
-		foo();/*]*/file.toURL();/*]*/foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestRuntimeException1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestRuntimeException1.java
deleted file mode 100644
index f8efefc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestRuntimeException1.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package trycatch_in;
-
-public class TestRuntimeException1 {
-	public void foo() {
-		Class clazz= null;
-		
-		/*[*/clazz.getConstructors();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestRuntimeException2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestRuntimeException2.java
deleted file mode 100644
index cff422d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestRuntimeException2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package trycatch_in;
-
-public class TestRuntimeException2 {
-	public void foo() {
-		/*]*/throw new NullPointerException();/*[*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSimple.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSimple.java
deleted file mode 100644
index 6ba5a71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSimple.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestSimple {
-	public void foo() {
-		File file= null;
-		/*[*/file.toURL();/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestStaticField.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestStaticField.java
deleted file mode 100644
index af1c21e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestStaticField.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package trycatch_in;
-
-public class TestStaticField {
-	/*]*/private static InputStream input= new FileInputStream("myfile");/*[*/
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSuperCall.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSuperCall.java
deleted file mode 100644
index 2f76b48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSuperCall.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package trycatch_in;
-
-import java.io.IOException;
-
-public class TestSuperCall {
-	public void foo() throws IOException {
-	}
-	
-	static class A extends TestSuperCall {
-		public void bar() {
-			/*[*/super.foo();/*]*/
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSuperConstructorCall.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSuperConstructorCall.java
deleted file mode 100644
index e123539..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestSuperConstructorCall.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package trycatch_in;
-
-import java.net.MalformedURLException;
-
-public class TestSuperConstructorCall {
-	static class A {
-		public A(int i) throws MalformedURLException {
-		}
-	}
-	
-	static class B extends A {
-		public B() {
-			super(10);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThenStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThenStatement.java
deleted file mode 100644
index 0a7f4f9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThenStatement.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package trycatch_in;
-
-public class TestThenStatement {
-	
- void foo() {
-   TestThenStatement bar= null;
-   if (bar != null)
-	 /*]*/bar.run();/*[*/
- }
- 
- void run() throws InterruptedException{
- }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThisConstructorCall.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThisConstructorCall.java
deleted file mode 100644
index 7b2645d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThisConstructorCall.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package trycatch_in;
-
-import java.net.MalformedURLException;
-
-public class TestThisConstructorCall {
-	public TestThisConstructorCall(int i) throws MalformedURLException {
-	}
-	public TestThisConstructorCall() {
-		this(10);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThrowInCatch.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThrowInCatch.java
deleted file mode 100644
index b00e475..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestThrowInCatch.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package trycatch_in;
-
-public class TestThrowInCatch {
-	void f() throws Exception{
-		/*[*/try{
-		} catch (Exception e){
-			throw new Exception();
-		}/*]*/
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal1.java
deleted file mode 100644
index 776f37b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal1.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestWrappedLocal1 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int i= 10; 
-		file.toURL();/*]*/
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal2.java
deleted file mode 100644
index 04c7a8d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal2.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestWrappedLocal2 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int i= 10; int x; 
-		file.toURL();/*]*/
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal3.java
deleted file mode 100644
index c8ef9e3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal3.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestWrappedLocal3 {
-
-	public void foo() {
-		File file= null;
-		
-		int i;
-		/*[*/int x; 
-		file.toURL();/*]*/
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal4.java
deleted file mode 100644
index 6484a31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal4.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestWrappedLocal4 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int i= 10, x= 20;
-		file.toURL();/*]*/
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal5.java
deleted file mode 100644
index c0e229a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal5.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestWrappedLocal5 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int i, x; 
-		file.toURL();/*]*/
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal6.java
deleted file mode 100644
index bb703ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_in/TestWrappedLocal6.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package trycatch_in;
-
-import java.io.File;
-
-public class TestWrappedLocal6 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int a, i= 10, x; 
-		file.toURL();/*]*/
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestDeclarationInitializer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestDeclarationInitializer.java
deleted file mode 100644
index 792db39..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestDeclarationInitializer.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-class TestDeclarationInitializer {
-	public void foo() {
-		File file= null;
-		
-		/*[*/URL url;/*]*/
-		try {
-			url = file.toURL();
-		} catch (MalformedURLException e) {
-		}
-		url= null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExceptionOrder.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExceptionOrder.java
deleted file mode 100644
index b3467fe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExceptionOrder.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package trycatch_out;
-
-public class TestExceptionOrder {
-	public static class Exception_1 extends Exception {
-	}
-	public static class Exception_2 extends Exception_1 {
-	}
-	
-	public void throw1() throws Exception_1 {
-	}
-	
-	public void throw2() throws Exception_2 {
-	}
-	
-	public void foo() {
-		try {
-			/*[*/throw1();
-			throw2();/*]*/
-		} catch (Exception_2 e) {
-		} catch (Exception_1 e) {
-		}
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExpression.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExpression.java
deleted file mode 100644
index 7bde695..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExpression.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package trycatch_out;
-import java.io.File;
-import java.net.MalformedURLException;
-
-class TestExpression{	
-	void fg(){
-		File file= null;
-		
-		/*[*/int i;
-		try {
-			i = 3 * (2 + 1);
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-		i++;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExpressionStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExpressionStatement.java
deleted file mode 100644
index 37ca7a5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestExpressionStatement.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package trycatch_out;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-public class TestExpressionStatement {
-	public void foo() {
-		try {
-			/*[*/new URL("http://www.eclipse.org")/*]*/;
-		} catch (MalformedURLException e) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestInitializer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestInitializer.java
deleted file mode 100644
index 9e6e5fd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestInitializer.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package trycatch_out;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-
-public class TestInitializer {
-    private static InputStream input;
-
-    static {
-		try {
-			/*[*/input = new FileInputStream("myfile");/*]*/
-		} catch (FileNotFoundException e) {
-		}
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestInitializerThrowsException.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestInitializerThrowsException.java
deleted file mode 100644
index 52f732e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestInitializerThrowsException.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-public class TestInitializerThrowsException {
-
-	public void foo() {
-		File file= null;
-		
-		try {
-			/*[*/URL url= file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestMultiLine.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestMultiLine.java
deleted file mode 100644
index 19b9e32..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestMultiLine.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestMultiLine {
-	public void foo() {
-		File file= null;
-		foo();/*]*/try {
-			file.toURL();
-			file.toURL();
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestNested.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestNested.java
deleted file mode 100644
index 7ca2e7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestNested.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package trycatch_out;
-
-public class TestNested {
-	public void foo() {
-		try {
-			throw new Exception();
-		} catch (Exception e) {
-			try {
-				/*[*/throw new Exception();/*]*/
-			} catch (Exception e1) {
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestOneLine.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestOneLine.java
deleted file mode 100644
index b00d2b1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestOneLine.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestOneLine {
-	public void foo() {
-		File file= null;
-		foo();/*]*/try {
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}foo();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestRuntimeException1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestRuntimeException1.java
deleted file mode 100644
index 98fc00e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestRuntimeException1.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package trycatch_out;
-
-public class TestRuntimeException1 {
-	public void foo() {
-		Class clazz= null;
-		
-		try {
-			/*[*/clazz.getConstructors();/*]*/
-		} catch (SecurityException e) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestSimple.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestSimple.java
deleted file mode 100644
index 9982c47..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestSimple.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestSimple {
-	public void foo() {
-		File file= null;
-		try {
-			/*[*/file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestSuperCall.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestSuperCall.java
deleted file mode 100644
index e2574f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestSuperCall.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package trycatch_out;
-
-import java.io.IOException;
-
-public class TestSuperCall {
-	public void foo() throws IOException {
-	}
-	
-	static class A extends TestSuperCall {
-		public void bar() {
-			try {
-				/*[*/super.foo();/*]*/
-			} catch (IOException e) {
-			}
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestThenStatement.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestThenStatement.java
deleted file mode 100644
index f659bcc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestThenStatement.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package trycatch_out;
-
-public class TestThenStatement {
-	
- void foo() {
-   TestThenStatement bar= null;
-   if (bar != null)
-	try {
-		/*]*/bar.run();/*[*/
-	} catch (InterruptedException e) {
-	}
- }
- 
- void run() throws InterruptedException{
- }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestThrowInCatch.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestThrowInCatch.java
deleted file mode 100644
index f911511..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestThrowInCatch.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package trycatch_out;
-
-public class TestThrowInCatch {
-	void f() throws Exception{
-		try {
-			/*[*/try{
-			} catch (Exception e){
-				throw new Exception();
-			}/*]*/
-		} catch (Exception e) {
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal1.java
deleted file mode 100644
index 2627462..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal1.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestWrappedLocal1 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int i;
-		try {
-			i = 10; 
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal2.java
deleted file mode 100644
index 842bb3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal2.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestWrappedLocal2 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int i;
-		try {
-			i = 10; int x; 
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal3.java
deleted file mode 100644
index 354ace5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal3.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestWrappedLocal3 {
-
-	public void foo() {
-		File file= null;
-		
-		int i;
-		try {
-			/*[*/int x; 
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal4.java
deleted file mode 100644
index 3efa6ca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal4.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestWrappedLocal4 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int i, x;
-		try {
-			i = 10;
-			x = 20;
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal5.java
deleted file mode 100644
index c15f62d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal5.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestWrappedLocal5 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int i, x;
-		try {
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal6.java
deleted file mode 100644
index 6fcfd31..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/SurroundWithWorkSpace/SurroundWithTests/trycatch_out/TestWrappedLocal6.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package trycatch_out;
-
-import java.io.File;
-import java.net.MalformedURLException;
-
-public class TestWrappedLocal6 {
-
-	public void foo() {
-		File file= null;
-		
-		/*[*/int a, i, x;
-		try {
-			i = 10; 
-			file.toURL();/*]*/
-		} catch (MalformedURLException e) {
-		}
-		i= 20;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints0.java
deleted file mode 100644
index d94c6d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints0.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		A a0= null;
-		A a1= a0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints1.java
deleted file mode 100644
index 69e8d96..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints1.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	A a0= null, a1;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints10.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints10.java
deleted file mode 100644
index a7f4098..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints10.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	A[] f1(){return null;}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints11.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints11.java
deleted file mode 100644
index e0f9bbe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints11.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	A f(A a0, Object a1){
-		return null;
-	}
-}
-class B extends A{
-	A f(A a3, Object a4){
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints12.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints12.java
deleted file mode 100644
index d73dc6b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints12.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	static A f(A a0, Object a1){
-		return null;
-	}
-}
-class B extends A{
-	static A f(A a3, Object a4){
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints13.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints13.java
deleted file mode 100644
index ce90ab6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints13.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-class A{
-	private A f(A a0, Object a1){
-		return null;
-	}
-}
-class B extends A{
-	private A f(A a3, Object a4){
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints14.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints14.java
deleted file mode 100644
index 78e7954..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints14.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package p;
-class A{
-	A f(A a0){
-		return null;
-	}
-}
-class B extends A implements I{
-	A f(A a3){
-		B ax= null;
-		ax.f(a3);
-		return null;
-	}
-}
-interface I {
-	A f(A ai);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints15.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints15.java
deleted file mode 100644
index 738879f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints15.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-class A{
-	A f(A a0){
-		return null;
-	}
-}
-class B extends A implements I{
-	A f(A a3){
-		super.f(a3);
-		return null;
-	}
-}
-interface I {
-	A f(A ai);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints16.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints16.java
deleted file mode 100644
index 5aacfa7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints16.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	A aField= this;
-	{
-		A aTemp= this;
-	}
-	void f(){
-		A a= this;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints17.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints17.java
deleted file mode 100644
index 6249d98..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints17.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	A f(){
-		A a= null;
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints18.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints18.java
deleted file mode 100644
index 0501fbc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints18.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	A(A a0){
-	}
-}
-class B extends A{
-	B(A a1){
-		super(a1);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints19.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints19.java
deleted file mode 100644
index 47d2ec6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints19.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class A{
-	A aField;
-}
-class B extends A{
-	void f(){
-		A a= null;
-		super.aField= a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints2.java
deleted file mode 100644
index aec8c28..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints2.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		A a0= null;
-		A a1= (A)a0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints20.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints20.java
deleted file mode 100644
index 64235a2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints20.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	A aField;
-}
-class B extends A{
-	A aField;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints21.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints21.java
deleted file mode 100644
index 5d5469f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints21.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	void f2(A[] as){}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints22.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints22.java
deleted file mode 100644
index 8889288..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints22.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class A{
-	A f(A a0, Object a1){
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints23.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints23.java
deleted file mode 100644
index 99fd06b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints23.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-class Test1 {
-		public static void main(String[] args) {
-			for(int i=0; i < args.length; );
-		}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints3.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints3.java
deleted file mode 100644
index 070a6ee..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints3.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		for (A a= null, b= null;;){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints4.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints4.java
deleted file mode 100644
index 07c8ac3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints4.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		A a0= null;
-		A[] as0= {a0};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints5.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints5.java
deleted file mode 100644
index 0c4346e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints5.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		A a0= null;
-		A[] as0= new A[]{a0};
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints6.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints6.java
deleted file mode 100644
index 9e8b07a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints6.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	A(A a){}
-	void f(){
-		A a0= null;
-		A a1= new A(a0);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints7.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints7.java
deleted file mode 100644
index 9b0474c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints7.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	A(A a){}
-	A(){
-		this(null);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints8.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints8.java
deleted file mode 100644
index 9c91cb2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints8.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A{
-	A aField;
-	Object x;
-	void f(){
-		aField.x= this;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints9.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints9.java
deleted file mode 100644
index 61b8bfd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testConstraints9.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A{
-	void f(){
-		A a= null;
-		boolean x= a instanceof A;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber0.java
deleted file mode 100644
index f917196..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber0.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	A a;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber1.java
deleted file mode 100644
index 5abb5ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber1.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	A a= null;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber2.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber2.java
deleted file mode 100644
index e725807..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testNumber2.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A{
-	A a0= null, a1, a2;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testUpdatableExtractInterfaceRanges0.java b/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testUpdatableExtractInterfaceRanges0.java
deleted file mode 100644
index e717a99..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/TypeConstraints/A_testUpdatableExtractInterfaceRanges0.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package p;
-
-interface Bag{
-	public java.util.Iterator iterator();
-	public A add(Comparable e);
-	public A addAll(A v1);
-}
-class A implements Bag{
-	int size = 0;
-	Comparable[] elems = new Comparable[10];
-	public java.util.Iterator iterator() {
-		return new Iterator(this);
-	}
-	public A add(Comparable e) {
-		if (size + 1 == elems.length) {
-			Comparable[] newElems = new Comparable[2 * size];
-			System.arraycopy(elems, 0, newElems, 0, size);
-			elems = newElems;
-		}
-		elems[size++] = e;
-		return this;
-	}
-	public A addAll(A v1) {
-		java.util.Iterator i = v1.iterator();
-		for (; i.hasNext(); add((Comparable) i.next()));
-		return this;
-	}
-	public void sort() { /* insertion sort */
-		for (int i = 1; i < size; i++) {
-			Comparable e1 = elems[i];
-			int j = i;
-			while ((j > 0) && (elems[j - 1].compareTo(e1) > 0)) {
-				elems[j] = elems[j - 1];
-				j--;
-			}
-			elems[j] = e1;
-		}
-	}
-}
-class Iterator implements java.util.Iterator {
-	private int count = 0;
-	private A v2;
-	Iterator(A v3) {
-		v2 = v3;
-	}
-	public boolean hasNext() {
-		return count < v2.size;
-	}
-	public Object next() {
-		return v2.elems[count++];
-	}
-	public void remove() {
-		throw new UnsupportedOperationException();
-	}
-}
-class Client {
-	public static void main(String[] args) {
-		A v4 = createList();
-		populate(v4);
-		update(v4);
-		sortList(v4);
-		print(v4);
-	}
-	static A createList() {
-		return new A();
-	}
-	static void populate(A v5) {
-		v5.add("foo").add("bar");
-	}
-	static void update(A v6) {
-		A v7 = new A().add("zap").add("baz");
-		v6.addAll(v7);
-	}
-	static void sortList(A v8) {
-		v8.sort();
-	}
-	static void print(A v9) {
-		for (java.util.Iterator iter = v9.iterator(); iter.hasNext();)
-			System.out.println("Object: " + iter.next());
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/in/A.java
deleted file mode 100644
index e773ba6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/in/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A implements I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/in/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/in/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/out/A.java
deleted file mode 100644
index e773ba6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/out/A.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class A implements I{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/out/I.java
deleted file mode 100644
index 6bf3b7a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test0_/out/I.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/in/A.java
deleted file mode 100644
index eb1b77e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public final void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/out/A.java
deleted file mode 100644
index eb1b77e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public final void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test10_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/in/A.java
deleted file mode 100644
index b29a790..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-abstract class A implements I{
-	abstract public void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/out/A.java
deleted file mode 100644
index b29a790..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-abstract class A implements I{
-	abstract public void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test11_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/in/A.java
deleted file mode 100644
index 9e26007..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A implements I{
-	public void m(){}
-	private void f(){
-		A a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/out/A.java
deleted file mode 100644
index 41cb3cd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-class A implements I{
-	public void m(){}
-	private void f(){
-		I a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test12_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/in/A.java
deleted file mode 100644
index be2224a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A extends Object implements Cloneable, I{
-	public void m(){
-	}
-	protected Object clone() throws CloneNotSupportedException {
-		return super.clone();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/out/A.java
deleted file mode 100644
index be2224a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A extends Object implements Cloneable, I{
-	public void m(){
-	}
-	protected Object clone() throws CloneNotSupportedException {
-		return super.clone();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test13_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/in/A.java
deleted file mode 100644
index 6289367..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	void f(){
-		A a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/out/A.java
deleted file mode 100644
index a4a2709..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	void f(){
-		I a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test14_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/in/A.java
deleted file mode 100644
index 41579b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/in/I.java
deleted file mode 100644
index c9ea053..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/in/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-	void m1();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/out/A.java
deleted file mode 100644
index 857dece..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		I a= new A();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/out/I.java
deleted file mode 100644
index c9ea053..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test15_/out/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-	void m1();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/in/A.java
deleted file mode 100644
index 577598e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/out/A.java
deleted file mode 100644
index 2a08fb9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		I a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test16/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/in/A.java
deleted file mode 100644
index 1e3a413..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/out/A.java
deleted file mode 100644
index 1e3a413..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test17/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/in/A.java
deleted file mode 100644
index 2154631..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A();
-		a.m();
-
-		A a1= new A();
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/out/A.java
deleted file mode 100644
index f175b95..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		I a= new A();
-		a.m();
-
-		A a1= new A();
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test18/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/in/A.java
deleted file mode 100644
index 66eebc6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A(), a1 = new A();
-		a.m();
-
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/out/A.java
deleted file mode 100644
index 66eebc6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A(), a1 = new A();
-		a.m();
-
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test19/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/in/A.java
deleted file mode 100644
index 8a36a2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/out/A.java
deleted file mode 100644
index 8a36a2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public void m(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test1_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/in/A.java
deleted file mode 100644
index 66eebc6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		A a= new A(), a1 = new A();
-		a.m();
-
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/in/I.java
deleted file mode 100644
index c9ea053..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/in/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-	void m1();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/out/A.java
deleted file mode 100644
index f92f6a6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m(){}
-	public void m1(){}
-	void f(){
-		I a= new A(), a1 = new A();
-		a.m();
-
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/out/I.java
deleted file mode 100644
index c9ea053..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test20/out/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-	void m1();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/in/A.java
deleted file mode 100644
index e5b9c3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A extends Exception implements I {
-	public void m() {}
-	void e() throws A{}
-	void g() {
-		try{
-			e();
-		} catch (A a){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/out/A.java
deleted file mode 100644
index e5b9c3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A extends Exception implements I {
-	public void m() {}
-	void e() throws A{}
-	void g() {
-		try{
-			e();
-		} catch (A a){
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test21/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/in/A.java
deleted file mode 100644
index b0fcab7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	Class g() {
-		return A.class;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/out/A.java
deleted file mode 100644
index b0fcab7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	Class g() {
-		return A.class;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test22/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/in/A.java
deleted file mode 100644
index 747e26e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	void g() {
-		A a= (A)new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/out/A.java
deleted file mode 100644
index fe659e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	void g() {
-		I a= (I)new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test23/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/in/A.java
deleted file mode 100644
index 377f835..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		A a= (A)new A();
-		((A)this).m1();
-		((A)this).m();
-		(((A)this)).m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/out/A.java
deleted file mode 100644
index 2af8159..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		I a= (I)new A();
-		((A)this).m1();
-		((I)this).m();
-		(((I)this)).m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test24/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/in/A.java
deleted file mode 100644
index eb1eb60..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	protected A g() {
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/out/A.java
deleted file mode 100644
index 689cc1a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	protected I g() {
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test25/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/in/A.java
deleted file mode 100644
index f8c4867..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		g().m();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/out/A.java
deleted file mode 100644
index 9bb324d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected I g() {
-		g().m();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test26/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/in/A.java
deleted file mode 100644
index 75151ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		g().m1();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/out/A.java
deleted file mode 100644
index 75151ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		g().m1();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test27/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/in/A.java
deleted file mode 100644
index a6a4385..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		return this;	
-	}
-}
-class A1 extends A{
-	protected A g() {
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/out/A.java
deleted file mode 100644
index ea612d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected I g() {
-		return this;	
-	}
-}
-class A1 extends A{
-	protected I g() {
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test28/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/in/A.java
deleted file mode 100644
index 2792500..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/in/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		return this;	
-	}
-}
-class A1 extends A{
-	protected A g() {
-		g().m1();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/out/A.java
deleted file mode 100644
index 2792500..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/out/A.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A g() {
-		return this;	
-	}
-}
-class A1 extends A{
-	protected A g() {
-		g().m1();
-		return this;	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test29/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/in/A.java
deleted file mode 100644
index b0e0bdf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.List;
-
-class A implements I{
-	public List m(){return null;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/in/I.java
deleted file mode 100644
index 5273f15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/in/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.util.List;
-/** typecomment template*/
-interface I {
-	List m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/out/A.java
deleted file mode 100644
index b0e0bdf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import java.util.List;
-
-class A implements I{
-	public List m(){return null;}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/out/I.java
deleted file mode 100644
index 5273f15..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test2_/out/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.util.List;
-/** typecomment template*/
-interface I {
-	List m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/in/A.java
deleted file mode 100644
index 10362fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	A f(A a){
-		f(a).m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/out/A.java
deleted file mode 100644
index 10362fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	A f(A a){
-		f(a).m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test30/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/in/A.java
deleted file mode 100644
index eca9d5e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	A f(A a){
-		f(a).m();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/out/A.java
deleted file mode 100644
index 0cfc234..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((I)this);
-	}
-	I f(I a){
-		f(a).m();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test31/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/in/A.java
deleted file mode 100644
index b8e34b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/out/A.java
deleted file mode 100644
index 2424bbd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		I a1= a0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test32/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/in/A.java
deleted file mode 100644
index a7373d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/out/A.java
deleted file mode 100644
index a7373d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test33/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/in/A.java
deleted file mode 100644
index 0c46d3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		a1.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/out/A.java
deleted file mode 100644
index 32d25a1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		I a1= a0;
-		a1.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test34/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/in/A.java
deleted file mode 100644
index b377467..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A implements I { //implements Fred
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/out/A.java
deleted file mode 100644
index b377467..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A implements I { //implements Fred
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test35/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/in/A.java
deleted file mode 100644
index 416a922..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		f(a0);
-	}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/out/A.java
deleted file mode 100644
index 416a922..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		f(a0);
-	}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test36/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/in/A.java
deleted file mode 100644
index 1b1ed7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		f(a0);
-	}
-	void f(A a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/out/A.java
deleted file mode 100644
index 1070412..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		f(a0);
-	}
-	void f(I a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test37/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/in/A.java
deleted file mode 100644
index bfdcb70..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		a1.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/out/A.java
deleted file mode 100644
index 93bff1c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		I a1;
-		a1= a0;
-		a1.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test38/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/in/A.java
deleted file mode 100644
index b9deeeb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/out/A.java
deleted file mode 100644
index b9deeeb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test39/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/in/A.java
deleted file mode 100644
index c598efa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class A implements I{
-	public void m(){
-		List list= new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/out/A.java
deleted file mode 100644
index c598efa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class A implements I{
-	public void m(){
-		List list= new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test3_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/in/A.java
deleted file mode 100644
index 17596e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a1;
-		a1= null;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/out/A.java
deleted file mode 100644
index 17596e0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a1;
-		a1= null;
-		a1.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test40/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/in/A.java
deleted file mode 100644
index 1af56bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		A a2= a1;
-		a2.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/out/A.java
deleted file mode 100644
index 1af56bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1= a0;
-		A a2= a1;
-		a2.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test41/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/in/A.java
deleted file mode 100644
index 4172720..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		A a2;
-		a2= a1;
-		a2.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/out/A.java
deleted file mode 100644
index 4172720..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		A a1;
-		a1= a0;
-		A a2;
-		a2= a1;
-		a2.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test42/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/in/A.java
deleted file mode 100644
index b25eedd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		((A)a0).m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/out/A.java
deleted file mode 100644
index 4f1549d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		((I)a0).m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test43/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/in/A.java
deleted file mode 100644
index e747555..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		A a0= new A();
-		((A)a0).m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/out/A.java
deleted file mode 100644
index e032247..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void test(){
-		I a0= new A();
-		((A)a0).m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test44/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/in/A.java
deleted file mode 100644
index fb1dd55..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/out/A.java
deleted file mode 100644
index fb1dd55..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test45/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/in/A.java
deleted file mode 100644
index a301d27..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(A a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/out/A.java
deleted file mode 100644
index 2a68a7c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(I a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test46/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/in/A.java
deleted file mode 100644
index 4b67e34..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	A g() {
-		A a= new A();
-		g().m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/out/A.java
deleted file mode 100644
index 4b67e34..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	A g() {
-		A a= new A();
-		g().m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test47/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/in/A.java
deleted file mode 100644
index 28a0e57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	A f(A a){
-		f(a).m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/out/A.java
deleted file mode 100644
index 28a0e57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	A f(A a){
-		f(a).m1();
-		return a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test48/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/in/A.java
deleted file mode 100644
index dffad44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/out/A.java
deleted file mode 100644
index dffad44..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void g() {
-		f((A)this);
-	}
-	void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test49/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/in/A.java
deleted file mode 100644
index 9304981..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements Cloneable, I{
-	public void m(){
-	}
-	protected Object clone() throws CloneNotSupportedException {
-		return super.clone();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/out/A.java
deleted file mode 100644
index 9304981..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-
-class A implements Cloneable, I{
-	public void m(){
-	}
-	protected Object clone() throws CloneNotSupportedException {
-		return super.clone();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test4_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/in/A.java
deleted file mode 100644
index 9e7aff4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	A a;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/out/A.java
deleted file mode 100644
index 9e7aff4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	A a;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test50/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/in/A.java
deleted file mode 100644
index 3c1c5c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	A a;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/out/A.java
deleted file mode 100644
index 5728437..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	I a;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test51/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/in/A.java
deleted file mode 100644
index 4aaa2cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	A fA;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= fA;
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/out/A.java
deleted file mode 100644
index 4aaa2cf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	A fA;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= fA;
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test52/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/in/A.java
deleted file mode 100644
index 1c5ff48..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	A fA;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= fA;
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/out/A.java
deleted file mode 100644
index f10dd01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class A implements I {
-	I fA;
-	public void m() {}
-	public void m1() {}
-	void f(){
-		I a= fA;
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test53/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/A.java
deleted file mode 100644
index bed1d04..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected void f(A a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/A1.java
deleted file mode 100644
index 2d54186..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/A1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected void f(A a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/A.java
deleted file mode 100644
index e68d749..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected void f(I a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/A1.java
deleted file mode 100644
index 3eccac6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/A1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected void f(I a){
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test54/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/A.java
deleted file mode 100644
index bed1d04..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected void f(A a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/A1.java
deleted file mode 100644
index a4285b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/A1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/A.java
deleted file mode 100644
index bed1d04..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected void f(A a){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/A1.java
deleted file mode 100644
index a4285b3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/A1.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected void f(A a){
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test55/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/A.java
deleted file mode 100644
index 2e5f384..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/A1.java
deleted file mode 100644
index c6b716d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/A.java
deleted file mode 100644
index 2e5f384..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/A1.java
deleted file mode 100644
index c6b716d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test56/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/A.java
deleted file mode 100644
index f8e8cef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/A1.java
deleted file mode 100644
index d29e8f0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/A.java
deleted file mode 100644
index 1391097..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	protected I f(){
-		return this;
-	}
-	void test(){
-		f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/A1.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/A1.java
deleted file mode 100644
index 2de0edc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/A1.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-public class A1 extends A{
-	protected I f(){
-		return this;
-	}
-	void test(){
-		f().m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test57/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/in/A.java
deleted file mode 100644
index 4dd4223..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	int f;
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().f=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/out/A.java
deleted file mode 100644
index 4dd4223..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	int f;
-	public void m() {}
-	public void m1() {}
-	protected A f(){
-		return this;
-	}
-	void test(){
-		f().f=0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test58/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/in/A.java
deleted file mode 100644
index 709538d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import p.A;
-class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/out/A.java
deleted file mode 100644
index 709538d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-
-import p.A;
-class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test59/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/in/A.java
deleted file mode 100644
index 0be1335..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-class A implements I{
-	public void m() throws IOException{
-		List list= new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/in/I.java
deleted file mode 100644
index d3792de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/in/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.io.IOException;
-/** typecomment template*/
-interface I {
-	void m() throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/out/A.java
deleted file mode 100644
index 0be1335..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-class A implements I{
-	public void m() throws IOException{
-		List list= new ArrayList();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/out/I.java
deleted file mode 100644
index d3792de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test5_/out/I.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-import java.io.IOException;
-/** typecomment template*/
-interface I {
-	void m() throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/in/A.java
deleted file mode 100644
index ba23032..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	public static void s() {}
-	void t(){
-		A.s();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/out/A.java
deleted file mode 100644
index ba23032..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	public static void s() {}
-	void t(){
-		A.s();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test60/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/in/A.java
deleted file mode 100644
index c16b697..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	public static int s= 0;
-	void t(){
-		A.s= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/out/A.java
deleted file mode 100644
index c16b697..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	public static int s= 0;
-	void t(){
-		A.s= 1;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test61/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/in/A.java
deleted file mode 100644
index d2a5048..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void t(){
-		new A(){
-			void g(){
-				A.this.m1();
-			}
-		};	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/out/A.java
deleted file mode 100644
index d2a5048..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void t(){
-		new A(){
-			void g(){
-				A.this.m1();
-			}
-		};	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test62/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/in/A.java
deleted file mode 100644
index 98bff3d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void t(){
-		new A(){
-			void g() throws InterruptedException{
-				A.super.wait();
-			}
-		};	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/out/A.java
deleted file mode 100644
index 98bff3d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void t(){
-		new A(){
-			void g() throws InterruptedException{
-				A.super.wait();
-			}
-		};	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test63/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/A.java
deleted file mode 100644
index e388da3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(Inter i){
-		A a= new A();
-		i.work(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/Inter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/Inter.java
deleted file mode 100644
index 06fa9e7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/in/Inter.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-public interface Inter {
-	void work(A a);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/A.java
deleted file mode 100644
index 6eea703..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(Inter i){
-		I a= new A();
-		i.work(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/Inter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/Inter.java
deleted file mode 100644
index 505676f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test64/out/Inter.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-
-public interface Inter {
-	void work(I a);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/in/A.java
deleted file mode 100644
index 35d13b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= create();
-		a.m1();
-	}
-	A create(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/out/A.java
deleted file mode 100644
index 35d13b2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= create();
-		a.m1();
-	}
-	A create(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test65/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/in/A.java
deleted file mode 100644
index ccba566..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(){
-		A a= create();
-		a.m();
-	}
-	A create(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/out/A.java
deleted file mode 100644
index 5cc489b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-	void f(){
-		I a= create();
-		a.m();
-	}
-	I create(){
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test66/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/A.java
deleted file mode 100644
index 82243b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/Inter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/Inter.java
deleted file mode 100644
index 147dd9a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/Inter.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface Inter {
-	void work(A a);
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/Outer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/Outer.java
deleted file mode 100644
index e09d286..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/in/Outer.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-public class Outer{
-	public static class Implementor implements Inter{	
-		public void work(A a) {}
-	}
-	Implementor implementor;
-	void f(){
-		A a= new A();
-		implementor.work(a);
-	}
-}	
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/A.java
deleted file mode 100644
index 82243b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/Inter.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/Inter.java
deleted file mode 100644
index 147dd9a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/Inter.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public interface Inter {
-	void work(A a);
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/Outer.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/Outer.java
deleted file mode 100644
index e09d286..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test67/out/Outer.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-public class Outer{
-	public static class Implementor implements Inter{	
-		public void work(A a) {}
-	}
-	Implementor implementor;
-	void f(){
-		A a= new A();
-		implementor.work(a);
-	}
-}	
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/A.java
deleted file mode 100644
index 61b7b47..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-	static A getA(){
-		return null;
-	}
-	public void m(){}
-	public void m1(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/As.java
deleted file mode 100644
index 5aa68d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/As.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		A a= A.getA();
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/A.java
deleted file mode 100644
index 61b7b47..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-	static A getA(){
-		return null;
-	}
-	public void m(){}
-	public void m1(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/As.java
deleted file mode 100644
index 5aa68d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/As.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		A a= A.getA();
-		a.m1();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test68/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/A.java
deleted file mode 100644
index 61b7b47..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-	static A getA(){
-		return null;
-	}
-	public void m(){}
-	public void m1(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/As.java
deleted file mode 100644
index 156c195..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/As.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		A a= A.getA();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/A.java
deleted file mode 100644
index be71c7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-class A implements I {
-	static I getA(){
-		return null;
-	}
-	public void m(){}
-	public void m1(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/As.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/As.java
deleted file mode 100644
index 5dfb4a2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/As.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-/** typecomment template*/
-public class As {
-	void f(){
-		I a= A.getA();
-		a.m();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/I.java
deleted file mode 100644
index aa33e93..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test69/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/in/A.java
deleted file mode 100644
index 7514b5e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/in/I.java
deleted file mode 100644
index df6e9a1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/in/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-/** typecomment template*/
-interface I {
-	List m(Set set) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/out/A.java
deleted file mode 100644
index 7514b5e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/out/I.java
deleted file mode 100644
index df6e9a1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test6_/out/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-/** typecomment template*/
-interface I {
-	List m(Set set) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/in/A.java
deleted file mode 100644
index 7795837..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/in/I.java
deleted file mode 100644
index 62cc2fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/out/A.java
deleted file mode 100644
index 7795837..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-
-public class A implements I {
-	public void m() {}
-	public void m1() {}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/out/I.java
deleted file mode 100644
index 62cc2fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test70/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-public interface I {
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/in/A.java
deleted file mode 100644
index ab8e79e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set, Set set1) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/in/I.java
deleted file mode 100644
index 6729aef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/in/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.Set;
-import java.util.List;
-/** typecomment template*/
-interface I {
-	List m(Set set, Set set1) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/out/A.java
deleted file mode 100644
index ab8e79e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set, Set set1) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/out/I.java
deleted file mode 100644
index 6729aef..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test7_/out/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.Set;
-import java.util.List;
-/** typecomment template*/
-interface I {
-	List m(Set set, Set set1) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/in/A.java
deleted file mode 100644
index f105f3a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set, String string) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/in/I.java
deleted file mode 100644
index 31f4af7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/in/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-/** typecomment template*/
-interface I {
-	List m(Set set, String string) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/out/A.java
deleted file mode 100644
index f105f3a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-
-class A implements I{
-	public List m(Set set, String string) throws IOException{
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/out/I.java
deleted file mode 100644
index 31f4af7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test8_/out/I.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-import java.io.IOException;
-import java.util.List;
-import java.util.Set;
-/** typecomment template*/
-interface I {
-	List m(Set set, String string) throws IOException;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/in/A.java
deleted file mode 100644
index 44f67ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public void m(int i, boolean b, short s, char c, long l, double d){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/in/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/in/I.java
deleted file mode 100644
index c2c8159..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/in/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m(int i, boolean b, short s, char c, long l, double d);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/out/A.java
deleted file mode 100644
index 44f67ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class A implements I{
-	public void m(int i, boolean b, short s, char c, long l, double d){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/out/I.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/out/I.java
deleted file mode 100644
index c2c8159..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/test9_/out/I.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-/** typecomment template*/
-interface I {
-	void m(int i, boolean b, short s, char c, long l, double d);
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew0/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew0/in/A.java
deleted file mode 100644
index 68e951a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew0/in/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//use Object
-class A{
-}
-class Test{
-	void test(){
-		A a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew0/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew0/out/A.java
deleted file mode 100644
index f33ec7f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew0/out/A.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package p;
-//use Object
-class A{
-}
-class Test{
-	void test(){
-		Object a= new A();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew1/in/A.java
deleted file mode 100644
index 35df66f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew1/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
-class Test{
-	void test() throws CloneNotSupportedException, InterruptedException{
-		A a= new A();
-		a.getClass();
-		a.equals(null);
-		a.hashCode();
-		a.notify();
-		a.notifyAll();
-		a.toString();
-		a.wait();
-		a.wait(0);
-		a.wait(0, 0);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew1/out/A.java
deleted file mode 100644
index fe63dff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew1/out/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
-class Test{
-	void test() throws CloneNotSupportedException, InterruptedException{
-		Object a= new A();
-		a.getClass();
-		a.equals(null);
-		a.hashCode();
-		a.notify();
-		a.notifyAll();
-		a.toString();
-		a.wait();
-		a.wait(0);
-		a.wait(0, 0);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/A.java
deleted file mode 100644
index f2da52e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A  extends B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/B.java
deleted file mode 100644
index b4d16e4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	public int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/Test.java
deleted file mode 100644
index 686a1f3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(B b){
-		b.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/A.java
deleted file mode 100644
index f2da52e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A  extends B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/B.java
deleted file mode 100644
index b4d16e4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	public int f;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/Test.java
deleted file mode 100644
index 57aa14f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew10/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B a= new A();
-		test(a);
-	}
-	void test(B b){
-		b.f= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/A.java
deleted file mode 100644
index 610201d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/B.java
deleted file mode 100644
index 1176786..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface B{
-	public static final int f = 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/Test.java
deleted file mode 100644
index 668a1ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(B b){
-		int y= b.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/A.java
deleted file mode 100644
index 610201d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/B.java
deleted file mode 100644
index 1176786..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface B{
-	public static final int f = 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/Test.java
deleted file mode 100644
index 2903684..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew11/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B a= new A();
-		test(a);
-	}
-	void test(B b){
-		int y= b.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/A.java
deleted file mode 100644
index 610201d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/B.java
deleted file mode 100644
index 1176786..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface B{
-	public static final int f = 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/Test.java
deleted file mode 100644
index fae09f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(A b){
-		int y= b.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/A.java
deleted file mode 100644
index 610201d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/B.java
deleted file mode 100644
index 1176786..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface B{
-	public static final int f = 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/Test.java
deleted file mode 100644
index 2903684..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew12/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B a= new A();
-		test(a);
-	}
-	void test(B b){
-		int y= b.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/A.java
deleted file mode 100644
index 610201d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/B.java
deleted file mode 100644
index 1be7bd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface B{
-	void foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/Test.java
deleted file mode 100644
index cb21f6a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(A b){
-		b.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/A.java
deleted file mode 100644
index 610201d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/B.java
deleted file mode 100644
index 1be7bd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface B{
-	void foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/Test.java
deleted file mode 100644
index a7a4cd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew13/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B a= new A();
-		test(a);
-	}
-	void test(B b){
-		b.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/A.java
deleted file mode 100644
index b7caa13..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-//use B
-abstract class A implements B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/B.java
deleted file mode 100644
index 1be7bd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface B{
-	void foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/Test.java
deleted file mode 100644
index 2784a2b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= null;
-		test(a);
-	}
-	void test(A b){
-		b.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/A.java
deleted file mode 100644
index b7caa13..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-//use B
-abstract class A implements B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/B.java
deleted file mode 100644
index 1be7bd3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-interface B{
-	void foo();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/Test.java
deleted file mode 100644
index 6d15a3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew14/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B a= null;
-		test(a);
-	}
-	void test(B b){
-		b.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/A.java
deleted file mode 100644
index 3169101..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public static final int f = 0;
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/B.java
deleted file mode 100644
index 93910c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/Test.java
deleted file mode 100644
index fae09f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(A b){
-		int y= b.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/A.java
deleted file mode 100644
index 3169101..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public static final int f = 0;
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/B.java
deleted file mode 100644
index 93910c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/Test.java
deleted file mode 100644
index fae09f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew15/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(A b){
-		int y= b.f;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/A.java
deleted file mode 100644
index 3169101..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public static final int f = 0;
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/B.java
deleted file mode 100644
index 93910c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/Test.java
deleted file mode 100644
index 9f63b12..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/in/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B b= new A();
-		if (b instanceof A){
-		} else{
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/A.java
deleted file mode 100644
index 3169101..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/A.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-//use B
-class A implements B{
-	public static final int f = 0;
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/B.java
deleted file mode 100644
index 93910c8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-interface B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/Test.java
deleted file mode 100644
index 9f63b12..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew16/out/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B b= new A();
-		if (b instanceof A){
-		} else{
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew17/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew17/in/A.java
deleted file mode 100644
index 02be956..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew17/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//use C
-interface I{}
-class C implements I{
-}
-
-class B extends C{
-}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		A c= new A();
-		c.toString();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew17/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew17/out/A.java
deleted file mode 100644
index 6ac86ac..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew17/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//use C
-interface I{}
-class C implements I{
-}
-
-class B extends C{
-}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		C c= new A();
-		c.toString();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew18/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew18/in/A.java
deleted file mode 100644
index 333bb11..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew18/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//use B
-interface I{}
-class C implements I{
-}
-
-class B extends C{
-}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		A c= new A();
-		c.toString();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew18/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew18/out/A.java
deleted file mode 100644
index c82a790..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew18/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//use B
-interface I{}
-class C implements I{
-}
-
-class B extends C{
-}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		B c= new A();
-		c.toString();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew19/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew19/in/A.java
deleted file mode 100644
index d3c964b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew19/in/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//use I
-interface I{}
-class C implements I{
-}
-
-class B extends C{
-}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		A c= new A();
-		c.toString();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew19/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew19/out/A.java
deleted file mode 100644
index e0e3df6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew19/out/A.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package p;
-//use I
-interface I{}
-class C implements I{
-}
-
-class B extends C{
-}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		I c= new A();
-		c.toString();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew2/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew2/in/A.java
deleted file mode 100644
index d48a194..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew2/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
-class Test{
-	void test(){
-		A a= new A();
-		a.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew2/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew2/out/A.java
deleted file mode 100644
index d48a194..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew2/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
-class Test{
-	void test(){
-		A a= new A();
-		a.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew20/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew20/in/A.java
deleted file mode 100644
index 24f6984..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew20/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//change to B
-class B{}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		A a= new A();
-		f(a);
-	}
-	void f(B b){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew20/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew20/out/A.java
deleted file mode 100644
index 51fb3ba..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew20/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//change to B
-class B{}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		B a= new A();
-		f(a);
-	}
-	void f(B b){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew21/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew21/in/A.java
deleted file mode 100644
index ad7b1a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew21/in/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//change to Object
-class B{}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		A a= new A();
-		f(a);
-	}
-	void f(B b){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew21/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew21/out/A.java
deleted file mode 100644
index ad7b1a4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew21/out/A.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package p;
-//change to Object
-class B{}
-class A extends B{
-}
-
-class Test{
-	void f(){
-		A a= new A();
-		f(a);
-	}
-	void f(B b){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/A.java
deleted file mode 100644
index c301b57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-//change to B
-class A extends B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/B.java
deleted file mode 100644
index f0b30e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class B{}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/Test.java
deleted file mode 100644
index daaaf59..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/in/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class Test{
-	A a;
-	void f(){
-		f(a);
-	}
-	void f(B b){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/A.java
deleted file mode 100644
index c301b57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-//change to B
-class A extends B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/B.java
deleted file mode 100644
index f0b30e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class B{}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/Test.java
deleted file mode 100644
index 931ad74..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew22/out/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class Test{
-	B a;
-	void f(){
-		f(a);
-	}
-	void f(B b){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/A.java
deleted file mode 100644
index 4002c75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-//change to Object
-class A extends B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/B.java
deleted file mode 100644
index f0b30e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class B{}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/Test.java
deleted file mode 100644
index daaaf59..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/in/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class Test{
-	A a;
-	void f(){
-		f(a);
-	}
-	void f(B b){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/A.java
deleted file mode 100644
index 4002c75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-//change to Object
-class A extends B{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/B.java
deleted file mode 100644
index f0b30e1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/B.java
+++ /dev/null
@@ -1,2 +0,0 @@
-package p;
-class B{}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/Test.java
deleted file mode 100644
index daaaf59..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew23/out/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class Test{
-	A a;
-	void f(){
-		f(a);
-	}
-	void f(B b){
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/in/A.java
deleted file mode 100644
index aef777f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/in/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-//change to Object
-interface A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/in/B.java
deleted file mode 100644
index 1a09cbc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/in/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B implements A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/out/A.java
deleted file mode 100644
index aef777f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/out/A.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-//change to Object
-interface A{
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/out/B.java
deleted file mode 100644
index 1a09cbc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew24/out/B.java
+++ /dev/null
@@ -1,3 +0,0 @@
-package p;
-class B implements A{
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/A.java
deleted file mode 100644
index cfe710f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-interface A{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/B.java
deleted file mode 100644
index 8beb399..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class B {
-	public B(A a){
-		a.m();
-	}
-	public void m() {	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/C.java
deleted file mode 100644
index f2c103d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/in/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class C extends B{
-	public C(A a, int i) {
-		super(a);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/A.java
deleted file mode 100644
index cfe710f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-interface A{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/B.java
deleted file mode 100644
index 8beb399..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/B.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-public class B {
-	public B(A a){
-		a.m();
-	}
-	public void m() {	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/C.java
deleted file mode 100644
index f2c103d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew25/out/C.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package p;
-public class C extends B{
-	public C(A a, int i) {
-		super(a);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/in/A.java
deleted file mode 100644
index cfe710f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-interface A{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/in/B.java
deleted file mode 100644
index 2d2d084..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/in/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class B {
-	public B(A a){
-		a.m();
-	}
-	public B(int y, A a){
-		this(a);
-	}
-	public void m() {	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/out/A.java
deleted file mode 100644
index cfe710f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-interface A{
-	void m();
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/out/B.java
deleted file mode 100644
index 2d2d084..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew26/out/B.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-public class B {
-	public B(A a){
-		a.m();
-	}
-	public B(int y, A a){
-		this(a);
-	}
-	public void m() {	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/in/A.java
deleted file mode 100644
index 2d596b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/in/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//use B
-class A extends B{
-	void f(A a){
-		a.field= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/in/B.java
deleted file mode 100644
index 890f6c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class B {
-	int field= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/out/A.java
deleted file mode 100644
index 8652ee4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/out/A.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package p;
-//use B
-class A extends B{
-	void f(B a){
-		a.field= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/out/B.java
deleted file mode 100644
index 890f6c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew27/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class B {
-	int field= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/in/A.java
deleted file mode 100644
index 11af736..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/in/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//use B
-class A extends B{
-	int field;
-	void f(A a){
-		a.field= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/in/B.java
deleted file mode 100644
index 890f6c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class B {
-	int field= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/out/A.java
deleted file mode 100644
index 11af736..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/out/A.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package p;
-//use B
-class A extends B{
-	int field;
-	void f(A a){
-		a.field= 0;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/out/B.java
deleted file mode 100644
index 890f6c5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew28/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-public class B {
-	int field= 0;
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew29/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew29/in/A.java
deleted file mode 100644
index a96448c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew29/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//change to B
-class B {
-} 
-class A extends B{
-    void f(A a){
-        A[] as= {a};
-        as[0].f(null);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew29/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew29/out/A.java
deleted file mode 100644
index a96448c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew29/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//change to B
-class B {
-} 
-class A extends B{
-    void f(A a){
-        A[] as= {a};
-        as[0].f(null);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew3/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew3/in/A.java
deleted file mode 100644
index e0ed591..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew3/in/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
-class Test{
-	void test() throws InterruptedException{
-		A a= new A();
-		a.getClass();
-		a.equals(null);
-		a.hashCode();
-		a.notify();
-		a.notifyAll();
-		a.toString();
-		a.wait();
-		a.wait(0);
-		a.wait(0, 0);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew3/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew3/out/A.java
deleted file mode 100644
index 1dd6103..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew3/out/A.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
-class Test{
-	void test() throws InterruptedException{
-		Object a= new A();
-		a.getClass();
-		a.equals(null);
-		a.hashCode();
-		a.notify();
-		a.notifyAll();
-		a.toString();
-		a.wait();
-		a.wait(0);
-		a.wait(0, 0);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew30/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew30/in/A.java
deleted file mode 100644
index 70e2962..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew30/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//change to B
-class B {
-} 
-class A extends B{
-    void f(A a){
-        A[] as= new A[]{a};
-        as[0].f(null);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew30/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew30/out/A.java
deleted file mode 100644
index 70e2962..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew30/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-//change to B
-class B {
-} 
-class A extends B{
-    void f(A a){
-        A[] as= new A[]{a};
-        as[0].f(null);
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew31/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew31/in/A.java
deleted file mode 100644
index a7589b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew31/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//change to B
-class B {
-} 
-class A extends B{
-    void f(){
-        A[] as= new A[0];
-        as[0].f();
-    }
-    void fz(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew31/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew31/out/A.java
deleted file mode 100644
index a7589b4..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew31/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-//change to B
-class B {
-} 
-class A extends B{
-    void f(){
-        A[] as= new A[0];
-        as[0].f();
-    }
-    void fz(){}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew32/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew32/in/A.java
deleted file mode 100644
index a41ca90..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew32/in/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//change to B
-class B {
-} 
-class A extends B{
-	void f(){
-		A a= null;
-		A a1= a;
-		A a2= a1;
-		A a3= null;
-		a3.f();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew32/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew32/out/A.java
deleted file mode 100644
index a98d211..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew32/out/A.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package p;
-//change to B
-class B {
-} 
-class A extends B{
-	void f(){
-		B a= null;
-		B a1= a;
-		B a2= a1;
-		A a3= null;
-		a3.f();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew33/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew33/in/A.java
deleted file mode 100644
index 5b12fbb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew33/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-//change to Vector
-import java.util.Vector;
-
-class A extends Vector {
-    void foo() {
-        A bar= null;
-        System.out.println(bar.toString());
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew33/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew33/out/A.java
deleted file mode 100644
index 7fdfb01..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew33/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-//change to Vector
-import java.util.Vector;
-
-class A extends Vector {
-    void foo() {
-        Vector bar= null;
-        System.out.println(bar.toString());
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew34/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew34/in/A.java
deleted file mode 100644
index 30c1cf7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew34/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-//change to Vector
-import java.util.Vector;
-
-class A extends Vector {
-    void foo() {
-        A bar= null;
-        System.out.println(bar.firstElement());
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew34/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew34/out/A.java
deleted file mode 100644
index dd8dfbb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew34/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-//change to Vector
-import java.util.Vector;
-
-class A extends Vector {
-    void foo() {
-        Vector bar= null;
-        System.out.println(bar.firstElement());
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew35/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew35/in/A.java
deleted file mode 100644
index 8ed2fc2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew35/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-//change to Vector
-import java.util.Vector;
-
-class A extends Vector {
-    void foo() {
-        A bar= null;
-        System.out.println(bar.capacity());
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew35/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew35/out/A.java
deleted file mode 100644
index 050f919..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew35/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-//change to Vector
-import java.util.Vector;
-
-class A extends Vector {
-    void foo() {
-        Vector bar= null;
-        System.out.println(bar.capacity());
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew36/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew36/in/A.java
deleted file mode 100644
index de7402f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew36/in/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class B {}
-class A extends B {}
-class Test{
-	void foo() {
-		A a= null;		
-		B b= (A) a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew36/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew36/out/A.java
deleted file mode 100644
index 0e90aaf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew36/out/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-
-class B {}
-class A extends B {}
-class Test{
-	void foo() {
-		B a= null;		
-		B b= (B) a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew37/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew37/in/A.java
deleted file mode 100644
index 3295d99..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew37/in/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class B {}
-class A extends B {}
-class Test{
-	void foo() {
-		A a= null;		
-		B b;
-		b= (A) a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew37/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew37/out/A.java
deleted file mode 100644
index 7ac949e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew37/out/A.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class B {}
-class A extends B {}
-class Test{
-	void foo() {
-		B a= null;		
-		B b;
-		b= (B) a;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew38/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew38/in/A.java
deleted file mode 100644
index bb03522..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew38/in/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-
-interface B {
-	public abstract int foo();
-}
-
-public class A implements B {
-	public int foo() {
-		return 0;
-	}
-	
-}
-
-class Tester {
-	void bar() {
-		A t= null;
-		int i= t.foo();
-		t.hashCode();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew38/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew38/out/A.java
deleted file mode 100644
index 733687b..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew38/out/A.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package p;
-
-interface B {
-	public abstract int foo();
-}
-
-public class A implements B {
-	public int foo() {
-		return 0;
-	}
-	
-}
-
-class Tester {
-	void bar() {
-		B t= null;
-		int i= t.foo();
-		t.hashCode();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/in/A.java
deleted file mode 100644
index 03608f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/in/Test.java
deleted file mode 100644
index 88c9b35..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/in/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class Test{
-	void test(){
-		A a= new A();
-		f(a);
-	}
-	void f(A a){
-		a.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/out/A.java
deleted file mode 100644
index 03608f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/out/Test.java
deleted file mode 100644
index 88c9b35..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew4/out/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class Test{
-	void test(){
-		A a= new A();
-		f(a);
-	}
-	void f(A a){
-		a.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/in/A.java
deleted file mode 100644
index 03608f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/in/Test.java
deleted file mode 100644
index dc51ed0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/in/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class Test{
-	void test(){
-		A a= new A();
-		f(a);
-	}
-	void f(A a){
-		a.getClass();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/out/A.java
deleted file mode 100644
index 03608f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/out/Test.java
deleted file mode 100644
index 6a28786..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew5/out/Test.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package p;
-class Test{
-	void test(){
-		Object a= new A();
-		f(a);
-	}
-	void f(Object a){
-		a.getClass();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/in/A.java
deleted file mode 100644
index 03608f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/in/Test.java
deleted file mode 100644
index f9a6139..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/in/Test.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class Test{
-	void test(){
-		A a= new A();
-		List list= new ArrayList(1);
-		list.add(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/out/A.java
deleted file mode 100644
index 03608f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-class A{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/out/Test.java
deleted file mode 100644
index 6920e3c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew6/out/Test.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class Test{
-	void test(){
-		Object a= new A();
-		List list= new ArrayList(1);
-		list.add(a);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/A.java
deleted file mode 100644
index 314eeed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A extends B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/B.java
deleted file mode 100644
index e099b0e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	public void fooB(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/Test.java
deleted file mode 100644
index af5a97e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(A a){
-		a.fooB();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/A.java
deleted file mode 100644
index 314eeed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A extends B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/B.java
deleted file mode 100644
index e099b0e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	public void fooB(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/Test.java
deleted file mode 100644
index 92b9cda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew7/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B a= new A();
-		test(a);
-	}
-	void test(B a){
-		a.fooB();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/A.java
deleted file mode 100644
index 314eeed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A extends B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/B.java
deleted file mode 100644
index 421cf56..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/Test.java
deleted file mode 100644
index 3e9cbf6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(A a){
-		a.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/A.java
deleted file mode 100644
index 314eeed..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use B
-class A extends B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/B.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/B.java
deleted file mode 100644
index 421cf56..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/B.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package p;
-class B{
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/Test.java
deleted file mode 100644
index 6d99e1d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew8/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		B a= new A();
-		test(a);
-	}
-	void test(B a){
-		a.foo();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/in/A.java
deleted file mode 100644
index 99794fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/in/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-class A {
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/in/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/in/Test.java
deleted file mode 100644
index 500eb57..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/in/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		A a= new A();
-		test(a);
-	}
-	void test(Object o){
-		o.hashCode();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/out/A.java
deleted file mode 100644
index 99794fa..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/out/A.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package p;
-//use Object
-class A {
-	public void foo(){};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/out/Test.java b/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/out/Test.java
deleted file mode 100644
index fd7140d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/UseSupertypeWherePossible/testNew9/out/Test.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package p;
-
-class Test{
-	void test(){
-		Object a= new A();
-		test(a);
-	}
-	void test(Object o){
-		o.hashCode();
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/templates/test/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/templates/test/in/A.java
deleted file mode 100644
index b23b2d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/templates/test/in/A.java
+++ /dev/null
@@ -1 +0,0 @@
-package p;
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/templates/test/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/templates/test/out/A.java
deleted file mode 100644
index b23b2d9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/templates/test/out/A.java
+++ /dev/null
@@ -1 +0,0 @@
-package p;
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/templates/testFail/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/templates/testFail/in/A.java
deleted file mode 100644
index ff4381d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/templates/testFail/in/A.java
+++ /dev/null
@@ -1 +0,0 @@
-package p;
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/AllTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/AllTests.java
deleted file mode 100644
index 993ac64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/AllTests.java
+++ /dev/null
@@ -1,28 +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.jdt.ui.tests.actions;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests {
-	
-	public static Test suite ( ) {
-		TestSuite suite= new TestSuite("All Action Tests");
-
-		suite.addTest(StructureSelectionActionTests.suite());
-		suite.addTest(GoToNextPreviousMemberActionTests.suite());
-		return suite;
-	}
-
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/GoToNextPreviousMemberActionTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/GoToNextPreviousMemberActionTests.java
deleted file mode 100644
index 05ba5f2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/GoToNextPreviousMemberActionTests.java
+++ /dev/null
@@ -1,117 +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.jdt.ui.tests.actions;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.ISourceRange;
-
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-import org.eclipse.jdt.internal.ui.javaeditor.selectionactions.GoToNextPreviousMemberAction;
-
-public class GoToNextPreviousMemberActionTests extends RefactoringTest{
-
-	private static final Class clazz= GoToNextPreviousMemberActionTests.class;
-	private static final String REFACTORING_PATH= "GoToNextPreviousMemberAction/";
-	public GoToNextPreviousMemberActionTests(String name){
-		super(name);
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private String getSimpleTestFileName(){
-		return "A_" + getName() + ".java";
-	}
-	
-	private String getTestFileName(){
-		return TEST_PATH_PREFIX + getRefactoringPath() + getSimpleTestFileName();
-	}
-	
-	//------------
-	protected ICompilationUnit createCUfromTestFile() throws Exception {
-		return createCU(getPackageP(), getSimpleTestFileName(), getFileContents(getTestFileName()));
-	}
-	
-	private void helper(int startLine, int startColumn, int endLine, int endColumn, 
-											int expectedStartLine, int expectedStartColumn, boolean isSelectNext) throws Exception {
-		ICompilationUnit cu= createCUfromTestFile();
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ISourceRange actualNewRange= new GoToNextPreviousMemberAction(isSelectNext).getNewSelectionRange(selection, cu.getAllTypes());
-		ISourceRange expectedNewRange= TextRangeUtil.getSelection(cu, expectedStartLine, expectedStartColumn, expectedStartLine, expectedStartColumn);
-		assertEquals("incorrect selection offset", expectedNewRange.getOffset(), actualNewRange.getOffset());
-		assertEquals("incorrect selection length", expectedNewRange.getLength(), actualNewRange.getLength());
-	}	
-
-	private void helperNext(int startLine, int startColumn, int expectedStartLine, int expectedStartColumn) throws Exception{
-		helper(startLine, startColumn, startLine, startColumn, expectedStartLine, expectedStartColumn, true);										
-	}
-
-	private void helperPrevious(int startLine, int startColumn, int expectedStartLine, int expectedStartColumn) throws Exception{
-		helper(startLine, startColumn, startLine, startColumn, expectedStartLine, expectedStartColumn, false);			
-	}
-
-	//----
-	public void testPrevious0() throws Exception{
-		helperPrevious(6, 5, 5, 11);
-	}
-
-	public void testPrevious1() throws Exception{
-		helperPrevious(8, 5, 7, 6);
-	}
-
-	public void testPrevious2() throws Exception{
-		helperPrevious(3, 1, 3, 1);
-	}
-
-	public void testPrevious3() throws Exception{
-		helperPrevious(15, 9, 13, 6);
-	}
-
-	public void testPrevious4() throws Exception{
-		helperPrevious(19, 1, 18, 9);
-	}
-
-	public void testPrevious5() throws Exception{
-		helperPrevious(31, 10, 27, 10);
-	}
-
-	public void testPrevious6() throws Exception{
-		helperPrevious(35, 3, 34, 2);
-	}
-
-	public void testNext0() throws Exception{
-		helperNext(3, 1, 4, 7);
-	}
-
-	public void testNext1() throws Exception{
-		helperNext(27, 10, 31, 10);
-	}
-
-	public void testNext2() throws Exception{
-		helperNext(35, 2, 35, 2);
-	}
-
-	public void testNext3() throws Exception{
-		helperNext(19, 1, 20, 13);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/StructureSelectionActionTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/StructureSelectionActionTests.java
deleted file mode 100644
index 3c63c4a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/actions/StructureSelectionActionTests.java
+++ /dev/null
@@ -1,368 +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.jdt.ui.tests.actions;
-
-import java.io.IOException;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.corext.SourceRange;
-import org.eclipse.jdt.internal.ui.javaeditor.selectionactions.StructureSelectEnclosingAction;
-import org.eclipse.jdt.internal.ui.javaeditor.selectionactions.StructureSelectNextAction;
-import org.eclipse.jdt.internal.ui.javaeditor.selectionactions.StructureSelectPreviousAction;
-import org.eclipse.jdt.ui.tests.refactoring.AbstractSelectionTestCase;
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-public class StructureSelectionActionTests extends RefactoringTest{
-	
-	private static final Class clazz= StructureSelectionActionTests.class;
-	private static final String REFACTORING_PATH= "StructureSelectionAction/";
-	
-	public StructureSelectionActionTests(String name){
-		super(name);
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private String getSimpleTestFileName(boolean input){
-		String fileName = "A_" + getName();
-		fileName += input ? "": "_out";
-		fileName +=  input ? ".java": ".txt"; 
-		return fileName;
-	}
-	
-	private String getTestFileName(boolean input){
-		return TEST_PATH_PREFIX + getRefactoringPath() + getSimpleTestFileName(input);
-	}
-	
-	//------------
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(input), getFileContents(getTestFileName(input)));
-	}
-	
-	private ISourceRange getSelection(ICompilationUnit cu) throws Exception{
-		String source= cu.getSource();
-		int offset= source.indexOf(AbstractSelectionTestCase.SQUARE_BRACKET_OPEN);
-		int end= source.indexOf(AbstractSelectionTestCase.SQUARE_BRACKET_CLOSE);
-		return new SourceRange(offset, end - offset);
-	}
-
-	private void check(ICompilationUnit cu, ISourceRange newRange) throws IOException, JavaModelException {
-		String expected= getFileContents(getTestFileName(false));
-		String actual= cu.getSource().substring(newRange.getOffset(), newRange.getOffset() + newRange.getLength());
-//		assertEquals("selection incorrect length", expected.length(), actual.length());
-		assertEqualLines("selection incorrect", expected, actual);
-	}	
-	
-	private void helperSelectUp() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true);
-		ISourceRange selection= getSelection(cu);
-
-		ISourceRange newRange= new StructureSelectEnclosingAction().getNewSelectionRange(selection, cu);
-		
-		check(cu, newRange);
-	}
-	
-	private void helperSelectUp(int startLine, int startColumn, int endLine, int endColumn) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ISourceRange newRange= new StructureSelectEnclosingAction().getNewSelectionRange(selection, cu);
-
-		check(cu, newRange);
-	}	
-	
-	private void helperSelectNext(int startLine, int startColumn, int endLine, int endColumn) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-
-		ISourceRange newRange= new StructureSelectNextAction().getNewSelectionRange(selection, cu);
-		check(cu, newRange);
-	}	
-	
-	private void helperSelectPrevious(int startLine, int startColumn, int endLine, int endColumn) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-
-		ISourceRange newRange= new StructureSelectPreviousAction().getNewSelectionRange(selection, cu);
-		check(cu, newRange);
-	}	
-		
-	private void helperZeroLength(int line, int column) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true);
-		ISourceRange selection= new SourceRange(TextRangeUtil.getOffset(cu, line, column), 1);
-			
-		//DebugUtils.dump(name() + ":<" + cu.getSource().substring(selection.getOffset()) + "/>");
-		
-		ISourceRange newRange= new StructureSelectEnclosingAction().getNewSelectionRange(selection, cu);
-		check(cu, newRange);
-	}
-	
-	private void offsetTest(int line, int column, int expected) throws Exception{
-		String filePath= TEST_PATH_PREFIX + getRefactoringPath() + "OffsetTest.java";
-		ICompilationUnit cu= createCU(getPackageP(), "OffsetTest.java", getFileContents(filePath));
-		assertEquals("incorrect offset", expected, TextRangeUtil.getOffset(cu, line, column));
-	}
-	
-
-	// ---- tests --- 
-	
-	public void test0() throws Exception{
-		helperSelectUp(4, 9, 4, 13);
-	}
-	
-	public void test1() throws Exception{
-		helperSelectUp();
-	}
-
-	public void test2() throws Exception{
-		helperSelectUp(4, 16, 4, 21);
-	}
-
-	public void test3() throws Exception{
-		helperSelectUp(4, 9, 4, 21);
-	}
-
-	public void test4() throws Exception{
-		helperSelectUp();
-	}
-	
-	public void test5() throws Exception{
-		helperSelectUp();
-	}
-	
-	public void test6() throws Exception{
-		helperSelectUp();
-	}
-
-	public void test7() throws Exception{
-		//helper1();
-		helperSelectUp(3, 10, 3, 14);
-	}
-
-	public void test8() throws Exception{
-		helperSelectUp(3, 16, 3, 18);
-	}
-
-	public void test9() throws Exception{
-		helperSelectUp(3, 10, 3, 11);
-	}
-	
-	public void test10() throws Exception{
-		helperSelectUp(4, 18, 4, 21);
-	}
-
-	public void test11() throws Exception{
-		helperSelectUp(4, 20, 4, 21);
-	}
-
-	public void test12() throws Exception{
-		helperSelectUp(4, 16, 4, 19);
-	}
-	
-	public void test13() throws Exception{
-		helperSelectUp(4, 13, 4, 16);
-	}
-	
-	public void test14() throws Exception{
-		helperSelectUp(4, 16, 4, 21);
-	}
-	
-	public void test15() throws Exception{
-		// identical to test9 ???
-		helperSelectUp(3, 10, 3, 11);
-	}
-	
-	public void test16() throws Exception{
-		helperSelectUp(3, 16, 3, 17);
-	}
-	
-	public void test17() throws Exception{
-		helperSelectUp(3, 5, 7, 6);
-	}
-	
-	public void test18() throws Exception{
-		helperSelectUp(3, 5, 4, 6);
-	}
-	
-	public void test19() throws Exception{
-		helperSelectUp(7, 14, 7, 16);
-	}
-	
-	public void test20() throws Exception{
-		helperSelectUp(4, 18, 4, 19);
-	}
-	
-	public void test21() throws Exception{
-		//regression test for bug#10182
-		//printTestDisabledMessage("regression test for bug#11151");
-		helperSelectNext(3, 21, 3, 28);
-	}
-	
-	public void test22() throws Exception{
-		//regression test for bug#10182
-		//printTestDisabledMessage("regression test for bug#11151");
-		helperSelectPrevious(3, 21, 3, 28);
-	}
-	
-	public void test23() throws Exception{
-//		printTestDisabledMessage("regression test for bug#10570");
-		helperSelectPrevious(5, 30, 7, 10);
-	}
-	
-	public void test24() throws Exception{
-		//regression test for bug#11424
-		helperSelectPrevious(3, 13, 5, 6);
-	}
-
-	public void test25() throws Exception{
-		//regression test for bug#11879
-		helperSelectNext(5, 5, 6, 6);
-	}
-	
-	public void test26() throws Exception{
-		//regression test for bug#11879
-		helperSelectPrevious(5, 5, 6, 6);
-	}
-	
-	public void test27() throws Exception{
-		//regression test for bug#11879
-		helperSelectNext(4, 1, 4, 10);
-	}
-
-	public void test28() throws Exception{
-		//regression test for bug#11879
-		helperSelectPrevious(4, 1, 4, 10);
-	}
-	
-	public void test29() throws Exception{
-//		printTestDisabledMessage("regression test for bug#16051");
-		helperSelectUp(5, 13, 5, 17);
-	}
-
-	public void test30() throws Exception{
-//		printTestDisabledMessage("regression test for bug#22082");
-		helperSelectUp(3, 10, 3, 10);
-	}
-	
-	public void test31() throws Exception{
-//		printTestDisabledMessage("regression test for bug#22082");
-		helperSelectUp(3, 10, 3, 10);
-	}
-
-	public void test32() throws Exception{
-//		printTestDisabledMessage("regression test for bug#22939");
-		helperSelectUp(4, 18, 4, 18);
-	}
-
-	public void test33() throws Exception{
-//		printTestDisabledMessage("regression test for bug#22939");
-		helperSelectUp(5, 23, 5, 23);
-	}
-
-	public void test34() throws Exception{
-//		printTestDisabledMessage("regression test for bug#23118");
-		helperSelectUp(5, 14, 5, 14);
-	}
-
-	public void test35() throws Exception{
-//		printTestDisabledMessage("regression test for bug#23118");
-		helperSelectUp(5, 14, 5, 14);
-	}
-
-	public void test36() throws Exception{
-//		printTestDisabledMessage("regression test for bug#23259");
-		helperSelectUp(5, 14, 5, 14);
-	}
-
-	public void test37() throws Exception{
-//		printTestDisabledMessage("regression test for bug#23259");
-		helperSelectUp(7, 14, 7, 14);
-	}
-
-	public void test38() throws Exception{
-//		printTestDisabledMessage("regression test for bug#23263");
-		helperSelectPrevious(4, 5, 5, 16);
-	}
-
-	public void test39() throws Exception{
-//		printTestDisabledMessage("regression test for bug#23464");
-		helperSelectPrevious(6, 13, 6, 20);
-	}
-
-	public void test40() throws Exception{
-//		printTestDisabledMessage("regression test for bug#23464 ");
-		helperSelectPrevious(7, 13, 7, 20);
-	}
-	
-	public void testZeroLength0() throws Exception{
-		//printTestDisabledMessage("");
-		helperZeroLength(4, 20);
-	}
-	
-	public void testWholeCu() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true);
-		ISourceRange selection= cu.getSourceRange();
-
-		ISourceRange newRange= new StructureSelectEnclosingAction().getNewSelectionRange(selection, cu);
-		
-		String expected= getFileContents(getTestFileName(false));
-		String actual= cu.getSource().substring(newRange.getOffset(), newRange.getOffset() + newRange.getLength());
-		assertEqualLines("selection incorrect", expected, actual);
-	}
-
-	//--- offset calculation tests
-	
-	public void testOffset0() throws Exception{
-		offsetTest(4, 20, 47);
-	}	
-	
-	public void testOffset1() throws Exception{
-		offsetTest(5, 9, 53);
-	}	
-	
-	public void testOffset2() throws Exception{
-		offsetTest(7, 13, 81);
-	}	
-	
-	public void testTabCount0(){
-		int t= TextRangeUtil.calculateTabCountInLine("\t\t1", 9);
-		assertEquals(2, t);
-	}
-	
-	public void testTabCount1(){
-		int t= TextRangeUtil.calculateTabCountInLine("\t\tint i= 1 + 1;", 20);
-		assertEquals(2, t);
-	}
-	
-	public void testTabCount2(){
-		int t= TextRangeUtil.calculateTabCountInLine("\t\t\treturn;", 13);
-		assertEquals(3, t);
-	}
-	
-	public void testTabCount3(){
-		int t= TextRangeUtil.calculateTabCountInLine("\tvoid m(){m();", 18);
-		assertEquals(1, t);
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/all/AllAllTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/all/AllAllTests.java
deleted file mode 100644
index f464f71..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/all/AllAllTests.java
+++ /dev/null
@@ -1,29 +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.jdt.ui.tests.all;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllAllTests {
-	public static Test suite ( ) {
-		TestSuite suite= new TestSuite("All Tests");
-		suite.addTest(org.eclipse.jdt.ui.tests.actions.AllTests.suite());
-		suite.addTest(org.eclipse.jdt.ui.tests.nls.AllTests.suite());
-		suite.addTest(org.eclipse.jdt.ui.tests.refactoring.AllTests.suite());
-		suite.addTest(org.eclipse.jdt.ui.tests.refactoring.extensions.AllTests.suite());
-		suite.addTest(org.eclipse.jdt.ui.tests.changes.AllTests.suite());
-		suite.addTest(org.eclipse.jdt.ui.tests.reorg.AllTests.suite());
-		suite.addTest(org.eclipse.jdt.ui.tests.typeconstraints.TypeConstraintTests.suite());
-	    return suite;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/changes/AllTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/changes/AllTests.java
deleted file mode 100644
index b2aef8c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/changes/AllTests.java
+++ /dev/null
@@ -1,27 +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.jdt.ui.tests.changes;
-
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-
-public class AllTests {
-	
-	public static Test suite ( ) {
-		TestSuite suite= new TestSuite("All Change Tests");
-		suite.addTest(TrackPositionTest.suite());
-	    return suite;
-	}
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/changes/TrackPositionTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/changes/TrackPositionTest.java
deleted file mode 100644
index 2283f7d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/changes/TrackPositionTest.java
+++ /dev/null
@@ -1,88 +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.jdt.ui.tests.changes;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit; 
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.changes.TextBufferChange;
-import org.eclipse.jdt.internal.corext.refactoring.changes.TextChangeCompatibility;
-import org.eclipse.jdt.internal.corext.textmanipulation.TextBuffer;
-
-import org.eclipse.jdt.internal.ui.refactoring.changes.AbortChangeExceptionHandler;
-
-public class TrackPositionTest extends TestCase {
-
-	private static final Class THIS= TrackPositionTest.class;
-	private static final String NN= "N.N";
-	
-	private TextBuffer fBuffer;
-	private TextBufferChange fChange;
-	
-	public TrackPositionTest(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new TestSuite(THIS);
-	}
-	
-	protected void setUp() throws Exception {
-		fBuffer= TextBuffer.create("0123456789");
-		fChange= new TextBufferChange(NN, fBuffer);
-		fChange.setKeepExecutedTextEdits(true);
-	}
-	
-	protected void tearDown() throws Exception {
-		fChange= null;
-	}
-
-	public void test1() throws Exception {
-		TextEdit edit= new ReplaceEdit(2, 2, "xyz");
-		TextChangeCompatibility.addTextEdit(fChange, NN, edit);
-		executeChange();
-		assertEquals(fChange.getNewTextRange(edit), 2, 3);
-	}
-	
-	public void test2() throws Exception {
-		TextEdit edit= new ReplaceEdit(5, 3, "xy");
-		TextChangeCompatibility.addTextEdit(fChange, NN, edit);
-		IDocument preview= fChange.getPreviewDocument();
-		assertEquals(fBuffer.getContent(), "0123456789");
-		assertEquals(preview.get(), "01234xy89");
-		assertEquals(fChange.getNewTextRange(edit), 5, 2);
-	}
-		
-	private void executeChange() throws Exception {
-		try {
-			ChangeContext context= new ChangeContext(new AbortChangeExceptionHandler());
-			fChange.aboutToPerform(context, new NullProgressMonitor());
-			fChange.perform(context, new NullProgressMonitor());
-		} finally {
-			fChange.performed();
-		}
-	}
-	
-	private static void assertEquals(IRegion r, int offset, int length) {
-		assertEquals("Offset", offset, r.getOffset());
-		assertEquals("Length", length, r.getLength());	
-	}	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/AllTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/AllTests.java
deleted file mode 100644
index c77b210..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/AllTests.java
+++ /dev/null
@@ -1,30 +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.jdt.ui.tests.nls;
-
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-
-public class AllTests {
-	
-	public static Test suite ( ) {
-		TestSuite suite= new TestSuite("All NLS Tests");
-		suite.addTest(NLSElementTester.suite());
-		suite.addTest(NLSScannerTester.suite());
-		suite.addTest(CellEditorTester.suite());
-		suite.addTest(OrderedMapTester.suite());
-	    return suite;
-	}
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/CellEditorTester.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/CellEditorTester.java
deleted file mode 100644
index 771b9d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/CellEditorTester.java
+++ /dev/null
@@ -1,77 +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.jdt.ui.tests.nls;
-
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.internal.ui.refactoring.nls.MultiStateCellEditor;
-
-
-public class CellEditorTester extends TestCase {
-
-	/**
-	 * Constructor for CellEditorTester
-	 */
-	public CellEditorTester(String name) {
-		super(name);
-	}
-	
-	public static void main (String[] args) {
-		junit.textui.TestRunner.run (suite());
-	}
-	
-	public static Test suite() {
-		return new TestSuite(CellEditorTester.class);
-	}
-	
-	public void test0(){
-		MultiStateCellEditor ce= new MultiStateCellEditor(null, 3, 0);
-		assertTrue(ce.getValue().equals(new Integer(0)));	
-	}
-	
-	public void test1(){
-		MultiStateCellEditor ce= new MultiStateCellEditor(null, 3, 0);
-		ce.activate();
-		assertTrue(ce.getValue().equals(new Integer(1)));	
-	}
-	public void test2(){
-		MultiStateCellEditor ce= new MultiStateCellEditor(null, 3, 0);
-		ce.activate();
-		ce.activate();
-		assertTrue(ce.getValue().equals(new Integer(2)));	
-	}
-	
-	public void test3(){
-		MultiStateCellEditor ce= new MultiStateCellEditor(null, 3, 0);
-		ce.activate();
-		ce.activate();
-		ce.activate();
-		assertTrue(ce.getValue().equals(new Integer(0)));	
-	}
-	
-	public void test4(){
-		MultiStateCellEditor ce= new MultiStateCellEditor(null, 3, 0);
-		ce.setValue(new Integer(1));
-		assertTrue(ce.getValue().equals(new Integer(1)));	
-	}
-	
-	public void test5(){
-		MultiStateCellEditor ce= new MultiStateCellEditor(null, 3, 0);
-		ce.setValue(new Integer(2));
-		ce.activate();
-		assertTrue(ce.getValue().equals(new Integer(0)));	
-	}	
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/NLSElementTester.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/NLSElementTester.java
deleted file mode 100644
index a225c38..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/NLSElementTester.java
+++ /dev/null
@@ -1,84 +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.jdt.ui.tests.nls;
-
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.internal.corext.refactoring.nls.NLSElement;
-
-
-public class NLSElementTester extends TestCase{
-	
-	public NLSElementTester(String name) {
-		super(name);
-	}
-	
-	private NLSElement fEl;
-	private int fOff, fLen;
-	private String fVal;
-	
-	
-	public static void main (String[] args) {
-		junit.textui.TestRunner.run (suite());
-	}
-	
-	public static Test suite() {
-		return new TestSuite(NLSElementTester.class);
-	}
-	
-	protected void setUp(){
-		fOff= 3;
-		fLen= 5;
-		fVal= "test";
-		fEl= new NLSElement(fVal, fOff, fLen);
-	}
-	
-	protected void tearDown(){
-	}
-	
-	public void test0(){
-		assertEquals("Position offset", fOff, fEl.getPosition().getOffset());
-	}
-	
-	public void test1(){	
-		assertEquals("Position length", fLen, fEl.getPosition().getLength());
-	}
-	
-	public void test2(){		
-		assertEquals("value", fVal, fEl.getValue());
-	}
-	
-	public void test3(){	
-		assertEquals("tagposition", null, fEl.getTagPosition());
-	}
-	
-	public void test3a(){	
-		fEl.setTagPosition(1, 2);
-		assertEquals("tagposition.length", 2, fEl.getTagPosition().getLength());
-		assertEquals("tagposition.offset", 1, fEl.getTagPosition().getOffset());
-	}
-
-
-	public void test4(){	
-		assertEquals("hastag", false, fEl.hasTag());
-	}
-	
-	public void test4a(){	
-		fEl.setTagPosition(1, 2);
-		assertEquals("hastag", true, fEl.hasTag());
-	}
-		
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/NLSScannerTester.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/NLSScannerTester.java
deleted file mode 100644
index 0b0bbbe..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/NLSScannerTester.java
+++ /dev/null
@@ -1,229 +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.jdt.ui.tests.nls;
-
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.internal.corext.refactoring.nls.NLSElement;
-import org.eclipse.jdt.internal.corext.refactoring.nls.NLSLine;
-import org.eclipse.jdt.internal.corext.refactoring.nls.NLSScanner;
-
-
-public class NLSScannerTester extends TestCase {
-
-
-	public NLSScannerTester(String name) {
-		super(name);
-	}
-	
-	public static void main (String[] args) {
-		junit.textui.TestRunner.run (suite());
-	}
-	
-	public static Test suite() {
-		return new TestSuite(NLSScannerTester.class);
-	}
-	
-	private void printDisabledMessage(String msg){
-		System.out.println("\nTest " + getName() + " disabled (" + msg + ")");
-	}
-	
-	public void test0() throws Exception{
-		String text= "fred";
-		NLSLine[] l= NLSScanner.scan(text);
-		assertEquals("empty", true, l.length == 0);
-	}
-	
-	public void test1() throws Exception{
-//		String text= "fred\"x\"";
-//		List l= NLSScanner.scan(text);
-//		assertEquals("non empty", false, l.isEmpty());
-//		assertEquals("1 line", 1, l.size());
-		printDisabledMessage("Scanner does not handle strings in the first line");
-	}
-	
-	public void test1a() throws Exception{
-		String text= "fred\n\"x\"";
-		NLSLine[] l= NLSScanner.scan(text);
-		assertEquals("non empty", false, l.length == 0);
-		assertEquals("1 line", 1,l.length);
-	}
-	
-	public void test2() throws Exception{
-//		String text= "fred\"x\" \"xx\"";
-//		NLSLine[] l= NLSScanner.scan(text);
-//		assertEquals("non empty", false, l.isEmpty());
-//		assertEquals("2 line", 2,l.length);
-		printDisabledMessage("Scanner does not handle strings in the first line");
-	}
-	
-	public void test2a() throws Exception{
-		String text= "fred\n\"x\" \"xx\"";
-		NLSLine[] l= NLSScanner.scan(text);
-		assertEquals("non empty", false, l.length == 0);
-		assertEquals("1 lines", 1,l.length);
-	}
-	
-	public void test3() throws Exception{
-//		String text= "fred\"x\"\n \"xx\"";
-//		NLSLine[] l= NLSScanner.scan(text);
-//		assertEquals("non empty", false, l.length == 0);
-//		assertEquals("2 lines", 2,l.length);
-		printDisabledMessage("Scanner does not handle strings in the first line");
-	}
-
-
-	public void test4() throws Exception{
-		String text= "fred\n \"xx\"";
-		NLSLine[] l= NLSScanner.scan(text);
-		assertEquals("non empty", false, l.length == 0);
-		assertEquals("1 line", 1,l.length);
-	}
-	
-	public void test5() throws Exception{
-		String text= "\n \"xx\"";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("1 string", 1, line.size());
-	}	
-	
-	public void test6() throws Exception{
-		String text= "\n \"xx\" \"dff\"";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("2 string", 2, line.size());
-	}	
-	
-	public void test7() throws Exception{
-		String text= "\n \"xx\" \n\"dff\"";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("1 string A", 1, line.size());
-		
-		line= l[1];
-		assertEquals("1 string B", 1, line.size());
-	}	
-
-
-	public void test8() throws Exception{
-		String text= "\n \"xx\" \n\"dff\" \"ccc\"";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("1 string A", 1, line.size());
-		
-		line= l[1];
-		assertEquals("2 strings B", 2, line.size());
-	}
-	
-	public void test9() throws Exception{
-		String text= "fred\n \"xx\"" + NLSElement.createTagText(1) + "\n";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		NLSElement el= line.get(0);
-		assertEquals("has tag", true, el.hasTag());
-	}
-
-
-	public void test10() throws Exception{
-		String text= "fred\n \"xx\"\n";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		NLSElement el= line.get(0);
-		assertEquals("has tag", false, el.hasTag());
-	}
-	
-	public void test11() throws Exception{
-		String text= 
-				"\n\"x\" \"y\""
-				+ NLSElement.createTagText(2) 
-				+ NLSElement.createTagText(1) 
-				+ "\n";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("2 strings", 2, line.size());
-		
-		NLSElement el= line.get(0);
-		assertEquals("0 has tag", true, el.hasTag());
-		
-		el= line.get(1);
-		assertEquals("1 has tag", true, el.hasTag());
-	}
-	
-	public void test12() throws Exception{
-		String text= 
-				"\n\"x\" \"y\""
-				+ NLSElement.createTagText(1) 
-				+ NLSElement.createTagText(2) 
-				+ "\n";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("2 strings", 2, line.size());
-		
-		NLSElement el= line.get(0);
-		assertEquals("0 has tag", true, el.hasTag());
-		
-		el= line.get(1);
-		assertEquals("1 has tag", true, el.hasTag());
-	}
-	
-	public void test13() throws Exception{
-		String text= 
-				"\n\"x\" \"y\""
-				+ NLSElement.createTagText(1) 
-				+ "\n";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("2 strings", 2, line.size());
-		
-		NLSElement el= line.get(0);
-		assertEquals("0 has tag", true, el.hasTag());
-		
-		el= line.get(1);
-		assertEquals("1 has no tag", false, el.hasTag());
-	}
-	
-	public void test14() throws Exception{
-		String text= 
-				"\n\"x\" \"y\""
-				+ NLSElement.createTagText(2) 
-				+ "\n";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("2 strings", 2, line.size());
-		
-		NLSElement el= line.get(0);
-		assertEquals("0 has no tag", false, el.hasTag());
-		
-		el= line.get(1);
-		assertEquals("1 has tag", true, el.hasTag());
-	}
-
-	//regression test for bug 12600
-	public void test54() throws Exception{
-		String text= 
-				"\n\"x\""
-				+ NLSElement.TAG_PREFIX + 1 
-				+ "\n";
-		NLSLine[] l= NLSScanner.scan(text);
-		NLSLine line=l[0];
-		assertEquals("1 strings", 1, line.size());
-		
-		NLSElement el= line.get(0);
-		assertEquals("0 has no tag", false, el.hasTag());
-		
-	}
-				
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/OrderedMapTester.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/OrderedMapTester.java
deleted file mode 100644
index ec4d903..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/nls/OrderedMapTester.java
+++ /dev/null
@@ -1,113 +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.jdt.ui.tests.nls;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.internal.ui.refactoring.nls.OrderedMap;
-
-public class OrderedMapTester extends TestCase {
-
-	/**
-	 * Constructor for OrderedMapTester
-	 */
-	public OrderedMapTester(String name) {
-		super(name);
-	}
-
-	public static void main (String[] args) {
-		junit.textui.TestRunner.run (suite());
-	}
-	
-	public static Test suite() {
-		return new TestSuite(OrderedMapTester.class);
-	}
-	
-	private OrderedMap m;
-	
-	public void setUp(){
-		m= new OrderedMap();
-	}
-	
-	public void test0(){
-		assertTrue(m.peek() == null);
-	}
-	
-	public void test1(){
-		String key= "key";
-		m.push(key, this);
-		assertTrue(m.peek() != null);
-	}
-	
-	public void test2(){
-		String key= "key";
-		m.push(key, this);
-		m.remove(key);
-		assertTrue(m.peek() == null);
-	}
-	
-	public void test3(){
-		String key= "key";
-		m.push(key, this);
-		m.push(key, key);
-		assertTrue("A", m.peek() != null);
-		m.remove(key);
-		assertTrue("B", m.peek() == null);
-	}
-	
-	public void test4(){
-		m.remove(this);
-	}
-	
-	public void test5(){
-		String key1= "key1";
-		String key2= "key2";
-		String v1= "v1";
-		String v2= "v2";
-		m.push(key1, v1);
-		m.push(key2, v2);
-		assertTrue("A", m.peek().equals(v2));
-		m.remove(key2);
-		assertTrue("B", m.peek().equals(v1));
-	}
-
-	public void test6(){
-		String key1= "key1";
-		String key2= "key2";
-		String v1= "v1";
-		String v2= "v2";
-		m.push(key1, v1);
-		m.push(key2, v2);
-		assertEquals("A", v2, m.peek());
-		m.remove(key1);
-		assertEquals("B", v2, m.peek());
-		m.remove(key2);
-		assertEquals("B", null, m.peek());
-	}
-	
-	public void test7(){
-		String key1= "key1";
-		String key2= "key2";
-		String v1= "v1";
-		String v2= "v2";
-		m.push(key1, v1);
-		m.push(key2, v2);
-		assertEquals("A", v2, m.peek());
-		m.remove(key2);
-		assertEquals("B", v1, m.peek());
-		m.remove(key1);
-		assertEquals("B", null, m.peek());
-	}
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AbstractSelectionTestCase.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AbstractSelectionTestCase.java
deleted file mode 100644
index 543550d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AbstractSelectionTestCase.java
+++ /dev/null
@@ -1,144 +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.jdt.ui.tests.refactoring;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.core.resources.IWorkspaceRunnable;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.AbstractCUTestCase;
-import org.eclipse.jdt.ui.tests.refactoring.infra.RefactoringTestPlugin;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-public abstract class AbstractSelectionTestCase extends AbstractCUTestCase {
-
-	public static final String SQUARE_BRACKET_OPEN= "/*[*/";
-	public static final int    SQUARE_BRACKET_OPEN_LENGTH= SQUARE_BRACKET_OPEN.length();
-	public static final String SQUARE_BRACKET_CLOSE=   "/*]*/";
-	public static final int    SQUARE_BRACKET_CLOSE_LENGTH= SQUARE_BRACKET_CLOSE.length();
-	
-	protected static final int VALID_SELECTION=     1;
-	protected static final int INVALID_SELECTION=   2;
-	protected static final int COMPARE_WITH_OUTPUT= 3;
-	
-	public AbstractSelectionTestCase(String name) {
-		super(name);
-	}
-
-	protected int[] getSelection(String source) {
-		int start= -1;
-		int end= -1;
-		int includingStart= source.indexOf(SQUARE_BRACKET_OPEN);
-		int excludingStart= source.indexOf(SQUARE_BRACKET_CLOSE);
-		int includingEnd= source.lastIndexOf(SQUARE_BRACKET_CLOSE);
-		int excludingEnd= source.lastIndexOf(SQUARE_BRACKET_OPEN);
-
-		if (includingStart > excludingStart && excludingStart != -1) {
-			includingStart= -1;
-		} else if (excludingStart > includingStart && includingStart != -1) {
-			excludingStart= -1;
-		}
-		
-		if (includingEnd < excludingEnd) {
-			includingEnd= -1;
-		} else if (excludingEnd < includingEnd) {
-			excludingEnd= -1;
-		}
-		
-		if (includingStart != -1) {
-			start= includingStart;
-		} else {
-			start= excludingStart + SQUARE_BRACKET_CLOSE_LENGTH;
-		}
-		
-		if (excludingEnd != -1) {
-			end= excludingEnd;
-		} else {
-			end= includingEnd + SQUARE_BRACKET_CLOSE_LENGTH;
-		}
-		
-		assertTrue("Selection invalid", start >= 0 && end >= 0 && end >= start);
-		
-		int[] result= new int[] { start, end - start }; 
-		// System.out.println("|"+ source.substring(result[0], result[0] + result[1]) + "|");
-		return result;
-	}
-	
-	protected ITextSelection getTextSelection(String source) {
-		int[] s= getSelection(source);
-		return new TextSelection(s[0], s[1]);
-	}
-	
-	protected InputStream getFileInputStream(String fileName) throws IOException {
-		return RefactoringTestPlugin.getDefault().getTestResourceStream(fileName);
-	}
-	
-	protected void performTest(ICompilationUnit unit, Refactoring refactoring, int mode, String out) throws Exception {
-		IProgressMonitor pm= new NullProgressMonitor();
-		RefactoringStatus status= checkPreconditions(refactoring, pm);
-		switch (mode) {
-			case VALID_SELECTION:
-				// System.out.println(status);
-				assertTrue(status.isOK());
-				break;
-			case INVALID_SELECTION:
-				// System.out.println(status);
-				assertTrue(!status.isOK());
-				break;
-			case COMPARE_WITH_OUTPUT:
-				assertTrue(!status.hasFatalError());
-				String original= unit.getSource();
-				final IChange change= refactoring.createChange(pm);
-				assertNotNull(change);
-				final ChangeContext context= new ChangeContext(new TestExceptionHandler());
-				change.aboutToPerform(context, pm);
-				JavaCore.run(new IWorkspaceRunnable() {
-					public void run(IProgressMonitor monitor) throws CoreException {
-						change.perform(context, monitor);
-					}
-				}, pm);
-				change.performed();
-				final IChange undo= change.getUndoChange();
-				assertNotNull(undo);
-				compareSource(unit.getSource(), out);
-				final ChangeContext context2= new ChangeContext(new TestExceptionHandler());
-				undo.aboutToPerform(context, pm);
-				JavaCore.run(new IWorkspaceRunnable() {
-					public void run(IProgressMonitor monitor) throws CoreException {
-						undo.perform(context2, monitor);
-					}
-				}, pm);
-				undo.performed();
-				compareSource(unit.getSource(), original);
-				break;		
-		}
-	}
-	
-	protected RefactoringStatus checkPreconditions(Refactoring refactoring, IProgressMonitor pm) throws CoreException {
-		return refactoring.checkPreconditions(pm);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllChangeTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllChangeTests.java
deleted file mode 100644
index 9a3938e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllChangeTests.java
+++ /dev/null
@@ -1,27 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllChangeTests {
-	private static final Class clazz= AllChangeTests.class;
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite(clazz.getName());
-		suite.addTest(new TestSuite(RenameResourceChangeTests.class));
-		suite.addTest(new TestSuite(RenameSourceFolderChangeTests.class));
-		suite.addTest(new TestSuite(CopyPackageChangeTest.class));
-		return new MySetup(suite);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllRefactoringTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllRefactoringTests.java
deleted file mode 100644
index 0ee4f9f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllRefactoringTests.java
+++ /dev/null
@@ -1,71 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-
-public class AllRefactoringTests {
-
-	private static final Class clazz= AllRefactoringTests.class;
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite(clazz.getName());
-
-		//--code
-		suite.addTest(ExtractMethodTests.suite());
-		suite.addTest(InlineMethodTests.suite());
-		suite.addTest(SefTests.suite());
-		suite.addTest(InlineTempTests.suite());
-		suite.addTest(ExtractTempTests.suite());
-		suite.addTest(RenameTempTests.suite());
-		suite.addTest(ExtractConstantTests.suite());
-		suite.addTest(PromoteTempToFieldTests.suite());
-		suite.addTest(ConvertAnonymousToNestedTests.suite());
-		suite.addTest(InlineConstantTests.suite());
-		suite.addTest(IntroduceParameterTests.suite());
-		suite.addTest(IntroduceFactoryTests.suite());
-		
-		//-- structure
-		suite.addTest(ChangeSignatureTests.suite());
-		suite.addTest(PullUpTests.suite());
-		suite.addTest(PushDownTests.suite());
-		suite.addTest(MoveMembersTests.suite());
-		suite.addTest(ExtractInterfaceTests.suite());
-		suite.addTest(MoveInnerToTopLevelTests.suite());
-		suite.addTest(UseSupertypeWherePossibleTests.suite());
-		
-		//--methods
-		suite.addTest(RenameVirtualMethodInClassTests.suite());
-		suite.addTest(RenameMethodInInterfaceTests.suite());
-		suite.addTest(RenamePrivateMethodTests.suite());	
-		suite.addTest(RenameStaticMethodTests.suite());
-		suite.addTest(RenameParametersTests.suite());
-		suite.addTest(MoveInstanceMethodTests.suite());
-		
-		//--types
-		suite.addTest(RenameTypeTests.suite());	
-		suite.addTest(ChangeTypeRefactoringTests.suite());
-		
-		//--packages
-		suite.addTest(RenamePackageTests.suite());
-		
-		//--fields
-		suite.addTest(RenamePrivateFieldTests.suite());
-		suite.addTest(RenameNonPrivateFieldTests.suite());
-		
-		//--projects
-		suite.addTest(RenameJavaProjectTests.suite());		
-		return suite;
-	}
-}
- 
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllTests.java
deleted file mode 100644
index 9601b35..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllTests.java
+++ /dev/null
@@ -1,31 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests {
-	
-	private static final Class clazz= AllTests.class;
-	
-	public static Test suite() {
-		TestSuite suite= new TestSuite(clazz.getName());
-		suite.addTest(AllRefactoringTests.suite());
-		suite.addTest(AllChangeTests.suite());
-		suite.addTest(UndoManagerTests.suite());
-		suite.addTest(PathTransformationTests.suite());
-		suite.addTest(RefactoringScannerTests.suite());
-		suite.addTest(SurroundWithTests.suite());
-		return suite;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests.java
deleted file mode 100644
index 3e73829..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests.java
+++ /dev/null
@@ -1,1231 +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.jdt.ui.tests.refactoring;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.dom.Modifier;
-
-import org.eclipse.jdt.internal.corext.refactoring.ExceptionInfo;
-import org.eclipse.jdt.internal.corext.refactoring.ParameterInfo;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureRefactoring;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.internal.corext.util.JdtFlags;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class ChangeSignatureTests extends RefactoringTest {
-	private static final Class clazz= ChangeSignatureTests.class;
-	private static final String REFACTORING_PATH= "ChangeSignature/";
-	
-	private static final boolean RUN_CONSTRUCTOR_TEST = true;
-
-	public ChangeSignatureTests(String name) {
-		super(name);
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return new MySetup(new TestSuite(clazz));
-		} else {
-			System.err.println("*** Running only parts of " + clazz.getName() + "!");
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ChangeSignatureTests("testAll58"));
-			return new MySetup(suite);
-		}
-	}
-	
-	public static Test setUpTest(Test someTest) {
-		return new MySetup(someTest);
-	}
-	
-	private String getSimpleTestFileName(boolean canReorder, boolean input){
-		String fileName = "A_" + getName();
-		if (canReorder)
-			fileName += input ? "_in": "_out";
-		return fileName + ".java"; 
-	}
-	
-	private String getTestFileName(boolean canReorder, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += (canReorder ? "canModify/": "cannotModify/");
-		return fileName + getSimpleTestFileName(canReorder, input);
-	}
-		
-	//---helpers 
-	
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canRename, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(canRename, input), getFileContents(getTestFileName(canRename, input)));
-	}
-
-	private static ParameterInfo[] createNewParamInfos(String[] newTypes, String[] newNames, String[] newDefaultValues) {
-		if (newTypes == null)
-			return new ParameterInfo[0];
-		ParameterInfo[] result= new ParameterInfo[newTypes.length];
-		for (int i= 0; i < newDefaultValues.length; i++) {
-			result[i]= ParameterInfo.createInfoForAddedParameter();
-			result[i].setNewName(newNames[i]);
-			result[i].setNewTypeName(newTypes[i]);
-			result[i].setDefaultValue(newDefaultValues[i]);
-		}
-		return result;
-	}
-
-	private static void addInfos(List list, ParameterInfo[] newParamInfos, int[] newIndices) {
-		if (newParamInfos == null || newIndices == null)
-			return;
-		for (int i= newIndices.length - 1; i >= 0; i--) {
-			list.add(newIndices[i], newParamInfos[i]);
-		}
-	}
-		
-	private void helperAdd(String[] signature, ParameterInfo[] newParamInfos, int[] newIndices) throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		IType classA= getType(cu, "A");
-		IMethod method = classA.getMethod("m", signature);
-		assertTrue("method does not exist", method.exists());
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(method, JavaPreferencesSettings.getCodeGenerationSettings());
-		addInfos(ref.getParameterInfos(), newParamInfos, newIndices);
-		RefactoringStatus result= performRefactoring(ref);
-		assertEquals("precondition was supposed to pass", null, result);
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		String expectedFileContents= getFileContents(getTestFileName(true, false));
-		assertEqualLines("invalid renaming", expectedFileContents, newcu.getSource());
-	}
-
-	private void helperDoAll(String typeName, 
-								String methodName, 
-							  	String[] signature, 
-							  	ParameterInfo[] newParamInfos, 
-							  	int[] newIndices, 
-							  	String[] oldParamNames, 
-							  	String[] newParamNames, 
-							  	String[] newParameterTypeNames, 
-							  	int[] permutation,
-							  	int newVisibility,
-							  	int[] deleted, String returnTypeName)  throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		IType classA= getType(cu, typeName);
-		IMethod method = classA.getMethod(methodName, signature);
-		assertTrue("method " + methodName +" does not exist", method.exists());
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(method, JavaPreferencesSettings.getCodeGenerationSettings());
-		if (returnTypeName != null)
-			ref.setNewReturnTypeName(returnTypeName);
-		markAsDeleted(ref.getParameterInfos(), deleted);	
-		modifyInfos(ref.getParameterInfos(), newParamInfos, newIndices, oldParamNames, newParamNames, newParameterTypeNames, permutation);
-		if (newVisibility != JdtFlags.VISIBILITY_CODE_INVALID)
-			ref.setVisibility(newVisibility);
-		RefactoringStatus result= performRefactoring(ref);
-		assertEquals("precondition was supposed to pass", null, result);
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		String expectedFileContents= getFileContents(getTestFileName(true, false));
-		assertEqualLines(expectedFileContents, newcu.getSource());
-	}
-	
-	private void markAsDeleted(List list, int[] deleted) {
-		if (deleted == null)
-			return;
-		for (int i= 0; i < deleted.length; i++) {
-			((ParameterInfo)list.get(i)).markAsDeleted();
-		}
-	}
-
-	private void helper1(String[] newOrder, String[] signature) throws Exception{
-		helper1(newOrder, signature, null, null);
-	}
-	
-	private void helper1(String[] newOrder, String[] signature, String[] oldNames, String[] newNames) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		IType classA= getType(cu, "A");
-		IMethod method = classA.getMethod("m", signature);
-		assertTrue("method does not exist", method.exists());
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(method, JavaPreferencesSettings.getCodeGenerationSettings());
-		modifyInfos(ref.getParameterInfos(), newOrder, oldNames, newNames);
-		RefactoringStatus result= performRefactoring(ref);
-		assertEquals("precondition was supposed to pass", null, result);
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		String expectedFileContents= getFileContents(getTestFileName(true, false));
-//		assertEquals("invalid renaming", expectedFileContents, newcu.getSource());
-		assertEqualLines(expectedFileContents, newcu.getSource());
-	}
-
-	private void modifyInfos(List infos, ParameterInfo[] newParamInfos, int[] newIndices, String[] oldParamNames, String[] newParamNames, String[] newParamTypeNames, int[] permutation) {
-		addInfos(infos, newParamInfos, newIndices);
-		List swapped= new ArrayList(infos.size());
-		List oldNameList= Arrays.asList(oldParamNames);
-		List newNameList= Arrays.asList(newParamNames);
-		for (int i= 0; i < permutation.length; i++) {
-			if (((ParameterInfo)infos.get(i)).isAdded())
-				continue;
-			if (! swapped.contains(new Integer(i))){
-				swapped.add(new Integer(permutation[i]));
-
-				ParameterInfo infoI= (ParameterInfo)infos.get(i);
-				infoI.setNewName((String)newNameList.get(oldNameList.indexOf(infoI.getOldName())));
-				if (newParamTypeNames != null)
-					infoI.setNewTypeName(newParamTypeNames[oldNameList.indexOf(infoI.getOldName())]);
-
-				ParameterInfo infoI1= (ParameterInfo)infos.get(permutation[i]);
-				infoI1.setNewName((String)newNameList.get(oldNameList.indexOf(infoI1.getOldName())));
-				if (newParamTypeNames != null)
-					infoI1.setNewTypeName(newParamTypeNames[oldNameList.indexOf(infoI1.getOldName())]);
-
-				swap(infos, i, permutation[i]);
-			}	
-		}
-	}
-
-	private static void modifyInfos(List infos, String[] newOrder, String[] oldNames, String[] newNames) {
-		int[] permutation= createPermutation(infos, newOrder);
-		List swapped= new ArrayList(infos.size());
-		if (oldNames == null || newNames == null){
-			ParameterInfo[] newInfos= new  ParameterInfo[infos.size()];
-			for (int i= 0; i < permutation.length; i++) {
-				newInfos[i]= (ParameterInfo)infos.get(permutation[i]);
-			}
-			infos.clear();
-			for (int i= 0; i < newInfos.length; i++) {
-				infos.add(newInfos[i]);
-			}
-			return;
-		} else {
-			List oldNameList= Arrays.asList(oldNames);
-			List newNameList= Arrays.asList(newNames);
-			for (int i= 0; i < permutation.length; i++) {
-				if (! swapped.contains(new Integer(i))){
-					swapped.add(new Integer(permutation[i]));
-					ParameterInfo infoI= (ParameterInfo)infos.get(i);
-					infoI.setNewName((String)newNameList.get(oldNameList.indexOf(infoI.getOldName())));
-					ParameterInfo infoI1= (ParameterInfo)infos.get(permutation[i]);
-					infoI1.setNewName((String)newNameList.get(oldNameList.indexOf(infoI1.getOldName())));
-					swap(infos, i, permutation[i]);
-				}				
-			}
-		}
-	}
-
-	private static void swap(List infos, int i, int i1) {
-		Object o= infos.get(i);
-		infos.set(i, infos.get(i1));
-		infos.set(i1, o);
-	}
-
-	private static int[] createPermutation(List infos, String[] newOrder) {
-		int[] result= new int[infos.size()];
-		for (int i= 0; i < result.length; i++) {
-			result[i]= indexOfOldName(infos, newOrder[i]);
-		}
-		return result;
-	}
-
-	private static int indexOfOldName(List infos, String string) {
-		for (Iterator iter= infos.iterator(); iter.hasNext();) {
-			ParameterInfo info= (ParameterInfo) iter.next();
-			if (info.getOldName().equals(string))
-				return infos.indexOf(info);
-		}
-		assertTrue(false);
-		return -1;
-	}
-
-	private void helperFail(String[] newOrder, String[] signature, int expectedSeverity) throws Exception{
-		IType classA= getType(createCUfromTestFile(getPackageP(), false, false), "A");
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(classA.getMethod("m", signature), JavaPreferencesSettings.getCodeGenerationSettings());
-		modifyInfos(ref.getParameterInfos(), newOrder, null, null);
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);		
-		assertEquals("Severity:", expectedSeverity, result.getSeverity());
-	}
-
-	private void helperAddFail(String[] signature, ParameterInfo[] newParamInfos, int[] newIndices, int expectedSeverity) throws Exception{
-		IType classA= getType(createCUfromTestFile(getPackageP(), false, false), "A");
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(classA.getMethod("m", signature), JavaPreferencesSettings.getCodeGenerationSettings());
-		addInfos(ref.getParameterInfos(), newParamInfos, newIndices);
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);		
-		assertEquals("Severity:" + result.getMessageMatchingSeverity(result.getSeverity()), expectedSeverity, result.getSeverity());
-	}
-	
-	private void helperDoAllFail(String methodName, 
-								String[] signature, 
-							  	ParameterInfo[] newParamInfos, 
-							  	int[] newIndices, 
-							  	String[] oldParamNames, 
-							  	String[] newParamNames, 
-							  	int[] permutation, 
-							  	int newVisibility,
-							  	int[] deleted,
-							  	int expectedSeverity)  throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, false);
-		IType classA= getType(cu, "A");
-		IMethod method = classA.getMethod(methodName, signature);
-		assertTrue("method does not exist", method.exists());
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(method, JavaPreferencesSettings.getCodeGenerationSettings());
-		markAsDeleted(ref.getParameterInfos(), deleted);	
-		modifyInfos(ref.getParameterInfos(), newParamInfos, newIndices, oldParamNames, newParamNames, null, permutation);
-		if (newVisibility != JdtFlags.VISIBILITY_CODE_INVALID)
-			ref.setVisibility(newVisibility);
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);	
-		assertEquals("Severity:" + result.getMessageMatchingSeverity(result.getSeverity()), expectedSeverity, result.getSeverity());		
-	}
-	
-	private void helperException(String[] signature, String[] removeExceptions, String[] addExceptions) throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		IType classA= getType(cu, "A");
-		IMethod method = classA.getMethod("m", signature);
-		assertTrue("method does not exist", method.exists());
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(method, JavaPreferencesSettings.getCodeGenerationSettings());
-	
-		// from RefactoringTest#performRefactoring():
-		RefactoringStatus status= ref.checkActivation(new NullProgressMonitor());
-		assertTrue("checkActivation was supposed to pass", status.isOK());
-	
-		mangleExceptions(ref.getExceptionInfos(), removeExceptions, addExceptions, method.getCompilationUnit());
-	
-		status= ref.checkInput(new NullProgressMonitor());
-		assertTrue("checkInput was supposed to pass", status.isOK());
-		IChange change= ref.createChange(new NullProgressMonitor());
-		performChange(change);
-		// XXX: this should be done by someone else
-		Refactoring.getUndoManager().addUndo(ref.getName(), change.getUndoChange());
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		String expectedFileContents= getFileContents(getTestFileName(true, false));
-		assertEqualLines("invalid renaming", expectedFileContents, newcu.getSource());
-	}
-	
-	
-	private void mangleExceptions(List list, String[] removeExceptions, String[] addExceptions, ICompilationUnit cu) throws Exception {
-		for (Iterator iter= list.iterator(); iter.hasNext(); ) {
-			ExceptionInfo info= (ExceptionInfo) iter.next();
-			String name= JavaModelUtil.getFullyQualifiedName(info.getType());
-			for (int i= 0; i < removeExceptions.length; i++) {
-				if (name.equals(removeExceptions[i]))
-					iter.remove();
-			}
-		}
-		for (int i= 0; i < addExceptions.length; i++) {
-//			IType type= JavaModelUtil.findTypeInCompilationUnit(cu, addExceptions[i]);
-			IType type= JavaModelUtil.findType(cu.getJavaProject(), addExceptions[i]);
-			list.add(ExceptionInfo.createInfoForAddedException(type));
-		}
-	}
-
-	//------- tests 
-	
-	public void testFail0() throws Exception{
-		helperFail(new String[]{"j", "i"}, new String[]{"I", "I"}, RefactoringStatus.ERROR);
-	}
-	
-	public void testFail1() throws Exception{
-		//TODO: is duplicate of testFail0()
-		helperFail(new String[]{"j", "i"}, new String[]{"I", "I"}, RefactoringStatus.ERROR);
-	}
-
-	public void testFailAdd2() throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-		helperAddFail(signature, newParamInfo, newIndices, RefactoringStatus.ERROR);
-	}
-
-	public void testFailAdd3() throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"not good"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-		helperAddFail(signature, newParamInfo, newIndices, RefactoringStatus.FATAL);
-	}
-
-	public void testFailAdd4() throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"not a type"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-		helperAddFail(signature, newParamInfo, newIndices, RefactoringStatus.FATAL);
-	}
-	
-	public void testFailDoAll5()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"i", "j"};
-		String[] newParamNames= {"i", "j"};
-		int[] permutation= {0};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		int expectedSeverity= RefactoringStatus.ERROR;
-		helperDoAllFail("m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, permutation, newVisibility, deletedIndices, expectedSeverity);
-	}	
-	
-	public void testFailDoAll6()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"a"};
-		String[] newTypes= {"Certificate"};
-		String[] newDefaultValues= {"null"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-		
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		int expectedSeverity= RefactoringStatus.ERROR;
-		helperDoAllFail("m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, permutation, newVisibility, deletedIndices, expectedSeverity);
-	}	
-
-	public void testFailDoAll7()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"a"};
-		String[] newTypes= {"Fred"};
-		String[] newDefaultValues= {"null"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-		
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		int expectedSeverity= RefactoringStatus.ERROR;
-		helperDoAllFail("m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, permutation, newVisibility, deletedIndices, expectedSeverity);
-	}	
-	
-	//---------
-	public void test0() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}
-	
-	public void test1() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}
-	
-	public void test2() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}
-	
-	public void test3() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}
-	
-	public void test4() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}
-	
-	public void test5() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}
-	
-	public void test6() throws Exception{
-		helper1(new String[]{"k", "i", "j"}, new String[]{"I", "I", "I"});
-	}
-
-	public void test7() throws Exception{
-		helper1(new String[]{"i", "k", "j"}, new String[]{"I", "I", "I"});
-	}
-
-	public void test8() throws Exception{
-		helper1(new String[]{"k", "j", "i"}, new String[]{"I", "I", "I"});
-	}
-	
-	public void test9() throws Exception{
-		helper1(new String[]{"j", "i", "k"}, new String[]{"I", "I", "I"});
-	}
-
-	public void test10() throws Exception{
-		helper1(new String[]{"j", "k", "i"}, new String[]{"I", "I", "I"});
-	}
-
-	public void test11() throws Exception{
-		helper1(new String[]{"j", "k", "i"}, new String[]{"I", "I", "I"});
-	}
-
-	public void test12() throws Exception{
-		helper1(new String[]{"j", "k", "i"}, new String[]{"I", "I", "I"});
-	}
-
-	public void test13() throws Exception{
-		helper1(new String[]{"j", "k", "i"}, new String[]{"I", "I", "I"});
-	}
-	
-	public void test14() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}
-	
-	public void test15() throws Exception{
-		helper1(new String[]{"b", "i"}, new String[]{"I", "Z"});
-	}
-	
-	public void test16() throws Exception{
-		helper1(new String[]{"b", "i"}, new String[]{"I", "Z"});
-	}
-	
-	public void test17() throws Exception{
-		//exception because of bug 11151
-		helper1(new String[]{"b", "i"}, new String[]{"I", "Z"});
-	}
-	
-	public void test18() throws Exception{
-		//exception because of bug 11151
-		helper1(new String[]{"b", "i"}, new String[]{"I", "Z"});
-	}
-	
-	public void test19() throws Exception{
-//		printTestDisabledMessage("bug 7274 - reorder parameters: incorrect when parameters have more than 1 modifiers");
-		helper1(new String[]{"b", "i"}, new String[]{"I", "Z"});
-	}
-	public void test20() throws Exception{
-//		printTestDisabledMessage("bug 18147");
-		helper1(new String[]{"b", "a"}, new String[]{"I", "[I"});
-	}
-
-//constructor tests
-	public void test21() throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-		String[] signature= {"I", "I"};
-		ParameterInfo[] newParamInfo= null;
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"a", "b"};
-		String[] newParamNames= {"a", "b"};
-		int[] permutation= {1, 0};
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		int[] deleted= null;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deleted, newReturnTypeName);
-	}
-	public void test22() throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-		String[] signature= {"I", "I"};
-		ParameterInfo[] newParamInfo= null;
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"a", "b"};
-		String[] newParamNames= {"a", "b"};
-		int[] permutation= {1, 0};
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		int[] deleted= null;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deleted, newReturnTypeName);
-	}
-	public void test23() throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-		String[] signature= {"I", "I"};
-		ParameterInfo[] newParamInfo= null;
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"a", "b"};
-		String[] newParamNames= {"a", "b"};
-		int[] permutation= {1, 0};
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		int[] deleted= null;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deleted, newReturnTypeName);
-	}
-	public void test24() throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-//		if (true){
-//			printTestDisabledMessage("Bug 24230");
-//			return;
-//		}	
-		String[] signature= {"I", "I"};
-		ParameterInfo[] newParamInfo= null;
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"a", "b"};
-		String[] newParamNames= {"a", "b"};
-		int[] permutation= {1, 0};
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		int[] deleted= null;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deleted, newReturnTypeName);
-	}
-	public void test25() throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-		String[] signature= {"I", "I"};
-		ParameterInfo[] newParamInfo= null;
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"a", "b"};
-		String[] newParamNames= {"a", "b"};
-		int[] permutation= {1, 0};
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		int[] deleted= null;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deleted, newReturnTypeName);
-	}
-	public void test26() throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-		String[] signature= {"I", "I"};
-		ParameterInfo[] newParamInfo= null;
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"a", "b"};
-		String[] newParamNames= {"a", "b"};
-		int[] permutation= {1, 0};
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		int[] deleted= null;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deleted, newReturnTypeName);
-	}
-
-	public void testRenameReorder26() throws Exception{
-		helper1(new String[]{"a", "y"}, new String[]{"Z", "I"}, new String[]{"y", "a"}, new String[]{"zzz", "bb"});
-	}
-	
-	public void testRenameReorder27() throws Exception{
-		helper1(new String[]{"a", "y"}, new String[]{"Z", "I"}, new String[]{"y", "a"}, new String[]{"yyy", "a"});
-	}
-
-	public void testAdd28()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {1};
-		helperAdd(signature, newParamInfo, newIndices);
-	}
-
-	public void testAdd29()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-		helperAdd(signature, newParamInfo, newIndices);
-	}
-
-	public void testAdd30()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {1};
-		helperAdd(signature, newParamInfo, newIndices);
-	}
-	
-	public void testAdd31()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {1};
-		helperAdd(signature, newParamInfo, newIndices);
-	}
-
-	public void testAdd32()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-		helperAdd(signature, newParamInfo, newIndices);
-	}
-
-	public void testAdd33()throws Exception{
-		String[] signature= {};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-		helperAdd(signature, newParamInfo, newIndices);
-	}
-
-	public void testAddReorderRename34()throws Exception{
-		String[] signature= {"I", "Z"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"Object"};
-		String[] newDefaultValues= {"null"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {1};
-		
-		String[] oldParamNames= {"iii", "j"};
-		String[] newParamNames= {"i", "jj"};
-		int[] permutation= {2, -1, 0};
-		int[] deletedIndices= null;
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll35()throws Exception{
-		String[] signature= {"I", "Z"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"iii", "j"};
-		String[] newParamNames= oldParamNames;
-		int[] permutation= {0, 1};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.PUBLIC;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll36()throws Exception{
-		String[] signature= {"I", "Z"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"iii", "j"};
-		String[] newParamNames= oldParamNames;
-		int[] permutation= {0, 1};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.PRIVATE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll37()throws Exception{
-		String[] signature= {"I", "Z"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"iii", "j"};
-		String[] newParamNames= oldParamNames;
-		int[] permutation= {0, 1};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.PROTECTED;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll38()throws Exception{
-		String[] signature= {"I", "Z"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"iii", "j"};
-		String[] newParamNames= oldParamNames;
-		int[] permutation= {0, 1};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.PROTECTED;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll39()throws Exception{
-		String[] signature= {"I", "Z"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"Object"};
-		String[] newDefaultValues= {"null"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {1};
-		
-		String[] oldParamNames= {"iii", "j"};
-		String[] newParamNames= {"i", "jj"};
-		int[] permutation= {2, -1, 0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.PUBLIC;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll40()throws Exception{
-		String[] signature= {"I", "Z"};
-		String[] newNames= {"x"};
-		String[] newTypes= {"int[]"};
-		String[] newDefaultValues= {"null"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {1};
-		
-		String[] oldParamNames= {"iii", "j"};
-		String[] newParamNames= {"i", "jj"};
-		int[] permutation= {2, -1, 0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.PUBLIC;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll41()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"i"};
-		String[] newParamNames= {"i"};
-		int[] permutation= {0};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll42()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"i"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"0"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {1};
-		
-		String[] oldParamNames= {"i"};
-		String[] newParamNames= {"i"};
-		int[] permutation= {0, -1};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll43()throws Exception{
-		String[] signature= {"I", "I"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"i", "j"};
-		String[] newParamNames= {"i", "j"};
-		int[] permutation= {1, 0};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll44()throws Exception{
-		if (true){
-			printTestDisabledMessage("need to decide how to treat compile errors");
-			return;
-		}
-		String[] signature= {"I", "I"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"i", "j"};
-		String[] newParamNames= {"i", "j"};
-		int[] permutation= {0, 1};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= "boolean";
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-
-	public void testAll45()throws Exception{
-		if (true){
-			printTestDisabledMessage("need to decide how to treat compile errors");
-			return;
-		}
-		
-		String[] signature= {"I", "I"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"i", "j"};
-		String[] newParamNames= {"i", "j"};
-		String[] newParamTypeNames= {"int", "boolean"};
-		int[] permutation= {0, 1};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, newParamTypeNames, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}	
-	
-	public void testAll46()throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-
-		String[] signature= {};
-		String[] newNames= {"i"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"1"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll47()throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-
-		String[] signature= {};
-		String[] newNames= {"i"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"1"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll48()throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-
-		String[] signature= {};
-		String[] newNames= {"i"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"1"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll49()throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-
-		String[] signature= {};
-		String[] newNames= {"i"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"1"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll50()throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-
-		String[] signature= {};
-		String[] newNames= {"i"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"1"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll51()throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-
-		String[] signature= {};
-		String[] newNames= {"i"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"1"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll52()throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-
-		String[] signature= {};
-		String[] newNames= {"i"};
-		String[] newTypes= {"int"};
-		String[] newDefaultValues= {"1"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= null;
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "A", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll53()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"a"};
-		String[] newTypes= {"HashSet"};
-		String[] newDefaultValues= {"null"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll54()throws Exception{
-		String[] signature= {"I"};
-		String[] newNames= {"a"};
-		String[] newTypes= {"List"};
-		String[] newDefaultValues= {"null"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {0};
-
-		String[] oldParamNames= {};
-		String[] newParamNames= {};
-		int[] permutation= {0};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.NONE;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll55()throws Exception{
-//		printTestDisabledMessage("test for bug 32654 [Refactoring] Change method signature with problems");
-		String[] signature= {"[QObject;", "I", "Z"};
-		String[] newNames= {"e"};
-		String[] newTypes= {"boolean"};
-		String[] newDefaultValues= {"true"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {2};
-		helperAdd(signature, newParamInfo, newIndices);
-
-	}
-
-	public void testAll56()throws Exception{
-		if (! RUN_CONSTRUCTOR_TEST){
-			printTestDisabledMessage("disabled for constructors for now");
-			return;
-		}
-			
-//		printTestDisabledMessage("test for 38366 ArrayIndexOutOfBoundsException in change signeture [refactoring] ");
-		String[] signature= {"QEvaViewPart;", "I"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {};
-
-		String[] oldParamNames= {"part", "title"};
-		String[] newParamNames= {"part", "title"};
-		int[] permutation= {0, 1};
-		int[] deletedIndices= {0};
-		int newVisibility= Modifier.PUBLIC;
-		String newReturnTypeName= null;
-		helperDoAll("HistoryFrame", "HistoryFrame", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll57()throws Exception{
-//		printTestDisabledMessage("test for 39633 classcast exception when refactoring change method signature [refactoring]");
-//		if (true)
-//			return;
-		String[] signature= {"I", "QString;", "QString;"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-
-		String[] oldParamNames= {"i", "hello", "goodbye"};
-		String[] newParamNames= oldParamNames;
-		int[] permutation= {0, 2, 1};
-		int[] deletedIndices= {};
-		int newVisibility= Modifier.PUBLIC;
-		String newReturnTypeName= null;
-		helperDoAll("TEST.X", "method", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAll58()throws Exception{
-		String[] signature= {"I", "[[[QString;"};
-		String[] newNames= null;
-		String[] newTypes= null;
-		String[] newDefaultValues= null;
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= null;
-
-		String[] oldParamNames= {"a", "b"};
-		String[] newParamNames= {"abb", "bbb"};
-		int[] permutation= {1, 0};
-		int[] deletedIndices= {};
-		int newVisibility= Modifier.PUBLIC;
-		String newReturnTypeName= null;
-		helperDoAll("A", "m", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deletedIndices, newReturnTypeName);
-	}
-
-	public void testAddRecursive1()throws Exception{ //bug 42100
-		String[] signature= {"I"};
-		String[] newNames= {"bool"};
-		String[] newTypes= {"boolean"};
-		String[] newDefaultValues= {"true"};
-		ParameterInfo[] newParamInfo= createNewParamInfos(newTypes, newNames, newDefaultValues);
-		int[] newIndices= {1};
-		helperAdd(signature, newParamInfo, newIndices);
-	}
-	
-	public void testException01() throws Exception {
-		String[] signature= {"J"};
-		String[] remove= {};
-		String[] add= {"java.util.zip.ZipException"};
-		helperException(signature, remove, add);
-	}
-	
-	public void testInStatic01() throws Exception { //bug 47062
-		String[] signature= {"QString;", "QString;"};
-		ParameterInfo[] newParamInfo= null;
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"arg1", "arg2"};
-		String[] newParamNames= {"a", "b"};
-		int[] permutation= {1, 0};
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		int[] deleted= null;
-		String newReturnTypeName= null;
-		helperDoAll("Example", "Example", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deleted, newReturnTypeName);
-	}
-
-	public void testInStatic02() throws Exception { //bug 47062
-		String[] signature= {"QString;", "QString;"};
-		ParameterInfo[] newParamInfo= null;
-		int[] newIndices= null;
-		
-		String[] oldParamNames= {"arg1", "arg2"};
-		String[] newParamNames= {"a", "b"};
-		int[] permutation= {1, 0};
-		int newVisibility= JdtFlags.VISIBILITY_CODE_INVALID;//retain
-		int[] deleted= null;
-		String newReturnTypeName= null;
-		helperDoAll("Example", "getExample", signature, newParamInfo, newIndices, oldParamNames, newParamNames, null, permutation, newVisibility, deleted, newReturnTypeName);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeTypeRefactoringTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeTypeRefactoringTests.java
deleted file mode 100644
index 91abec3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeTypeRefactoringTests.java
+++ /dev/null
@@ -1,360 +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.jdt.ui.tests.refactoring;
-
-import java.util.Collection;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeTypeRefactoring;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-/**
- * @author rfuhrer, tip
- *
- */
-public class ChangeTypeRefactoringTests extends RefactoringTest {
-	private static final Class clazz= ChangeTypeRefactoringTests.class;
-	private static final String REFACTORING_PATH= "ChangeTypeRefactoring/";
-
-	public ChangeTypeRefactoringTests(String name) {
-		super(name);
-	} 
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	private String getSimpleTestFileName(boolean input) {
-		String fileName= "A_" + getName() + (input ? "_in" : "_out") + ".java";
-
-		return fileName;
-	}
-	
-	private String getTestFileName(boolean positive, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-
-		fileName += (positive ? "positive/": "negative/");
-		fileName += getSimpleTestFileName(input);
-		return fileName;
-	}
-	
-	private ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean positive, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(input), getFileContents(getTestFileName(positive, input)));
-	}
-	
-	private ICompilationUnit createAdditionalCU(String fileName, IPackageFragment pack) throws Exception {
-		String fullName= TEST_PATH_PREFIX + getRefactoringPath() + "positive/" + fileName + ".java";
-		return createCU(pack, fileName + ".java", getFileContents(fullName));
-	}
-
-	ChangeTypeRefactoring helper1(int startLine, int startColumn, int endLine, int endColumn, String selectedTypeName)
-		throws Exception {
-		ICompilationUnit	cu= createCUfromTestFile(getPackageP(), true, true);
-		ISourceRange		selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ChangeTypeRefactoring		ref= ChangeTypeRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-												   selectedTypeName);
-	
-		// TODO Set parameters on your refactoring instance from arguments...
-	
-		RefactoringStatus	activationResult= ref.checkActivation(new NullProgressMonitor());	
-	
-		assertTrue("activation was supposed to be successful:" + activationResult.toString(), activationResult.isOK());																
-	
-		RefactoringStatus	checkInputResult= ref.checkInput(new NullProgressMonitor());
-	
-		assertTrue("precondition was supposed to pass but was " + checkInputResult.toString(), checkInputResult.isOK());
-	
-		performChange(ref.createChange(new NullProgressMonitor()));	
-		
-		String newSource= cu.getSource();
-	
-		assertEqualLines(getName() + ": ", newSource, getFileContents(getTestFileName(true, false)));
-	
-		
-		return ref;
-	}
-
-	private void failHelper1(int startLine, int startColumn, int endLine, int endColumn,
-							 int expectedStatus, String selectedType) throws Exception {
-		ICompilationUnit	cu= createCUfromTestFile(getPackageP(), false, true);
-		ISourceRange		selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ChangeTypeRefactoring	ref= ChangeTypeRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-												   selectedType);
-		RefactoringStatus	result= performRefactoring(ref);
-
-		assertNotNull("precondition was supposed to fail", result);
-		assertEquals("status", expectedStatus, result.getSeverity());
-
-		String	canonAfterSrcName= getTestFileName(false, false);
-
-		assertEqualLines(cu.getSource(), getFileContents(canonAfterSrcName));
-	}	
-
-	//--- TESTS
-	public void testLocalVarName() throws Exception {
-		System.out.println("running testLocalVarName()");
-		Collection types= helper1(5, 19, 5, 24, "java.util.Map").getValidTypeNames();
-		Assert.assertTrue(types.size() == 1);
-		Assert.assertTrue(types.contains("java.util.Map"));
-	}
-	public void testLocalVarType() throws Exception {
-		System.out.println("running testLocalVarType()");
-		Collection types= helper1(5, 9, 5, 18, "java.util.Map").getValidTypeNames();
-		Assert.assertTrue(types.size() == 1);
-		Assert.assertTrue(types.contains("java.util.Map"));		
-	}
-	public void testLocalVarDecl() throws Exception {
-		System.out.println("running testLocalVarDecl()");
-		Collection types= helper1(8, 9, 8, 23, "java.util.Map").getValidTypeNames();
-		Assert.assertTrue(types.size() == 1);
-		Assert.assertTrue(types.contains("java.util.Map")); 		
-	}
-	public void testLocalSuperTypesOfArrayList() throws Exception {
-		System.out.println("running testLocalSuperTypesOfArrayList()");
-		Collection types= helper1(5, 19, 5, 23, "java.util.List").getValidTypeNames();
-		Assert.assertTrue(types.size() == 7);
-		Assert.assertTrue(types.contains("java.lang.Object"));
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.AbstractCollection"));
-		Assert.assertTrue(types.contains("java.util.List"));
-		Assert.assertTrue(types.contains("java.util.Collection"));
-		Assert.assertTrue(types.contains("java.io.Serializable"));
-		Assert.assertTrue(types.contains("java.lang.Cloneable"));		
-	}
-	public void testParameterName() throws Exception {
-		System.out.println("running testParameterName()");
-		Collection types= helper1(4, 31, 4, 36, "java.util.Map").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.Map"));
-		Assert.assertTrue(types.contains("java.util.Dictionary"));		
-	}
-	public void testParameterType() throws Exception {
-		System.out.println("running testParameterType()");
-		Collection types= helper1(4, 21, 4, 29, "java.util.Dictionary").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.Map"));
-		Assert.assertTrue(types.contains("java.util.Dictionary"));				
-	}
-	public void testParameterDecl() throws Exception {
-		System.out.println("running testParameterDecl()");
-		Collection types= helper1(4, 21, 4, 36, "java.util.Map").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.Map"));
-		Assert.assertTrue(types.contains("java.util.Dictionary"));				
-	}
-	public void testFieldName() throws Exception {
-		System.out.println("running testFieldName()");
-		Collection types= helper1(10, 29, 10, 33, "java.util.AbstractList").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.List"));
-	}
-	public void testFieldType() throws Exception {
-		System.out.println("running testFieldType()");
-		Collection types= helper1(10, 19, 10, 27, "java.util.AbstractList").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.List"));
-	}
-	public void testFieldDecl() throws Exception {
-		System.out.println("running testFieldDecl()");
-		Collection types= helper1(10, 19, 10, 32, "java.util.AbstractList").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.List"));
-	}
-	public void testFieldUseSubtypesOfList() throws Exception {
-		System.out.println("running testFieldUseSubtypesOfList()");
-		Collection types= helper1(5, 22, 5, 26, "java.util.List").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.List"));
-	}
-	public void testFieldDeclSubtypesOfList() throws Exception {
-		System.out.println("running testFieldDeclSubtypesOfList()");
-		Collection types= helper1(8, 12, 8, 25, "java.util.List").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.List"));		
-	}
-	public void testLocalVarUse() throws Exception {
-		System.out.println("running testLocalVarUse()");
-		Collection types= helper1(6, 22, 6, 26, "java.util.AbstractList").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.List"));
-	}
-	public void testReturnTypeWithCall() throws Exception {
-		System.out.println("running testReturnTypeWithCall()");
-		Collection types= helper1(4, 12, 4, 20, "java.util.AbstractList").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.List"));		
-	}
-	public void testParameterNameWithOverride() throws Exception {
-		System.out.println("running testParameterNameWithOverride()");
-		Collection types= helper1(5, 38, 5, 40, "java.util.Collection").getValidTypeNames();
-		Assert.assertTrue(types.size() == 3);
-		Assert.assertTrue(types.contains("java.util.AbstractCollection"));
-//		Assert.assertTrue(types.contains("java.util.ArrayList"));
-		Assert.assertTrue(types.contains("java.util.List"));
-		Assert.assertTrue(types.contains("java.util.Collection"));		
-	}
-	public void testParameterTypeWithOverride() throws Exception {
-		System.out.println("running testParameterTypeWithOverride()");
-		Collection types= helper1(10, 25, 10, 36, "java.util.List").getValidTypeNames();
-		Assert.assertTrue(types.size() == 3);
-		Assert.assertTrue(types.contains("java.util.AbstractCollection"));
-//		Assert.assertTrue(types.contains("java.util.ArrayList"));
-		Assert.assertTrue(types.contains("java.util.List"));
-		Assert.assertTrue(types.contains("java.util.Collection"));		
-	}
-	public void testParameterDeclWithOverride() throws Exception {
-		System.out.println("running testParameterDeclWithOverride()");
-		Collection types= helper1(10, 25, 10, 39, "java.util.ArrayList").getValidTypeNames();
-		Assert.assertTrue(types.size() == 3);
-		Assert.assertTrue(types.contains("java.util.AbstractCollection"));
-//		Assert.assertTrue(types.contains("java.util.ArrayList"));
-		Assert.assertTrue(types.contains("java.util.List"));
-		Assert.assertTrue(types.contains("java.util.Collection"));		
-	}
-	public void testLocalVarCast() throws Exception {
-		System.out.println("running testLocalVarCast()");
-		Collection types= helper1(7, 24, 7, 24, "java.util.List").getValidTypeNames();
-		Assert.assertTrue(types.size() == 7);
-		Assert.assertTrue(types.contains("java.io.Serializable"));
-		Assert.assertTrue(types.contains("java.util.Collection"));		
-		Assert.assertTrue(types.contains("java.util.List"));
-		Assert.assertTrue(types.contains("java.util.AbstractList"));		
-		Assert.assertTrue(types.contains("java.lang.Object"));
-		Assert.assertTrue(types.contains("java.lang.Cloneable"));
-		Assert.assertTrue(types.contains("java.util.AbstractCollection"));		
-	}
-	public void testReturnType() throws Exception {
-		System.out.println("running testReturnType()");
-		createAdditionalCU("A_testReturnType2", getPackageP());
-		Collection types= helper1(6, 12, 6, 15, "java.util.Collection").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.Collection"));
-		Assert.assertTrue(types.contains("java.lang.Object"));
-	}	
-	public void testFieldWithAccess() throws Exception {
-		System.out.println("running testFieldWithAccess()");
-		createAdditionalCU("A_testFieldWithAccess2", getPackageP());
-		Collection types= helper1(6, 12, 6, 21, "java.util.Collection").getValidTypeNames();
-		Assert.assertTrue(types.size() == 1);
-		Assert.assertTrue(types.contains("java.util.Collection"));
-	}	
-	public void testParameterTypeWithOverriding() throws Exception {
-		System.out.println("running testParameterTypeWithOverriding()");
-		createAdditionalCU("A_testParameterTypeWithOverriding2", getPackageP());
-		Collection types= helper1(6, 21, 6, 24, "java.util.Collection").getValidTypeNames();
-		Assert.assertTrue(types.size() == 1);
-		Assert.assertTrue(types.contains("java.util.Collection"));
-	}
-	public void testMultiCU() throws Exception {
-		System.out.println("running testMultiCU()");
-		createAdditionalCU("A_testMultiCUInterface1", getPackageP());
-		createAdditionalCU("A_testMultiCUInterface2", getPackageP());
-		createAdditionalCU("A_testMultiCUClass1", getPackageP());
-		createAdditionalCU("A_testMultiCUClass2", getPackageP());
-		Collection types= helper1(6, 21, 6, 26, "java.util.Collection").getValidTypeNames();
-		Assert.assertTrue(types.size() == 1);
-		Assert.assertTrue(types.contains("java.util.Collection"));
-	}
-	public void testHashMap() throws Exception {
-		System.out.println("running testHashMap()");
-		Collection types= helper1(15, 17, 15, 19, "java.util.AbstractMap").getValidTypeNames();
-		Assert.assertTrue(types.size() == 2);
-		Assert.assertTrue(types.contains("java.util.AbstractMap"));
-		Assert.assertTrue(types.contains("java.util.Map"));
-	}
-	public void testString() throws Exception {
-		System.out.println("running testString()");
-		Collection types= helper1(4, 9, 4, 14, "java.lang.Object").getValidTypeNames();
-		Assert.assertTrue(types.size() == 3);
-		Assert.assertTrue(types.contains("java.lang.Object"));
-//		Assert.assertTrue(types.contains("java.lang.CharSequence")); // not in rtstubs.jar
-		Assert.assertTrue(types.contains("java.lang.Comparable"));
-		Assert.assertTrue(types.contains("java.io.Serializable"));	
-	}
-	public void testInterfaceTypes() throws Exception {
-		System.out.println("running testInterfaceTypes()");
-		Collection types= helper1(4, 11, 4, 11, "p.I").getValidTypeNames();
-		Assert.assertTrue(types.size() == 3);
-		Assert.assertTrue(types.contains("java.lang.Object"));
-		Assert.assertTrue(types.contains("p.I"));
-		Assert.assertTrue(types.contains("p.A"));
-	}
-	public void testImport() throws Exception {
-		System.out.println("running testInterfaceTypes()");
-		Collection types= helper1(11, 9, 11, 17, "java.util.List").getValidTypeNames();
-		Assert.assertTrue(types.size() == 7);
-		Assert.assertTrue(types.contains("java.io.Serializable"));
-		Assert.assertTrue(types.contains("java.lang.Cloneable"));
-		Assert.assertTrue(types.contains("java.lang.Object"));
-		Assert.assertTrue(types.contains("java.util.List"));
-		Assert.assertTrue(types.contains("java.util.AbstractList"));
-		Assert.assertTrue(types.contains("java.util.Collection"));
-		Assert.assertTrue(types.contains("java.util.AbstractCollection"));
-	}
-	
-	
-	// tests that are supposed to fail
-	
-	public void testInvalidSelection() throws Exception {
-		System.out.println("running testInvalidSelection()");
-		failHelper1(5, 23, 5, 37, 4, "java.lang.Object");
-	}
-	public void testBogusSelection() throws Exception {
-		System.out.println("running testBogusSelection()");
-		failHelper1(6, 23, 6, 35, 4, "java.lang.Object");
-	}
-	public void testMultiDeclaration() throws Exception {
-		System.out.println("running testMultiDeclaration()");
-		failHelper1(8, 22, 8, 26, 4, "java.util.List");		
-	}
-	public void testUpdateNotPossible() throws Exception {
-		System.out.println("running testUpdateNotPossible()");
-		failHelper1(5, 19, 5, 20, 4, "java.util.Hashtable");
-	}
-	public void testArray() throws Exception {
-		System.out.println("running testArray()");
-		failHelper1(5, 18, 5, 19, 4, "java.util.Object[]");
-	}
-	public void testPrimitive() throws Exception {
-		System.out.println("running testPrimitive()");
-		failHelper1(5, 13, 5, 13, 4, "java.util.Object");
-	}
-	public void testOverriddenBinaryMethod() throws Exception {
-		System.out.println("running testOverriddenBinaryMethod()");
-		failHelper1(3, 12, 3, 17, 4, "java.lang.Object");
-	}
-	public void testFieldOfLocalType() throws Exception {
-		System.out.println("running testFieldOfLocalType()");
-		failHelper1(5, 21, 5, 45, 4, "java.lang.Object");
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ConvertAnonymousToNestedTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ConvertAnonymousToNestedTests.java
deleted file mode 100644
index 83d9f0c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ConvertAnonymousToNestedTests.java
+++ /dev/null
@@ -1,296 +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
- *     N.Metchev@teamphone.com - contributed fixes for
- *     - convert anonymous to nested should sometimes declare class as static [refactoring] 
- *       (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=43360)
- *******************************************************************************/
-package org.eclipse.jdt.ui.tests.refactoring;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.Modifier;
-import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.code.ConvertAnonymousToNestedRefactoring;
-
-public class ConvertAnonymousToNestedTests extends RefactoringTest {
-
-	private static final Class clazz= ConvertAnonymousToNestedTests.class;
-	private static final String REFACTORING_PATH= "ConvertAnonymousToNested/";
-
-	private Object fCompactPref; 
-		
-	public ConvertAnonymousToNestedTests(String name) {
-		super(name);
-	} 
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	public static Test setUpTest(Test someTest) {
-	    return new MySetup(someTest);
-	}
-	
-	private String getSimpleTestFileName(boolean canInline, boolean input){
-		String fileName = "A_" + getName();
-		if (canInline)
-			fileName += input ? "_in": "_out";
-		return fileName + ".java"; 
-	}
-	
-	private String getTestFileName(boolean canConvert, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += (canConvert ? "canConvert/": "cannotConvert/");
-		return fileName + getSimpleTestFileName(canConvert, input);
-	}
-	
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canConvert, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(canConvert, input), getFileContents(getTestFileName(canConvert, input)));
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		Hashtable options= JavaCore.getOptions();
-		
-		String setting= DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR;
-		fCompactPref= options.get(setting);
-		options.put(setting, DefaultCodeFormatterConstants.TRUE);
-		JavaCore.setOptions(options);
-	}
-	
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		Hashtable options= JavaCore.getOptions();
-		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR, fCompactPref);
-		JavaCore.setOptions(options);	
-	}
-
-	private void helper1(int startLine, int startColumn, int endLine, int endColumn, boolean makeFinal, String className, int visibility) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ConvertAnonymousToNestedRefactoring ref= ConvertAnonymousToNestedRefactoring.create(cu, selection.getOffset(), selection.getLength());
-
-		RefactoringStatus preconditionResult= ref.checkActivation(new NullProgressMonitor());	
-		if (preconditionResult.isOK())
-			preconditionResult= null;
-		assertEquals("activation was supposed to be successful", null, preconditionResult);
-
-		ref.setClassName(className);
-		ref.setDeclareFinal(makeFinal);
-		ref.setVisibility(visibility);
-		
-		if (preconditionResult == null)
-			preconditionResult= ref.checkInput(new NullProgressMonitor());
-		else	
-			preconditionResult.merge(ref.checkInput(new NullProgressMonitor()));
-		if (preconditionResult.isOK())
-			preconditionResult= null;
-		assertEquals("precondition was supposed to pass", null, preconditionResult);
-		
-		performChange(ref.createChange(new NullProgressMonitor()));
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		assertEqualLines(getFileContents(getTestFileName(true, false)), newcu.getSource());
-	}
-	
-	private void failHelper1(int startLine, int startColumn, int endLine, int endColumn, boolean makeFinal, String className, int visibility, int expectedSeverity) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ConvertAnonymousToNestedRefactoring ref= ConvertAnonymousToNestedRefactoring.create(cu, selection.getOffset(), selection.getLength());
-
-		RefactoringStatus preconditionResult= ref.checkActivation(new NullProgressMonitor());	
-		if (preconditionResult.isOK())
-			preconditionResult= null;
-		assertEquals("activation was supposed to be successful", null, preconditionResult);
-
-		ref.setClassName(className);
-		ref.setDeclareFinal(makeFinal);
-		ref.setVisibility(visibility);
-		
-		if (preconditionResult == null)
-			preconditionResult= ref.checkInput(new NullProgressMonitor());
-		else	
-			preconditionResult.merge(ref.checkInput(new NullProgressMonitor()));
-		if (preconditionResult.isOK())
-			preconditionResult= null;
-		assertNotNull("precondition was supposed to fail",preconditionResult);
-
-		assertEquals("incorrect severity:", expectedSeverity, preconditionResult.getSeverity());
-	}	
-
-	private void failActivationHelper(int startLine, int startColumn, int endLine, int endColumn, boolean makeFinal, String className, int visibility, int expectedSeverity) throws Exception{
-	    ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);
-	    ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-	    ConvertAnonymousToNestedRefactoring ref= ConvertAnonymousToNestedRefactoring.create(cu, selection.getOffset(), selection.getLength());
-
-	    RefactoringStatus preconditionResult= ref.checkActivation(new NullProgressMonitor());	
-	    assertEquals("activation was supposed to fail", expectedSeverity, preconditionResult.getSeverity());
-	}	
-
-	//--- TESTS
-
-	public void testFail0() throws Exception{
-		printTestDisabledMessage("corner case - local types");
-//		failHelper1(6, 14, 6, 16, true, "Inner", Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-
-	public void testFail1() throws Exception{
-		failHelper1(5, 17, 5, 17, true, "Inner", Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-
-	public void testFail2() throws Exception{
-		failHelper1(5, 17, 5, 18, true, "Inner", Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-	
-	public void testFail3() throws Exception{
-	    failActivationHelper(10, 27, 10, 27, true, "Inner", Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-	
-	public void testFail4() throws Exception{
-	    failHelper1(8, 31, 8, 31, true, "Inner", Modifier.PRIVATE, RefactoringStatus.ERROR);
-	}
-	
-	public void test0() throws Exception{
-		helper1(5, 17, 5, 17, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test1() throws Exception{
-		helper1(5, 17, 5, 17, true, "Inner", Modifier.PUBLIC);
-	}
-
-	public void test2() throws Exception{
-		helper1(5, 17, 5, 17, true, "Inner", Modifier.PUBLIC);
-	}
-
-	public void test3() throws Exception{
-		helper1(5, 17, 5, 17, false, "Inner", Modifier.PUBLIC);
-	}
-
-	public void test4() throws Exception{
-		helper1(7, 17, 7, 17, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test5() throws Exception{
-		helper1(7, 17, 7, 19, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test6() throws Exception{
-		helper1(8, 13, 9, 14, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test7() throws Exception{
-		helper1(7, 18, 7, 18, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test8() throws Exception{
-		helper1(8, 14, 8, 15, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test9() throws Exception{
-		helper1(8, 13, 8, 14, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test10() throws Exception{
-		helper1(7, 15, 7, 16, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test11() throws Exception{
-		helper1(5, 15, 5, 17, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test12() throws Exception{
-		helper1(8, 9, 10, 10, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test13() throws Exception{
-		helper1(6, 28, 6, 28, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test14() throws Exception{
-		helper1(5, 13, 5, 23, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test15() throws Exception{
-		helper1(7, 26, 7, 26, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test16() throws Exception{
-		helper1(4, 10, 4, 26, true, "Inner", Modifier.PRIVATE);
-	}
-	
-	public void test17() throws Exception{
-		helper1(6, 16, 6, 19, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test18() throws Exception{
-		helper1(5, 15, 5, 17, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test19() throws Exception{
-		helper1(5, 12, 6, 21, true, "Inner", Modifier.PRIVATE);
-	}
-
-	public void test20() throws Exception{
-		helper1(4, 25, 4, 25, true, "Inner", Modifier.PRIVATE);
-	}
-
-    public void test21() throws Exception{
-        helper1(4, 25, 4, 25, true, "Inner", Modifier.PRIVATE);   
-    }
-
-    public void test22() throws Exception{
-    	helper1(9, 34, 9, 34, true, "Inner", Modifier.PRIVATE);   
-    }
-    
-    public void test23() throws Exception{
-    	helper1(6, 33, 6, 33, true, "Inner", Modifier.PRIVATE);   
-    }
-    
-    public void test24() throws Exception{
-    	helper1(3, 26, 3, 26, true, "Inner", Modifier.PRIVATE);   
-    }
-
-    public void test25() throws Exception{
-    	helper1(8, 28, 8, 28, true, "Inner", Modifier.PRIVATE);   
-    }
-
-    public void test26() throws Exception{
-    	helper1(8, 28, 8, 28, true, "Inner", Modifier.PRIVATE);   
-    }
-
-    public void test27() throws Exception{
-    	helper1(11, 39, 11, 39, true, "Inner", Modifier.PRIVATE);   
-    }
-
-    public void test28() throws Exception{
-//        printTestDisabledMessage("disabled: bug 43360");
-    	helper1(10, 27, 10, 27, true, "Inner", Modifier.PRIVATE);   
-    }
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/CopyPackageChangeTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/CopyPackageChangeTest.java
deleted file mode 100644
index 547297c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/CopyPackageChangeTest.java
+++ /dev/null
@@ -1,53 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.internal.corext.refactoring.changes.CopyPackageChange;
-
-public class CopyPackageChangeTest extends RefactoringTest {
-
-	private static final String REFACTORING_PATH= "CopyPackageChange/";
-	private static final Class clazz= CopyPackageChangeTest.class;
-	
-	public CopyPackageChangeTest(String name) {
-		super(name);
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	public void test0() throws Exception{
-		createCU(getPackageP(), "A.java", getFileContents(getRefactoringPath() + "A.java"));
-		
-		IPackageFragmentRoot newRoot= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "newName");
-		
-		String packName= getPackageP().getElementName();
-		CopyPackageChange change= new CopyPackageChange(getPackageP(), newRoot, null);
-		performChange(change);
-		IPackageFragment copied= newRoot.getPackageFragment(packName);
-		assertTrue("copied.exists()", copied.exists());
-		assertTrue(copied.getChildren().length == 1);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractConstantTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractConstantTests.java
deleted file mode 100644
index 6eddcaf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractConstantTests.java
+++ /dev/null
@@ -1,326 +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.jdt.ui.tests.refactoring;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatusCodes;
-import org.eclipse.jdt.internal.corext.refactoring.code.ExtractConstantRefactoring;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class ExtractConstantTests extends RefactoringTest {
-
-	private static final Class clazz = ExtractConstantTests.class;
-	private static final String REFACTORING_PATH = "ExtractConstant/";
-
-	private Object fCompactPref; 
-		
-	public ExtractConstantTests(String name) {
-		super(name);
-	} 
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private String getSimpleTestFileName(boolean canInline, boolean input){
-		String fileName = "A_" + getName();
-		if (canInline)
-			fileName += input ? "_in": "_out";
-		return fileName + ".java"; 
-	}
-	
-	private String getTestFileName(boolean canExtract, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += (canExtract ? "canExtract/": "cannotExtract/");
-		return fileName + getSimpleTestFileName(canExtract, input);
-	}
-	
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canExtract, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(canExtract, input), getFileContents(getTestFileName(canExtract, input)));
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		Hashtable options= JavaCore.getOptions();
-		
-		String setting= DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR;
-		fCompactPref= options.get(setting);
-		options.put(setting, DefaultCodeFormatterConstants.TRUE);
-		JavaCore.setOptions(options);
-	}
-	
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		Hashtable options= JavaCore.getOptions();
-		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR, fCompactPref);
-		JavaCore.setOptions(options);	
-	}
-
-	private void guessHelper(int startLine, int startColumn, int endLine, int endColumn, String expectedGuessedName) throws Exception {
-		ICompilationUnit cu= createCU(getPackageP(), getName()+".java", getFileContents(TEST_PATH_PREFIX + getRefactoringPath() + "nameGuessing/" + getName()+".java"));
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ExtractConstantRefactoring ref= ExtractConstantRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-																									JavaPreferencesSettings.getCodeGenerationSettings());		
-		RefactoringStatus preconditionResult= ref.checkActivation(new NullProgressMonitor());
-		assertTrue("activation was supposed to be successful" + preconditionResult.toString(), preconditionResult.isOK());
-		assertEquals("contant name not guessed", expectedGuessedName, ref.guessConstantName());
-	}
-
-	private void helper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean allowLoadtime, boolean qualifyReferencesWithConstantName, String constantName, String guessedConstantName) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ExtractConstantRefactoring ref= ExtractConstantRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-																									JavaPreferencesSettings.getCodeGenerationSettings());
-		RefactoringStatus preconditionResult= ref.checkActivation(new NullProgressMonitor());
-		assertTrue("activation was supposed to be successful" + preconditionResult.toString(), preconditionResult.isOK());
-
-		if(!allowLoadtime)
-			assertTrue("The selected expression has been erroneously reported to contain references to non-static or non-final fields.", ref.selectionAllStaticFinal());		
-		
-		ref.setReplaceAllOccurrences(replaceAll);
-		ref.setQualifyReferencesWithDeclaringClassName(qualifyReferencesWithConstantName);
-		ref.setConstantName(constantName);
-
-		assertEquals("constant name incorrectly guessed", guessedConstantName, ref.guessConstantName());
-
-		RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-		assertTrue("precondition was supposed to pass", checkInputResult.isOK());	
-		
-		performChange(ref.createChange(new NullProgressMonitor()));
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		assertEqualLines(getFileContents(getTestFileName(true, false)), newcu.getSource());
-	}
-
-	private void helper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean allowLoadtime, String constantName, String guessedConstantName) throws Exception{	
-		helper1(startLine, startColumn, endLine, endColumn, replaceAll, allowLoadtime, false, constantName, guessedConstantName);
-	}
-	
-	private void helper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean allowLoadtime, boolean qualifyReferencesWithConstantName, String constantName) throws Exception{	
-		helper1(startLine, startColumn, endLine, endColumn, replaceAll, allowLoadtime, qualifyReferencesWithConstantName, constantName, constantName);
-	}
-	
-	private void helper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean allowLoadtime, String constantName) throws Exception{
-		helper1(startLine, startColumn, endLine, endColumn, replaceAll, allowLoadtime, false, constantName);
-	}	
-	
-	private void failHelper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean allowLoadtime, String constantName) throws Exception {
-		failHelper1(startLine, startColumn, endLine, endColumn, replaceAll, allowLoadtime, constantName, 0, false);	
-	}
-	private void failHelper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean allowLoadtime, String constantName, int errorCode, boolean checkCode) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ExtractConstantRefactoring ref= ExtractConstantRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-																									JavaPreferencesSettings.getCodeGenerationSettings());
-		ref.setReplaceAllOccurrences(replaceAll);
-		ref.setConstantName(constantName);
-		RefactoringStatus result= performRefactoring(ref);
-		
-		if(!allowLoadtime && !ref.selectionAllStaticFinal())
-			return;
-			
-		assertNotNull("precondition was supposed to fail", result);
-		if(checkCode)
-			assertEquals(errorCode, result.getEntryMatchingSeverity(RefactoringStatus.ERROR).getCode());
-	}
-
-	//--- TESTS
-	
-	public void test0() throws Exception {
-		helper1(5, 16, 5, 17, true, false, "CONSTANT");
-	}
-	
-	public void test1() throws Exception {
-		helper1(5, 16, 5, 21, false, false, "CONSTANT");	
-	}
-	
-	public void test2() throws Exception {
-		helper1(8, 16, 8, 27, false, false, "CONSTANT");
-	}
-	
-	public void test3() throws Exception {
-		helper1(8, 16, 8, 27, true, false, "CONSTANT");	
-	}
-		
-	public void test4() throws Exception {
-		helper1(5, 23, 5, 34, true, false, "CONSTANT");
-	}
-	
-	public void test5() throws Exception {
-		helper1(11, 20, 11, 26, true, true, "CONSTANT");		
-	}	
-	
-	public void test6() throws Exception {
-		helper1(13, 20, 13, 35, true, true, "CONSTANT");		
-	}
-		
-	public void test7() throws Exception {
-		helper1(12, 20, 12, 28, true, true, "CONSTANT");		
-	}
-		
-	public void test8() throws Exception {
-		helper1(8, 16, 8, 22, true, true, "CONSTANT");	
-	}
-	
-	public void test9() throws Exception {
-		helper1(6, 24, 6, 29, true, true, "CONSTANT");	
-	}
-
-	public void test10() throws Exception {
-		helper1(8, 17, 8, 22, true, true, "CONSTANT");	
-	}			
-	
-	public void test11() throws Exception {
-		helper1(10, 37, 10, 43, true, true, "CONSTANT");	
-	}
-	
-	public void test12() throws Exception {
-		helper1(9, 19, 9, 24, true, true, "CONSTANT");	
-	}
-	
-	public void test13() throws Exception{
-		helper1(9, 16, 9, 28, true, true, "CONSTANT");		
-	}
-		
-	public void test14() throws Exception{
-		helper1(10, 28, 10, 44, true, true, "CONSTANT");
-	}	
-
-	public void test15() throws Exception{
-		helper1(5, 16, 5, 25, true, false, "CONSTANT", "FRED");
-	}	
-
-	public void test16() throws Exception{
-		helper1(5, 20, 5, 27, true, false, "CONSTANT", "RED");
-	}	
-
-	public void test17() throws Exception{
-		helper1(5, 16, 5, 35, true, false, "CONSTANT", "YET_ANOTHER_FRED");
-	}
-	
-	public void test18() throws Exception {
-		helper1(5, 16, 5, 17, true, false, true, "CONSTANT");	
-	}
-	
-	public void test19() throws Exception {
-		helper1(5, 23, 5, 38, false, false, "CONSTANT");
-	}
-	
-	public void test20() throws Exception {
-		helper1(7, 19, 7, 28, false, false, "CONSTANT");
-	}
-	
-	public void test21() throws Exception {
-		helper1(4, 28, 4, 37, false, false, "CONSTANT");	
-	}
-
-	public void testZeroLengthSelection0() throws Exception {
-		helper1(5, 18, 5, 18, false, false, "CONSTANT");	
-	}
-	
-	// -- testing failing preconditions
-	public void testFail0() throws Exception{
-		failHelper1(8, 16, 8, 21, true, true, "CONSTANT");		
-	}
-	
-	public void testFail1() throws Exception{
-		failHelper1(8, 16, 8, 26 , true, true, "CONSTANT");		
-	}
-	
-	public void testFail2() throws Exception{
-		failHelper1(9, 20, 9, 21 , true, true, "CONSTANT");	
-	}
-		
-	public void testFail3() throws Exception{
-		failHelper1(9, 18, 9, 25, true, true, "CONSTANT");	
-	}
-		
-	public void testFail4() throws Exception{
-		failHelper1(6, 16, 6, 20, true, true, "CONSTANT");	
-	}
-		
-	public void testFail5() throws Exception{
-		failHelper1(9, 16, 9, 25, true, true, "CONSTANT");	
-	}
-		
-	public void testFail6() throws Exception{
-		failHelper1(11, 20, 11, 24, true, true, "CONSTANT");	
-	}
-		
-	public void testFail7() throws Exception{
-		failHelper1(11, 20, 11, 34, true, true, "CONSTANT");	
-	}
-		
-	public void testFail10() throws Exception{
-		failHelper1(15, 20, 15, 37, true, false, "CONSTANT");	
-	}
-		
-	public void testFail11() throws Exception{
-		failHelper1(8, 16, 8, 22, true, false, "CONSTANT");
-	}
-	
-	public void testFail12() throws Exception{
-		failHelper1(4, 7, 4, 8, true, true, "CONSTANT", RefactoringStatusCodes.EXPRESSION_NOT_RVALUE, true);
-	}
-	
-	public void testFail13() throws Exception {
-		failHelper1(2, 9, 2, 10, true, true, "CONSTANT", RefactoringStatusCodes.EXPRESSION_NOT_RVALUE, true);	
-	}
-	
-	public void testFail14() throws Exception {
-		failHelper1(5, 9, 5, 11, true, true, "CONSTANT");	
-	}
-	
-	public void testFail15() throws Exception {
-		failHelper1(5, 10, 5, 13, true, true, "CONSTANT");	
-	}
-	
-	public void testGuessStringLiteral0() throws Exception {
-		//test for bug 37377
-		guessHelper(4, 19, 4, 32, "FOO_HASHMAP") ;
-	}
-
-	public void testGuessStringLiteral1() throws Exception {
-		//test for bug 37377
-		guessHelper(4, 19, 4, 33, "FOO_HASH_MAP") ;
-	}
-
-	public void testGuessFromGetterName0() throws Exception {
-		guessHelper(4, 19, 4, 30, "FOO_BAR") ;
-	}
-
-	public void testGuessFromGetterName1() throws Exception {
-		guessHelper(4, 23, 4, 33, "FOO_BAR") ;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractInterfaceTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractInterfaceTests.java
deleted file mode 100644
index a10393d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractInterfaceTests.java
+++ /dev/null
@@ -1,822 +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.jdt.ui.tests.refactoring;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceRefactoring;
-import org.eclipse.jdt.internal.corext.template.CodeTemplates;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class ExtractInterfaceTests extends RefactoringTest {
-
-	private static final Class clazz= ExtractInterfaceTests.class;
-	private static final String REFACTORING_PATH= "ExtractInterface/";
-    private Hashtable fOldOptions;
-	
-	public ExtractInterfaceTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		CodeTemplates.getCodeTemplate(CodeTemplates.NEWTYPE).setPattern(
-			"${package_declaration}" + 
-				System.getProperty("line.separator", "\n") +
-			"${"+ CodeTemplates.TYPECOMMENT+"}" + 
-			System.getProperty("line.separator", "\n") +
-			"${type_declaration}");
-
-		CodeTemplates.getCodeTemplate(CodeTemplates.TYPECOMMENT).setPattern("/** typecomment template*/");
-		
-		fOldOptions= JavaCore.getOptions();
-		
-	    Hashtable options= JavaCore.getDefaultOptions();
-	    options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR, DefaultCodeFormatterConstants.TRUE);
-	    options.put(DefaultCodeFormatterConstants.FORMATTER_NUMBER_OF_EMPTY_LINES_TO_PRESERVE, "1");
-	    options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.TAB);
-
-	    JavaCore.setOptions(options);
-	}
-	    
-    protected void tearDown() throws Exception {
-    	super.tearDown();
-    	JavaCore.setOptions(fOldOptions);	
-    }
-	
-	/******* shortcuts **********/
-	
-	private static String getTopLevelTypeName(String typeQualifiedTyperName){
-		int dotIndex= typeQualifiedTyperName.indexOf('.');
-		if (dotIndex == -1)
-			return typeQualifiedTyperName;
-		return typeQualifiedTyperName.substring(0, dotIndex);
-	}
-	
-	private IType getClassFromTestFile(IPackageFragment pack, String className) throws Exception{
-		return getType(createCUfromTestFile(pack, getTopLevelTypeName(className)), className);
-	}
-
-	private void validatePassingTest(String className, String[] cuNames, String newInterfaceName, boolean replaceOccurrences, String[] extractedMethodNames, String[][] extractedSignatures, String[] extractedFieldNames) throws Exception {
-		IType clas= getClassFromTestFile(getPackageP(), className);
-				
-		ExtractInterfaceRefactoring ref= ExtractInterfaceRefactoring.create(clas, JavaPreferencesSettings.getCodeGenerationSettings());
-		ref.setNewInterfaceName(newInterfaceName);
-		assertEquals("interface name should be accepted", RefactoringStatus.OK, ref.checkNewInterfaceName(newInterfaceName).getSeverity());
-		
-		ICompilationUnit[] cus= new ICompilationUnit[cuNames.length];
-		for (int i= 0; i < cuNames.length; i++) {
-			cus[i]= createCUfromTestFile(clas.getPackageFragment(), cuNames[i]);			
-		}
-		ref.setReplaceOccurrences(replaceOccurrences);	
-		IMethod[] extractedMethods= getMethods(clas, extractedMethodNames, extractedSignatures);
-	    IField[] extractedFields= getFields(clas, extractedFieldNames);
-		ref.setExtractedMembers(merge(extractedMethods, extractedFields));
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-
-		for (int i= 0; i < cus.length; i++) {
-			String expected= getFileContents(getOutputTestFileName(cuNames[i]));
-			String actual= cus[i].getSource();
-			assertEqualLines("(" + cus[i].getElementName() +")", expected, actual);
-		}
-
-		ICompilationUnit interfaceCu= clas.getPackageFragment().getCompilationUnit(newInterfaceName + ".java");
-		assertEqualLines("(interface cu)", getFileContents(getOutputTestFileName(newInterfaceName)), interfaceCu.getSource());
-	}
-	
-	private void validatePassingTest(String className, String newInterfaceName, boolean extractAll, boolean replaceOccurrences) throws Exception {
-		IType clas= getClassFromTestFile(getPackageP(), className);
-		ICompilationUnit cu= clas.getCompilationUnit();
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-				
-		ExtractInterfaceRefactoring ref= ExtractInterfaceRefactoring.create(clas, JavaPreferencesSettings.getCodeGenerationSettings());
-		ref.setNewInterfaceName(newInterfaceName);
-		assertEquals("interface name should be accepted", RefactoringStatus.OK, ref.checkNewInterfaceName(newInterfaceName).getSeverity());
-		
-		if (extractAll)
-			ref.setExtractedMembers(ref.getExtractableMembers());
-		ref.setReplaceOccurrences(replaceOccurrences);	
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		assertEqualLines("incorrect changes in " + className,
-			getFileContents(getOutputTestFileName(className)),
-			cu.getSource());
-
-		ICompilationUnit interfaceCu= pack.getCompilationUnit(newInterfaceName + ".java");
-		assertEqualLines("incorrect interface created",
-			getFileContents(getOutputTestFileName(newInterfaceName)),
-			interfaceCu.getSource());
-	}
-
-	private void validateFailingTest(String className, String newInterfaceName, boolean extractAll, int expectedSeverity) throws Exception {
-		IType clas= getClassFromTestFile(getPackageP(), className);
-		ExtractInterfaceRefactoring ref= ExtractInterfaceRefactoring.create(clas, JavaPreferencesSettings.getCodeGenerationSettings());
-		
-		ref.setNewInterfaceName(newInterfaceName);
-		if (extractAll)
-			ref.setExtractedMembers(ref.getExtractableMembers());
-		assertTrue("was not supposed to pass", performRefactoring(ref) != null);	
-		assertEquals("was not supposed to fail with different severity", expectedSeverity, performRefactoring(ref).getSeverity());
-	}
-
-	private void standardPassingTest() throws Exception{
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, null);
-	}
-	//---------------tests ----------------------
-	
-	public void test0() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test1() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test2() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test3() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test4() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test5() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test6() throws Exception{
-		printTestDisabledMessage("needs Organize Import");
-//		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test7() throws Exception{
-		printTestDisabledMessage("needs Organize Import");
-//		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test8() throws Exception{
-		printTestDisabledMessage("needs Organize Import");
-//		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test9() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test10() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test11() throws Exception{
-		validatePassingTest("A", "I", true, false);
-	}
-
-	public void test12() throws Exception{
-		validatePassingTest("A", "I", true, true);
-	}
-
-	public void test13() throws Exception{
-		validatePassingTest("A", "I", true, true);
-	}
-
-	public void test14() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test15() throws Exception{
-		String[] names= new String[]{"m", "m1"};
-		String[][] signatures= new String[][]{new String[0], new String[0]};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, null);
-	}
-
-	public void test16() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test17() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test18() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test19() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test20() throws Exception{
-		String[] names= new String[]{"m", "m1"};
-		String[][] signatures= new String[][]{new String[0], new String[0]};
-		validatePassingTest("A", new String[]{"A"},"I", true, names, signatures, null);
-	}
-	
-//	public void test21() throws Exception{
-		//disable for Exceptions
-//		validatePassingTest("A", "I", true, true);
-//	}
-
-	public void test22() throws Exception{
-		validatePassingTest("A", "I", true, true);
-	}
-
-	public void test23() throws Exception{
-		validatePassingTest("A", "I", true, true);
-	}
-
-	public void test24() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test25() throws Exception{
-		validatePassingTest("A", "I", true, true);
-	}
-
-	public void test26() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test27() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test28() throws Exception{
-		printTestDisabledMessage("bug 22883");
-//		standardPassingTest();
-	}
-
-	public void test29() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test30() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test31() throws Exception{
-		standardPassingTest();
-	}
-	
-	public void test32() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test33() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test34() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test35() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test36() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test37() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test38() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test39() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test40() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test41() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test42() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test43() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test44() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test45() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test46() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test47() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test48() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test49() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test50() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test51() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test52() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test53() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test54() throws Exception{
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "A1"}, "I", true, names, signatures, null);
-	}
-
-	public void test55() throws Exception{
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "A1"}, "I", true, names, signatures, null);
-	}
-
-	public void test56() throws Exception{
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "A1"}, "I", true, names, signatures, null);
-	}
-
-	public void test57() throws Exception{
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "A1"}, "I", true, names, signatures, null);
-	}
-
-	public void test58() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test59() throws Exception{
-//		printTestDisabledMessage("bug 22946 ");
-		standardPassingTest();
-	}
-
-	public void test60() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test61() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test62() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test63() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test64() throws Exception{
-//		printTestDisabledMessage("test for 23105");
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "Inter"}, "I", true, names, signatures, null);
-	}
-
-	public void test65() throws Exception{
-//		printTestDisabledMessage("test for 23105");
-		standardPassingTest();
-	}
-
-	public void test66() throws Exception{
-		standardPassingTest();
-	}
-
-	public void test67() throws Exception{
-//		printTestDisabledMessage("test for 23105");
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "Outer", "Inter"}, "I", true, names, signatures, null);
-	}
-	
-	public void test68() throws Exception{
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "As"}, "I", true, names, signatures, null);
-	}
-
-	public void test69() throws Exception{
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "As"}, "I", true, names, signatures, null);
-	}
-
-	public void test70() throws Exception{
-		standardPassingTest();
-	}
-	
-	public void test71() throws Exception{
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "As"}, "I", true, names, signatures, null);
-	}
-
-	public void test72() throws Exception{
-//		printTestDisabledMessage("bug 23705");		
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[]{"QA;"}};
-		validatePassingTest("A", new String[]{"A", "As"}, "I", true, names, signatures, null);
-	}
-
-	public void test73() throws Exception{
-//		printTestDisabledMessage("bug 23953");		
-		String[] names= new String[]{"amount"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "B", "OldInterface"}, "I", true, names, signatures, null);
-	}
-
-	public void test74() throws Exception{
-//		printTestDisabledMessage("bug 23953");		
-		String[] names= new String[]{"amount"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "B", "OldInterface"}, "I", true, names, signatures, null);
-	}
-
-	public void test75() throws Exception{
-//		printTestDisabledMessage("bug 23953");		
-		String[] names= new String[]{"amount"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "B", "C"}, "I", true, names, signatures, null);
-	}
-
-	public void test76() throws Exception{
-//		printTestDisabledMessage("bug 23953");		
-		String[] names= new String[]{"amount"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("A", new String[]{"A", "B", "C"}, "I", true, names, signatures, null);
-	}
-
-	public void test77() throws Exception{
-		printTestDisabledMessage("bug 23699");
-//		String[] names= new String[]{"amount"};
-//		String[][] signatures= new String[][]{new String[0]};
-//		validatePassingTest("A.Inner", new String[]{"A", "B"}, "I", names, signatures, true);
-	}
-
-	public void test78() throws Exception{
-//		printTestDisabledMessage("bug 23705");		
-		String[] names= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[]{"QA;"}};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, null);
-	}
-
-    public void test79() throws Exception{
-//		printTestDisabledMessage("bug 23697");
-        String[] names= new String[]{"getFoo", "foo"};
-        String[][] signatures= new String[][]{new String[0], new String[]{"QA;"}};
-        validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, null);
-    }
-
-	public void test80() throws Exception{
-//		printTestDisabledMessage("bug 33223");
-		String[] names= new String[]{"f", "fz", "f1", "f1z", "f11", "f2"};
-		String[][] signatures= new String[][]{new String[0], new String[0], new String[0], new String[0], new String[0], new String[0]};
-		String[] fieldNames= {"I1", "I1z", "I2", "I2z", "I3", "I4"};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test81() throws Exception{
-//		printTestDisabledMessage("bug 33878 extract interface: incorrect handling of arrays ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test82() throws Exception{
-//		printTestDisabledMessage("bug 33878 extract interface: incorrect handling of arrays ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test83() throws Exception{
-//		printTestDisabledMessage("bug 33878 extract interface: incorrect handling of arrays ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test84() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-	
-	public void test85() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test86() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test87() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test88() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test89() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test90() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test91() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test92() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test93() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test94() throws Exception{
-//		printTestDisabledMessage("bug 34931 Extract Interface does not update all references ");
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test95() throws Exception{
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test96() throws Exception{
-		String[] names= {};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test97() throws Exception{
-		//printTestDisabledMessage("bug 40373");
-		String[] names= {"foo"};
-		String[][] signatures= {{}};
-		String[] fieldNames= {};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void test98() throws Exception{
-		//test for 41464
-		String[] names= new String[]{"foo"};
-		String[][] signatures= new String[][]{new String[0]};
-		validatePassingTest("Foo", new String[]{"Foo", "Bar"}, "IFoo", true, names, signatures, null);
-	}
-
-	public void testPaperExample0() throws Exception{
-		String[] names= new String[]{"add", "addAll", "iterator"};
-		String[][] signatures= new String[][]{new String[]{"QComparable;"}, new String[]{"QA;"}, new String[0]};
-		String[] fieldNames= null;
-		validatePassingTest("A", new String[]{"A"}, "Bag", true, names, signatures, fieldNames);
-	}
-
-	public void testPaperExample1() throws Exception{
-		String[] names= new String[]{"add", "addAll", "iterator"};
-		String[][] signatures= new String[][]{new String[]{"QComparable;"}, new String[]{"QA;"}, new String[0]};
-		String[] fieldNames= null;
-		validatePassingTest("A", new String[]{"A"}, "Bag", true, names, signatures, fieldNames);
-	}
-
-	public void testPaperExampleSimplified0() throws Exception{
-		String[] names= new String[]{};
-		String[][] signatures= {{}};
-		String[] fieldNames= null;
-		validatePassingTest("A", new String[]{"A"}, "Bag", true, names, signatures, fieldNames);
-	}
-    
-    public void testConstant80() throws Exception{
-        String[] names= null;
-        String[][] signatures= null;
-        String[] fieldNames= {"X"};
-        validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-    }
-
-    public void testConstant81() throws Exception{
-        String[] names= null;
-        String[][] signatures= null;
-        String[] fieldNames= {"X"};
-        validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-    }
-
-    public void testConstant82() throws Exception{
-        String[] names= null;
-        String[][] signatures= null;
-        String[] fieldNames= {"X"};
-        validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-    }
-
-    public void testConstant83() throws Exception{
-        String[] names= null;
-        String[][] signatures= null;
-        String[] fieldNames= {"X"};
-        validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-    }
-
-	public void testConstant84() throws Exception{
-		String[] names= null;
-		String[][] signatures= null;
-		String[] fieldNames= {"X"};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void testConstant85() throws Exception{
-		String[] names= null;
-		String[][] signatures= null;
-		String[] fieldNames= {"X"};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void testConstant86() throws Exception{
-		String[] names= null;
-		String[][] signatures= null;
-		String[] fieldNames= {"X", "Y"};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void testConstant87() throws Exception{
-		String[] names= null;
-		String[][] signatures= null;
-		String[] fieldNames= {"X", "Y"};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void testConstant88() throws Exception{
-		String[] names= null;
-		String[][] signatures= null;
-		String[] fieldNames= {"X", "Y"};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void testInterface0() throws Exception{
-		String[] names= {"m"};
-		String[][] signatures= {new String[0]};
-		String[] fieldNames= null;
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void testInterface1() throws Exception{
-		String[] names= {"m"};
-		String[][] signatures= {new String[0]};
-		String[] fieldNames= null;
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void testInterface2() throws Exception{
-		String[] names= {"m"};
-		String[][] signatures= {new String[0]};
-		String[] fieldNames= {"i", "j"};
-		validatePassingTest("A", new String[]{"A"}, "I", true, names, signatures, fieldNames);
-	}
-
-	public void testInterface3() throws Exception{
-		String[] methodNames= {"m", "m1", "m2", "m4", "m5"};
-		String[][] signatures= {new String[0], new String[0], new String[0], new String[0], new String[0]};
-		String[] fieldNames= {"I", "I1", "I2", "I4", "I5"};
-		validatePassingTest("A", new String[]{"A"}, "I", true, methodNames, signatures, fieldNames);
-	}
-
-	public void testInterface4() throws Exception{
-		printTestDisabledMessage("cannot yet update refs (in methods) to itself if it's an interface");
-//		String[] methodNames= {"a"};
-//		String[][] signatures= {{"QA;", "QA;"}};
-//		String[] fieldNames= null;
-//		validatePassingTest("A", new String[]{"A"}, "I", true, methodNames, signatures, fieldNames);
-	}
-
-	public void testInterface5() throws Exception{
-		String[] methodNames= {"a"};
-		String[][] signatures= {new String[0]};
-		String[] fieldNames= null;
-		validatePassingTest("A", new String[]{"A"}, "I", true, methodNames, signatures, fieldNames);
-	}
-
-	public void testInterface6() throws Exception{
-		String[] methodNames= {"foo0", "foo1", "foo2", "foo3"};
-		String[][] signatures= {new String[0], new String[0], new String[0], new String[0]};
-		String[] fieldNames= null;
-		validatePassingTest("A", new String[]{"A"}, "I", true, methodNames, signatures, fieldNames);
-	}
-
-//disabled - can extract interface from interface
-//	public void testFail0() throws Exception{
-//		validateFailingTest("A", "I", true, RefactoringStatus.FATAL);
-//	}
-
-	public void testFail1() throws Exception{
-		validateFailingTest("A", "I", true, RefactoringStatus.FATAL);
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTestSetup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTestSetup.java
deleted file mode 100644
index 26b3e9e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTestSetup.java
+++ /dev/null
@@ -1,172 +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.jdt.ui.tests.refactoring;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-
-public class ExtractMethodTestSetup extends TestSetup {
-	
-	private IJavaProject fJavaProject;
-	private IPackageFragmentRoot fRoot;
-	private static final String CONTAINER= "src";
-
-	private IPackageFragment fSelectionPackage;
-	private IPackageFragment fInvalidSelectionPackage;
-	private IPackageFragment fValidSelectionPackage;
-	private IPackageFragment fValidSelectionCheckedPackage;
-	private IPackageFragment fSemicolonPackage;
-	private IPackageFragment fTryPackage;
-	private IPackageFragment fLocalsPackage;
-	private IPackageFragment fExpressionPackage;
-	private IPackageFragment fNestedPackage;
-	private IPackageFragment fReturnPackage;
-	private IPackageFragment fBranchPackage;
-	private IPackageFragment fErrorPackage;
-	private IPackageFragment fWikiPackage;
-	private IPackageFragment fParameterNamePackage;
-	private IPackageFragment fDuplicatesPackage;
-	private IPackageFragment fInitializerPackage;
-	
-	public ExtractMethodTestSetup(Test test) {
-		super(test);
-	}	
-	
-	public IPackageFragmentRoot getRoot() {
-		return fRoot;
-	}
-		
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		fJavaProject= JavaProjectHelper.createJavaProject("TestProject", "bin");
-		JavaProjectHelper.addRTJar(fJavaProject);
-		fRoot= JavaProjectHelper.addSourceContainer(fJavaProject, CONTAINER);
-		
-		Refactoring.getUndoManager().flush();
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceDescription description= workspace.getDescription();
-		description.setAutoBuilding(false);
-		workspace.setDescription(description);
-		
-		fSelectionPackage= getRoot().createPackageFragment("selection", true, null);
-		fInvalidSelectionPackage= fRoot.createPackageFragment("invalidSelection", true, null);
-		fValidSelectionPackage= fRoot.createPackageFragment("validSelection", true, null);
-		fValidSelectionCheckedPackage= fRoot.createPackageFragment("validSelection_in", true, null);
-		fSemicolonPackage= getRoot().createPackageFragment("semicolon_in", true, null);
-		fTryPackage= getRoot().createPackageFragment("try_in", true, null);
-		fLocalsPackage= getRoot().createPackageFragment("locals_in", true, null);
-		fExpressionPackage= getRoot().createPackageFragment("expression_in", true, null);
-		fNestedPackage= getRoot().createPackageFragment("nested_in", true, null);
-		fReturnPackage= getRoot().createPackageFragment("return_in", true, null);
-		fBranchPackage= getRoot().createPackageFragment("branch_in", true, null);
-		fErrorPackage= getRoot().createPackageFragment("error_in", true, null);
-		fWikiPackage= getRoot().createPackageFragment("wiki_in", true, null);
-		fParameterNamePackage= getRoot().createPackageFragment("parameterName_in", true, null);
-		fDuplicatesPackage= getRoot().createPackageFragment("duplicates_in", true, null);
-		fInitializerPackage= getRoot().createPackageFragment("initializer_in", true, null);
-		
-		ICompilationUnit cu= fExpressionPackage.createCompilationUnit(
-			"A.java", 
-			"package expression_in; import java.io.File; class A { public File getFile() { return null; } public void useFile(File file) { } }",
-			true, null);
-			
-		cu= fExpressionPackage.createCompilationUnit(
-			"B.java", 
-			"package expression_in; import java.util.List; public class B { public List[] foo() { return null; } }",
-			true, null);
-		cu.save(null, true);
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		RefactoringTest.performDummySearch(fJavaProject);
-		JavaProjectHelper.delete(fJavaProject);
-	}
-	
-	public IPackageFragment getExpressionPackage() {
-		return fExpressionPackage;
-	}
-	
-	public IPackageFragment getInvalidSelectionPackage() {
-		return fInvalidSelectionPackage;
-	}
-	
-	public IPackageFragment getLocalsPackage() {
-		return fLocalsPackage;
-	}
-	
-	public IPackageFragment getNestedPackage() {
-		return fNestedPackage;
-	}
-	
-	public IPackageFragment getReturnPackage() {
-		return fReturnPackage;
-	}
-	
-	public IPackageFragment getSelectionPackage() {
-		return fSelectionPackage;
-	}
-	
-	public IPackageFragment getSemicolonPackage() {
-		return fSemicolonPackage;
-	}
-	
-	public IPackageFragment getTryPackage() {
-		return fTryPackage;
-	}
-	
-	public IPackageFragment getValidSelectionPackage() {
-		return fValidSelectionPackage;
-	}
-
-	public IPackageFragment getValidSelectionCheckedPackage() {
-		return fValidSelectionCheckedPackage;
-	}
-	
-	public IPackageFragment getBranchPackage() {
-		return fBranchPackage;
-	}
-
-	public IPackageFragment getErrorPackage() {
-		return fErrorPackage;
-	}
-
-	public IPackageFragment getWikiPackage() {
-		return fWikiPackage;
-	}	
-
-	public IPackageFragment getParameterNamePackage() {
-		return fParameterNamePackage;
-	}
-
-	public IPackageFragment getDuplicatesPackage() {
-		return fDuplicatesPackage;
-	}
-
-	public IPackageFragment getInitializerPackage() {
-		return fInitializerPackage;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTests.java
deleted file mode 100644
index cf75c3f..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTests.java
+++ /dev/null
@@ -1,1595 +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.jdt.ui.tests.refactoring;
-
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-import org.eclipse.jdt.internal.corext.refactoring.ParameterInfo;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.code.ExtractMethodRefactoring;
-
-public class ExtractMethodTests extends AbstractSelectionTestCase {
-
-	private String[] fNewNames;
-	private int[] fNewOrder;
-
-	private static ExtractMethodTestSetup fgTestSetup;
-	
-	public ExtractMethodTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		fgTestSetup= new ExtractMethodTestSetup(new TestSuite(ExtractMethodTests.class));
-		return fgTestSetup;
-	}
-
-	protected IPackageFragmentRoot getRoot() {
-		return fgTestSetup.getRoot();
-	}
-	
-	protected String getResourceLocation() {
-		return "ExtractMethodWorkSpace/ExtractMethodTests/";
-	}
-	
-	protected String adaptName(String name) {
-		return name + "_" + getName() + ".java";
-	}	
-	
-	protected void selectionTest(int startLine, int startColumn, int endLine, int endColumn) throws Exception{
-		ICompilationUnit unit= createCU(getSelectionPackage(), "A");
-		String source= unit.getSource();
-		int[] selection= getSelection(source);
-		ISourceRange expected= TextRangeUtil.getSelection(unit, startLine, startColumn, endLine, endColumn);
-		assertEquals(expected.getOffset(), selection[0]);
-		assertEquals(expected.getLength(), selection[1]);
-	}
-	
-	private IPackageFragment getSelectionPackage() throws JavaModelException {
-		return fgTestSetup.getSelectionPackage();
- 	}
-	
-	protected void performTest(IPackageFragment packageFragment, String id, int mode, String outputFolder) throws Exception {
-		ICompilationUnit unit= createCU(packageFragment, id);
-		String source= unit.getSource();
-		int[] selection= getSelection(source);
-		ExtractMethodRefactoring refactoring= ExtractMethodRefactoring.create(
-			unit, selection[0], selection[1],
-			JavaPreferencesSettings.getCodeGenerationSettings());
-		refactoring.setMethodName("extracted");
-		refactoring.setVisibility(Modifier.PROTECTED);
-		String out= null;
-		switch (mode) {
-			case COMPARE_WITH_OUTPUT:
-				out= getProofedContent(outputFolder, id);
-				break;		
-		}
-		performTest(unit, refactoring, mode, out);
-	}	
-	
-	protected RefactoringStatus checkPreconditions(Refactoring refactoring, IProgressMonitor pm) throws CoreException {
-		RefactoringStatus result= refactoring.checkActivation(pm);
-		if (result.hasFatalError())
-			return result;
-		ExtractMethodRefactoring extract= (ExtractMethodRefactoring)refactoring;
-		List parameters= extract.getParameterInfos();
-		if (fNewNames != null && fNewNames.length > 0) {
-			for (int i= 0; i < fNewNames.length; i++) {
-				if (fNewNames[i] != null)
-					((ParameterInfo)parameters.get(i)).setNewName(fNewNames[i]);
-			}
-		}
-		if (fNewOrder != null && fNewOrder.length > 0) {
-			assertTrue(fNewOrder.length == parameters.size());
-			List current= new ArrayList(parameters);
-			for (int i= 0; i < fNewOrder.length; i++) {
-				parameters.set(fNewOrder[i], current.get(i));
-			}
-		}
-		result.merge(refactoring.checkInput(pm));
-		return result;
-	}
-	protected void invalidSelectionTest() throws Exception {
-		performTest(fgTestSetup.getInvalidSelectionPackage(), "A", INVALID_SELECTION, null);
-	}
-	
-	protected void validSelectionTest() throws Exception {
-		performTest(fgTestSetup.getValidSelectionPackage(), "A", VALID_SELECTION, null);
-	}
-	
-	protected void validSelectionTestChecked() throws Exception {
-		performTest(fgTestSetup.getValidSelectionCheckedPackage(), "A", COMPARE_WITH_OUTPUT, "validSelection_out");
-	}
-	
-	protected void semicolonTest() throws Exception {
-		performTest(fgTestSetup.getSemicolonPackage(), "A", COMPARE_WITH_OUTPUT, "semicolon_out");
-	}
-	
-	protected void tryTest() throws Exception {
-		performTest(fgTestSetup.getTryPackage(), "A", COMPARE_WITH_OUTPUT, "try_out");
-	}
-	
-	protected void localsTest() throws Exception {
-		performTest(fgTestSetup.getLocalsPackage(), "A", COMPARE_WITH_OUTPUT, "locals_out");
-	}
-	
-	protected void expressionTest() throws Exception {
-		performTest(fgTestSetup.getExpressionPackage(), "A", COMPARE_WITH_OUTPUT, "expression_out");
-	}
-	
-	protected void nestedTest() throws Exception {
-		performTest(fgTestSetup.getNestedPackage(), "A", COMPARE_WITH_OUTPUT, "nested_out");
-	}
-	
-	protected void returnTest() throws Exception {
-		performTest(fgTestSetup.getReturnPackage(), "A", COMPARE_WITH_OUTPUT, "return_out");
-	}
-	
-	protected void branchTest() throws Exception {
-		performTest(fgTestSetup.getBranchPackage(), "A", COMPARE_WITH_OUTPUT, "branch_out");
-	}
-	
-	protected void errorTest() throws Exception {
-		performTest(fgTestSetup.getErrorPackage(), "A", COMPARE_WITH_OUTPUT, "error_out");
-	}
-	
-	protected void wikiTest() throws Exception {
-		performTest(fgTestSetup.getWikiPackage(), "A", COMPARE_WITH_OUTPUT, "wiki_out");
-	}
-	
-	protected void duplicatesTest() throws Exception {
-		performTest(fgTestSetup.getDuplicatesPackage(), "A", COMPARE_WITH_OUTPUT, "duplicates_out");
-	}
-	
-	protected void initializerTest() throws Exception {
-		performTest(fgTestSetup.getInitializerPackage(), "A", COMPARE_WITH_OUTPUT, "initializer_out");
-	}
-	
-	//=====================================================================================
-	// Testing selections
-	//=====================================================================================
-	
-
-	public void test1() throws Exception {
-		selectionTest(5, 9, 5, 24);
-	}
-	
-	public void test2() throws Exception {
-		selectionTest(5, 9, 5, 19);
-	}
-	
-	public void test3() throws Exception {
-		selectionTest(5, 14, 5, 24);
-	}
-	
-	public void test4() throws Exception {
-		selectionTest(5, 14, 5, 19);
-	}
-	
-	//=====================================================================================
-	// Testing invalid selections
-	//=====================================================================================
-	
-	//---- Misc
-	
-	public void test010() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test011() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test012() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test013() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test014() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- Switch / Case
-	
-	public void test020() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test021() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test022() throws Exception {
-		invalidSelectionTest();
-	}
-
-	//---- Block
-	
-	public void test030() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test031() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- For
-	
-	public void test040() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test041() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test042() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test043() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test044() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test045() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test046() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test047() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test048() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- While
-	
-	public void test050() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test051() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test052() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- do / While
-	
-	public void test060() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test061() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test062() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test063() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- switch
-	
-	public void test070() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test071() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test072() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test073() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- if then else
-	
-	public void test080() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test081() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test082() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test083() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test084() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test085() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- Break
-	
-	public void test090() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test091() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test092() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test093() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test094() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test095() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test096() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- Try / catch / finally
-	
-	public void test100() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test101() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test102() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test103() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test104() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test105() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test106() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test107() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test108() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test109() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test110() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test111() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test112() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test113() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test114() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test115() throws Exception {
-		invalidSelectionTest();
-	}
-
-	//---- invalid local var selection
-	
-	public void test120() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test121() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test122() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test123() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- invalid local type selection
-	
-	public void test130() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test131() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- invalid return statement selection
-	
-	public void test140() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test141() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test142() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test143() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test144() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test145() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test146() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test147() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test148() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test149() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- Synchronized statement
-	
-	public void test150() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test151() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test152() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test153() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test160() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test161() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//----- local declarations
-	
-	public void test170() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test171() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test172() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test173() throws Exception {
-		invalidSelectionTest();
-	}
-
-	//---- Constructor
-	
-	public void test180() throws Exception {
-		// System.out.println(getClass().getName() + "::"+  getName() + " disabled - see bug 11853");
-		invalidSelectionTest();
-	}
-	
-	public void test181() throws Exception {
-		// System.out.println(getClass().getName() + "::"+  getName() + " disabled - see bug 11853");
-		invalidSelectionTest();
-	}
-	
-	//---- More return statement handling
-	
-	public void test190() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test191() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//---- Assignment
-	
-	public void test192() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	public void test193() throws Exception {
-		invalidSelectionTest();
-	}
-	
-	//====================================================================================
-	// Testing valid selections
-	//=====================================================================================
-	
-	//---- Misc
-	
-	public void test200() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test201() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test202() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test203() throws Exception {
-		validSelectionTest();
-	}
-	
-	//---- Block
-	
-	public void test230() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test231() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test232() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test233() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test234() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test235() throws Exception {
-		validSelectionTest();
-	}
-	
-	//---- For statement
-	
-	public void test240() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test241() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test244() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test245() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test246() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test247() throws Exception {
-		validSelectionTest();
-	}
-			
-	public void test248() throws Exception {
-		validSelectionTest();
-	}
-			
-	public void test249() throws Exception {
-		validSelectionTest();
-	}
-			
-	//---- While statement
-	
-	public void test250() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test251() throws Exception {
-		validSelectionTest();
-	}	
-	
-	public void test252() throws Exception {
-		validSelectionTest();
-	}	
-	
-	public void test253() throws Exception {
-		validSelectionTest();
-	}
-		
-	public void test254() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test255() throws Exception {
-		validSelectionTest();
-	}
-	
-	//---- do while statement
-	
-	public void test260() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test261() throws Exception {
-		validSelectionTest();
-	}	
-		
-	public void test262() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test263() throws Exception {
-		validSelectionTest();
-	}
-	
-	//---- switch
-	
-	public void test270() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test271() throws Exception {
-		validSelectionTest();
-	}	
-	
-	public void test272() throws Exception {
-		validSelectionTest();
-	}	
-	
-	public void test273() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test274() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test275() throws Exception {
-		validSelectionTest();
-	}
-	
-	//---- if then else
-	
-	public void test280() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test281() throws Exception {
-		validSelectionTest();
-	}	
-	
-	public void test282() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test283() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test284() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test285() throws Exception {
-		validSelectionTest();
-	}
-	
-	//---- try / catch / finally
-	
-	public void test300() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test301() throws Exception {
-		validSelectionTest();
-	}	
-	
-	public void test302() throws Exception {
-		validSelectionTest();
-	}				
-	
-	public void test304() throws Exception {
-		validSelectionTest();
-	}				
-	
-	public void test305() throws Exception {
-		validSelectionTest();
-	}				
-	
-	public void test306() throws Exception {
-		validSelectionTest();
-	}				
-	
-	public void test307() throws Exception {
-		validSelectionTest();
-	}				
-	
-	public void test308() throws Exception {
-		validSelectionTest();
-	}				
-	
-	public void test309() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test310() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test311() throws Exception {
-		validSelectionTest();
-	}
-	
-	//---- Synchronized statement
-	
-	public void test350() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test351() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test352() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test353() throws Exception {
-		validSelectionTest();
-	}
-	
-	public void test360() throws Exception {
-		validSelectionTestChecked();
-	}
-	
-	public void test361() throws Exception {
-		validSelectionTestChecked();
-	}
-	
-	public void test362() throws Exception {
-		validSelectionTestChecked();
-	}
-	
-	public void test363() throws Exception {
-		validSelectionTestChecked();
-	}
-	
-	public void test364() throws Exception {
-		validSelectionTestChecked();
-	}
-	
-	public void test365() throws Exception {
-		validSelectionTestChecked();
-	}
-	
-	//====================================================================================
-	// Testing Extracted result
-	//====================================================================================
-
-	//---- Test semicolon
-	
-	public void test400() throws Exception {
-		semicolonTest();
-	}
-	
-	public void test401() throws Exception {
-		semicolonTest();
-	}
-	
-	public void test402() throws Exception {
-		semicolonTest();
-	}
-	
-	public void test403() throws Exception {
-		semicolonTest();
-	}	
-	
-	public void test404() throws Exception {
-		semicolonTest();
-	}	
-	
-	public void test406() throws Exception {
-		semicolonTest();
-	}	
-	
-	public void test407() throws Exception {
-		semicolonTest();
-	}	
-	
-	public void test409() throws Exception {
-		semicolonTest();
-	}	
-	
-	//---- Test Try / catch block
-
-	public void test450() throws Exception {
-		tryTest();
-	}
-	
-	public void test451() throws Exception {
-		tryTest();
-	}
-	
-	public void test452() throws Exception {
-		tryTest();
-	}
-	
-	public void test453() throws Exception {
-		tryTest();
-	}
-	
-	public void test454() throws Exception {
-		tryTest();
-	}
-	
-	public void test455() throws Exception {
-		tryTest();
-	}
-	
-	public void test456() throws Exception {
-		tryTest();
-	}
-	
-	public void test457() throws Exception {
-		tryTest();
-	}
-	
-	public void test458() throws Exception {
-		tryTest();
-	}
-	
-	public void test459() throws Exception {
-		tryTest();
-	}
-	
-	public void test460() throws Exception {
-		tryTest();
-	}
-	
-	public void test461() throws Exception {
-		tryTest();
-	}
-	
-	public void test462() throws Exception {
-		tryTest();
-	}
-	
-	//---- Test local vars and types
-	
-	public void test500() throws Exception {
-		localsTest();
-	}
-	
-	public void test501() throws Exception {
-		localsTest();
-	}
-	
-	public void test502() throws Exception {
-		localsTest();
-	}
-	
-	public void test503() throws Exception {
-		localsTest();
-	}
-	
-	public void test504() throws Exception {
-		localsTest();
-	}
-	
-	public void test505() throws Exception {
-		localsTest();
-	}
-	
-	public void test506() throws Exception {
-		localsTest();
-	}
-	
-	public void test507() throws Exception {
-		localsTest();
-	}
-	
-	public void test508() throws Exception {
-		localsTest();
-	}
-	
-	public void test509() throws Exception {
-		localsTest();
-	}
-	
-	public void test510() throws Exception {
-		localsTest();
-	}
-	
-	public void test511() throws Exception {
-		localsTest();
-	}
-		
-	public void test512() throws Exception {
-		localsTest();
-	}
-	
-	public void test513() throws Exception {
-		localsTest();
-	}
-	
-	public void test514() throws Exception {
-		localsTest();
-	}
-	
-	public void test515() throws Exception {
-		localsTest();
-	}
-	
-	public void test516() throws Exception {
-		localsTest();
-	}
-	
-	public void test517() throws Exception {
-		localsTest();
-	}
-	
-	public void test518() throws Exception {
-		localsTest();
-	}
-	
-	public void test519() throws Exception {
-		localsTest();
-	}
-	
-	public void test520() throws Exception {
-		localsTest();
-	}
-	
-	public void test521() throws Exception {
-		localsTest();
-	}
-	
-	public void test522() throws Exception {
-		localsTest();
-	}
-	
-	public void test523() throws Exception {
-		localsTest();
-	}
-	
-	public void test524() throws Exception {
-		localsTest();
-	}
-	
-	public void test525() throws Exception {
-		localsTest();
-	}
-	
-	public void test526() throws Exception {
-		localsTest();
-	}
-	
-	public void test527() throws Exception {
-		localsTest();
-	}
-	
-	public void test528() throws Exception {
-		localsTest();
-	}
-	
-	public void test530() throws Exception {
-		localsTest();
-	}
-	
-	public void test531() throws Exception {
-		localsTest();
-	}
-	
-	public void test532() throws Exception {
-		localsTest();
-	}
-	
-	public void test533() throws Exception {
-		localsTest();
-	}
-	
-	public void test534() throws Exception {
-		localsTest();
-	}
-	
-	public void test535() throws Exception {
-		localsTest();
-	}
-	
-	public void test536() throws Exception {
-		localsTest();
-	}
-	
-	public void test537() throws Exception {
-		localsTest();
-	}
-	
-	public void test538() throws Exception {
-		localsTest();
-	}
-	
-	public void test539() throws Exception {
-		localsTest();
-	}
-	
-	public void test540() throws Exception {
-		localsTest();
-	}
-	
-	public void test541() throws Exception {
-		localsTest();
-	}
-	
-	public void test542() throws Exception {
-		localsTest();
-	}
-	
-	public void test543() throws Exception {
-		localsTest();
-	}
-	
-	public void test550() throws Exception {
-		localsTest();
-	}
-	
-	public void test551() throws Exception {
-		localsTest();
-	}
-	
-	public void test552() throws Exception {
-		localsTest();
-	}
-	
-	public void test553() throws Exception {
-		localsTest();
-	}
-	
-	public void test554() throws Exception {
-		localsTest();
-	}
-	
-	public void test555() throws Exception {
-		localsTest();
-	}
-	
-	public void test556() throws Exception {
-		localsTest();
-	}
-	
-	public void test557() throws Exception {
-		localsTest();
-	}
-	
-	public void test558() throws Exception {
-		localsTest();
-	}
-	
-	public void test559() throws Exception {
-		localsTest();
-	}
-	
-	public void test560() throws Exception {
-		localsTest();
-	}
-	
-	public void test561() throws Exception {
-		localsTest();
-	}
-	
-	public void test562() throws Exception {
-		localsTest();
-	}
-	
-	public void test563() throws Exception {
-		localsTest();
-	}
-	
-	public void test564() throws Exception {
-		localsTest();
-	}
-	
-	public void test565() throws Exception {
-		localsTest();
-	}
-	
-	public void test566() throws Exception {
-		localsTest();
-	}
-	
-	public void test567() throws Exception {
-		localsTest();
-	}
-	
-	public void test568() throws Exception {
-		localsTest();
-	}
-	
-	public void test569() throws Exception {
-		localsTest();
-	}
-	
-	//---- Test expressions
-	
-	public void test600() throws Exception {
-		expressionTest();
-	}
-	
-	public void test601() throws Exception {
-		expressionTest();
-	}
-	
-	public void test602() throws Exception {
-		expressionTest();
-	}
-	
-	public void test603() throws Exception {
-		expressionTest();
-	}
-	
-	public void test604() throws Exception {
-		expressionTest();
-	}
-	
-	public void test605() throws Exception {
-		expressionTest();
-	}
-	
-	public void test606() throws Exception {
-		expressionTest();
-	}
-	
-	public void test607() throws Exception {
-		expressionTest();
-	}
-	
-	public void test608() throws Exception {
-		expressionTest();
-	}
-	
-	public void test609() throws Exception {
-		expressionTest();
-	}
-	
-	public void test610() throws Exception {
-		expressionTest();
-	}
-	
-	public void test611() throws Exception {
-		expressionTest();
-	}
-	
-	public void test612() throws Exception {
-		expressionTest();
-	}
-	
-	public void test613() throws Exception {
-		expressionTest();
-	}
-	
-	public void test614() throws Exception {
-		expressionTest();
-	}
-	
-	public void test615() throws Exception {
-		expressionTest();
-	}
-	
-	public void test616() throws Exception {
-		expressionTest();
-	}
-	
-	public void test617() throws Exception {
-		expressionTest();
-	}
-	
-	public void test618() throws Exception {
-		expressionTest();
-	}
-	
-	public void test619() throws Exception {
-		expressionTest();
-	}
-	
-	public void test620() throws Exception {
-		expressionTest();
-	}
-	
-	public void test621() throws Exception {
-		expressionTest();
-	}
-	
-	public void test622() throws Exception {
-		expressionTest();
-	}
-	
-	//---- Test nested methods and constructor
-	
-	public void test650() throws Exception {
-		nestedTest();
-	}
-	
-	public void test651() throws Exception {
-		nestedTest();
-	}
-	
-	public void test652() throws Exception {
-		nestedTest();
-	}
-
-	public void test653() throws Exception {
-		nestedTest();
-	}
-	
-	public void test654() throws Exception {
-		nestedTest();
-	}
-	
-	//---- Extracting method containing a return statement.
-	
-	public void test700() throws Exception {
-		returnTest();
-	}	
-	
-	public void test701() throws Exception {
-		returnTest();
-	}	
-	
-	public void test702() throws Exception {
-		returnTest();
-	}	
-	
-	public void test703() throws Exception {
-		returnTest();
-	}	
-	
-	public void test704() throws Exception {
-		returnTest();
-	}	
-	
-	public void test705() throws Exception {
-		returnTest();
-	}	
-	
-	public void test706() throws Exception {
-		returnTest();
-	}	
-	
-	public void test707() throws Exception {
-		returnTest();
-	}
-		
-	public void test708() throws Exception {
-		returnTest();
-	}	
-	
-	public void test709() throws Exception {
-		returnTest();
-	}	
-	
-	public void test710() throws Exception {
-		returnTest();
-	}	
-	
-	public void test711() throws Exception {
-		returnTest();
-	}	
-	
-	public void test712() throws Exception {
-		returnTest();
-	}	
-	
-	public void test713() throws Exception {
-		returnTest();
-	}	
-	
-	public void test714() throws Exception {
-		returnTest();
-	}	
-	
-	public void test715() throws Exception {
-		returnTest();
-	}	
-	
-	public void test716() throws Exception {
-		returnTest();
-	}	
-	
-	public void test717() throws Exception {
-		returnTest();
-	}	
-	
-	public void test718() throws Exception {
-		returnTest();
-	}	
-	
-	public void test719() throws Exception {
-		returnTest();
-	}
-	
-	public void test720() throws Exception {
-		returnTest();
-	}
-	
-	public void test721() throws Exception {
-		returnTest();
-	}
-	
-	public void test722() throws Exception {
-		returnTest();
-	}
-	
-	public void test723() throws Exception {
-		returnTest();
-	}
-	
-	public void test724() throws Exception {
-		returnTest();
-	}
-	
-	public void test725() throws Exception {
-		returnTest();
-	}
-	
-	public void test726() throws Exception {
-		returnTest();
-	}
-	
-	public void test727() throws Exception {
-		returnTest();
-	}
-	
-	public void test728() throws Exception {
-		returnTest();
-	}
-	
-	//---- Branch statements
-	
-	public void test750() throws Exception {
-		branchTest();
-	}
-	
-	public void test751() throws Exception {
-		branchTest();
-	}
-	
-	public void test752() throws Exception {
-		branchTest();
-	}
-	
-	public void test753() throws Exception {
-		branchTest();
-	}
-	
-	public void test754() throws Exception {
-		branchTest();
-	}
-	
-	public void test755() throws Exception {
-		branchTest();
-	}
-	
-	//---- Test for CUs with compiler errors
-	
-	public void test800() throws Exception {
-		errorTest();
-	}
-	
-	public void test801() throws Exception {
-		errorTest();
-	}
-	
-	public void test802() throws Exception {
-		errorTest();
-	}
-	
-	//---- Test parameter name changes
-	
-	private void invalidParameterNameTest(String[] newNames) throws Exception {
-		fNewNames= newNames;
-		fNewOrder= null;
-		performTest(fgTestSetup.getParameterNamePackage(), "A", INVALID_SELECTION, null);
-	}
-	
-	private void parameterNameTest(String[] newNames, int[] newOrder) throws Exception {
-		fNewNames= newNames;
-		fNewOrder= newOrder;
-		performTest(fgTestSetup.getParameterNamePackage(), "A", COMPARE_WITH_OUTPUT, "parameterName_out");
-	}
-	
-	public void test900() throws Exception {
-		invalidParameterNameTest(new String[] {"y"});
-	}
-	
-	public void test901() throws Exception {
-		invalidParameterNameTest(new String[] {null, "i"});
-	}
-	
-	public void test902() throws Exception {
-		invalidParameterNameTest(new String[] {"System"});
-	}
-	
-	public void test903() throws Exception {
-		parameterNameTest(new String[] {"xxx", "yyyy"}, null);
-	}
-	
-	public void test904() throws Exception {
-		parameterNameTest(new String[] {"xx", "zz"}, new int[] {1, 0});
-	}
-	
-	public void test905() throws Exception {
-		parameterNameTest(new String[] {"message"}, null);
-	}
-	
-	//---- Test duplicate code snippets ----------------------------------------
-	
-	public void test950() throws Exception {
-		duplicatesTest();
-	}
-	
-	public void test951() throws Exception {
-		duplicatesTest();
-	}
-	
-	public void test952() throws Exception {
-		duplicatesTest();
-	}
-	
-	public void test953() throws Exception {
-		duplicatesTest();
-	}
-	
-	public void test954() throws Exception {
-		duplicatesTest();
-	}
-	
-	public void test955() throws Exception {
-		duplicatesTest();
-	}
-	
-	public void test956() throws Exception {
-		duplicatesTest();
-	}
-	
-	//---- Test code in initializers -----------------------------------------------
-	
-	public void test1000() throws Exception {
-		initializerTest();
-	}
-	
-	public void test1001() throws Exception {
-		initializerTest();
-	}
-	
-	public void test1002() throws Exception {
-		initializerTest();
-	}
-	
-	public void test1003() throws Exception {
-		initializerTest();
-	}
-	
-	//---- Test copied from http://c2.com/cgi/wiki?RefactoringBenchmarksForExtractMethod
-	
-	public void test2001() throws Exception {
-		wikiTest();
-	}	
-	
-	public void test2002() throws Exception {
-		wikiTest();
-	}	
-	
-	public void test2003() throws Exception {
-		wikiTest();
-	}	
-	
-	public void test2004() throws Exception {
-		wikiTest();
-	}	
-	
-	public void test2005() throws Exception {
-		wikiTest();
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractTempTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractTempTests.java
deleted file mode 100644
index 793009d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractTempTests.java
+++ /dev/null
@@ -1,686 +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.jdt.ui.tests.refactoring;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.code.ExtractTempRefactoring;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-public class ExtractTempTests extends RefactoringTest {
-
-	private static final Class clazz= ExtractTempTests.class;
-	private static final String REFACTORING_PATH= "ExtractTemp/";
-
-	private Object fCompactPref; 
-		
-	public ExtractTempTests(String name) {
-		super(name);
-	} 
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private String getSimpleTestFileName(boolean canExtract, boolean input){
-		String fileName = "A_" + getName();
-		if (canExtract)
-			fileName += input ? "_in": "_out";
-		return fileName + ".java"; 
-	}
-	
-	private String getTestFileName(boolean canExtract, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += (canExtract ? "canExtract/": "cannotExtract/");
-		return fileName + getSimpleTestFileName(canExtract, input);
-	}
-	
-	private ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canExtract, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(canExtract, input), getFileContents(getTestFileName(canExtract, input)));
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		Hashtable options= JavaCore.getOptions();
-		
-		String setting= DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR;
-		fCompactPref= options.get(setting);
-		options.put(setting, DefaultCodeFormatterConstants.TRUE);
-		JavaCore.setOptions(options);
-	}
-	
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		Hashtable options= JavaCore.getOptions();
-		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR, fCompactPref);
-		JavaCore.setOptions(options);	
-	}
-
-	private void helper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean makeFinal, String tempName, String guessedTempName) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ExtractTempRefactoring ref= ExtractTempRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-		                                                       JavaPreferencesSettings.getCodeGenerationSettings());
-																
-		RefactoringStatus activationResult= ref.checkActivation(new NullProgressMonitor());	
-		assertTrue("activation was supposed to be successful", activationResult.isOK());																
-																									
-		ref.setReplaceAllOccurrences(replaceAll);
-		ref.setDeclareFinal(makeFinal);
-		ref.setTempName(tempName);
-
-		assertEquals("temp name incorrectly guessed", guessedTempName, ref.guessTempName());
-
-		RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-		assertTrue("precondition was supposed to pass but was " + checkInputResult.toString(), checkInputResult.isOK());
-	
-		performChange(ref.createChange(new NullProgressMonitor()));
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		assertEqualLines(getFileContents(getTestFileName(true, false)), newcu.getSource());
-	}
-	
-	private void warningHelper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean makeFinal, String tempName, String guessedTempName, int expectedStatus) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ExtractTempRefactoring ref= ExtractTempRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-															   JavaPreferencesSettings.getCodeGenerationSettings());
-																
-		RefactoringStatus activationResult= ref.checkActivation(new NullProgressMonitor());	
-		assertTrue("activation was supposed to be successful", activationResult.isOK());																
-																									
-		ref.setReplaceAllOccurrences(replaceAll);
-		ref.setDeclareFinal(makeFinal);
-		ref.setTempName(tempName);
-
-		assertEquals("temp name incorrectly guessed", guessedTempName, ref.guessTempName());
-
-		RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-		assertEquals("status", expectedStatus, checkInputResult.getSeverity());
-	
-		performChange(ref.createChange(new NullProgressMonitor()));
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		assertEqualLines(getFileContents(getTestFileName(true, false)), newcu.getSource());
-	}
-
-	private void failHelper1(int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean makeFinal, String tempName, int expectedStatus) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		ExtractTempRefactoring ref= ExtractTempRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-																									JavaPreferencesSettings.getCodeGenerationSettings());
-		
-		ref.setReplaceAllOccurrences(replaceAll);
-		ref.setDeclareFinal(makeFinal);
-		ref.setTempName(tempName);
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);
-		assertEquals("status", expectedStatus, result.getSeverity());
-	}	
-
-	//--- TESTS
-	
-	public void test0() throws Exception{
-		helper1(4, 16, 4, 17, false, false, "temp", "j");
-	}
-	
-	public void test1() throws Exception{
-		helper1(4, 16, 4, 17, true, false, "temp", "j");
-	}
-	
-	public void test2() throws Exception{
-		helper1(4, 16, 4, 17, true, true, "temp", "j");
-	}
-	
-	public void test3() throws Exception{
-		helper1(4, 16, 4, 17, false, true, "temp", "j");
-	}	
-	
-	public void test4() throws Exception{
-		helper1(4, 16, 4, 21, false, false, "temp", "j");
-	}	
-	
-	public void test5() throws Exception{
-		helper1(4, 16, 4, 21, true, false, "temp", "j");
-	}	
-	
-	public void test6() throws Exception{
-		helper1(4, 16, 4, 21, true, true, "temp", "j");
-	}	
-	
-	public void test7() throws Exception{
-		helper1(4, 16, 4, 21, false, true, "temp", "j");
-	}	
-
-	public void test8() throws Exception{
-		helper1(5, 20, 5, 25, true, false, "temp", "j");
-	}	
-
-	public void test9() throws Exception{
-		helper1(5, 20, 5, 25, false, false, "temp", "j");
-	}	
-
-	public void test10() throws Exception{
-		helper1(5, 20, 5, 25, true, false, "temp", "i");
-	}	
-
-	public void test11() throws Exception{
-		helper1(5, 20, 5, 25, true, false, "temp", "i");
-	}	
-
-	public void test12() throws Exception{
-		helper1(5, 17, 5, 22, true, false, "temp", "i");
-	}	
-
-	public void test13() throws Exception{
-		helper1(7, 16, 7, 42, true, false, "temp", "iterator");
-	}	
-
-	public void test14() throws Exception{
-		helper1(6, 15, 6, 20, false, false, "temp", "i");
-	}	
-	
-	public void test15() throws Exception{
-		helper1(7, 23, 7, 28, false, false, "temp", "i");
-	}	
-
-	public void test16() throws Exception{
-		helper1(7, 23, 7, 28, false, false, "temp", "i");
-	}	
-	
-	public void test17() throws Exception{
-		helper1(5, 20, 5, 25, true, false, "temp", "j");
-	}	
-	
-	public void test18() throws Exception{
-		helper1(6, 20, 6, 25, true, false, "temp", "i");
-	}	
-	
-	public void test19() throws Exception{
-		helper1(5, 20, 5, 23, true, false, "temp", "j");
-	}	
-
-//cannot do it - see testFail16
-//	public void test20() throws Exception{
-//		printTestDisabledMessage("regression test for bug#11474");
-//		helper1(5, 9, 5, 12, false, false, "temp", "temp");
-//	}	
-	
-	public void test21() throws Exception{
-		helper1(5, 16, 5, 17, false, false, "temp", "j");
-	}	
-
-//cannot do it - see testFail17
-//	public void test22() throws Exception{
-//		printTestDisabledMessage("regression test for bug#11474");
-//		helper1(6, 13, 6, 16, false, false, "temp", "temp");
-//	}	
-
-	public void test23() throws Exception{
-		helper1(7, 17, 7, 20, false, false, "temp", "b");
-	}		
-	
-//	public void test24() throws Exception{
-//test disabled - trainling semicolons are disallowed now
-//		//regression test for bug#8116
-//		helper1(4, 16, 4, 18, false, false, "temp", "temp");
-//	}
-	
-	public void test25() throws Exception{
-//		printTestDisabledMessage("regression test for bug#8895");
-		helper1(4, 17, 4, 22, true, false, "temp", "i");
-	}
-	
-	public void test26() throws Exception{
-//		printTestDisabledMessage("regression test for 9905");
-		helper1(5, 19, 5, 23, true, false, "temp", "i");
-	}
-	
-	public void test27() throws Exception{
-//		printTestDisabledMessage("regression test for 8123");
-		helper1(4, 15, 4, 19, true, false, "temp", "j");
-	}
-	
-	public void test28() throws Exception{
-//		printTestDisabledMessage("regression test for 11026");
-		helper1(4, 16, 4, 31, true, false, "temp", "b");
-	}
-	
-	public void test29() throws Exception{
-		helper1(4, 19, 4, 22, true, false, "temp", "string");
-	}
-	
-	public void test30() throws Exception{
-		helper1(5, 16, 5, 20, true, false, "temp", "i");
-	}
-
-	public void test31() throws Exception{
-		helper1(5, 16, 5, 20, true, false, "temp", "j");
-	}
-
-	public void test32() throws Exception{
-		helper1(4, 16, 4, 22, true, false, "temp", "j");
-	}
-	
-	public void test33() throws Exception{
-//		printTestDisabledMessage("regression test for bug#11449");
-		helper1(4, 19, 4, 33, true, false, "temp", "object");
-	}
-
-	public void test34() throws Exception{
-//		printTestDisabledMessage("another regression test for bug#11449");
-		helper1(4, 19, 4, 46, true, false, "temp", "list");
-	}
-
-	public void test35() throws Exception{
-//		printTestDisabledMessage("another regression test for bug#11622");
-		helper1(8, 19, 8, 28, true, false, "temp", "lists");
-	}
-
-	public void test36() throws Exception{
-//		printTestDisabledMessage("another regression test for bug#12205");
-		helper1(11, 15, 11, 25, true, false, "temp", "js");
-	}
-
-	public void test37() throws Exception{
-//		printTestDisabledMessage("another regression test for bug#15196");
-		helper1(8, 20, 8, 25, true, false, "temp", "j");
-	}
-
-	public void test38() throws Exception{
-//		printTestDisabledMessage("regression test for bug#17473");
-		helper1(5, 28, 5, 32, true, false, "temp1", "i");
-	}
-
-	public void test39() throws Exception{
-//		printTestDisabledMessage("regression test for bug#20520 ");
-		helper1(4, 14, 4, 26, true, false, "temp", "object");
-	}
-	
-	public void test40() throws Exception{
-//		printTestDisabledMessage("test for bug 21815");
-		helper1(4, 9, 4, 16, true, false, "temp", "a");
-	}
-
-	public void test41() throws Exception{
-//		printTestDisabledMessage("test for bug 21815");
-		helper1(4, 9, 4, 36, true, false, "temp", "i");
-	}
-
-	public void test42() throws Exception{
-//		printTestDisabledMessage("test for bug 19930");
-		helper1(5, 16, 5, 35, true, false, "temp", "length");
-	}
-
-	public void test43() throws Exception{
-//		printTestDisabledMessage("test for bug 19930");
-		helper1(5, 20, 5, 36, true, false, "temp", "fred");
-	}
-
-	public void test44() throws Exception{
-		//21939
-		helper1(5, 20, 5, 28, true, false, "temp", "fred");
-	}
-
-	public void test45() throws Exception{
-		//21939
-		helper1(4, 16, 4, 19, true, false, "temp", "i");
-	}
-
-	public void test46() throws Exception{
-//		printTestDisabledMessage("test for bug 21815");
-		helper1(4, 9, 4, 12, true, false, "temp", "i");
-	}
-
-	public void test47() throws Exception{
-		helper1(5, 9, 5, 12, true, false, "temp", "i");
-	}
-
-	public void test48() throws Exception{
-//		printTestDisabledMessage("test for bug#22054");
-		helper1(4, 16, 4, 32, true, false, "temp", "string");
-	}
-
-	public void test49() throws Exception{
-//		printTestDisabledMessage("test for bug#23282 ");
-		helper1(5, 15, 5, 19, true, false, "temp", "b");
-	}
-
-	public void test50() throws Exception{
-//		printTestDisabledMessage("test for bug#23283 ");
-		helper1(5, 15, 5, 19, true, false, "temp", "b");
-	}
-
-	public void test51() throws Exception{
-//		printTestDisabledMessage("test for bug#23281");
-		helper1(5, 15, 5, 18, true, false, "temp", "i");
-	}
-
-	public void test52() throws Exception{
-//		printTestDisabledMessage("test for bug#26036");
-		helper1(15, 47, 15, 60, true, false, "valueOnIndexI", "object");
-	}
-
-	public void test53() throws Exception{
-		helper1(6, 17, 6, 22, true, false, "temp", "i");
-	}
-	
-	public void test54() throws Exception{
-		helper1(6, 37, 6, 43, true, false, "temp", "i");
-	}
-
-	public void test55() throws Exception{
-		helper1(6, 19, 6, 24, true, false, "temp", "i");
-	}
-	
-	public void test56() throws Exception{
-		helper1(6, 24, 6, 29, true, false, "temp", "i");
-	}	
-
-	public void test57() throws Exception{
-//		printTestDisabledMessage("test for bug 24808");
-		helper1(8, 30, 8, 54, true, false, "newVariable", "string");
-	}	
-
-	public void test58() throws Exception{
-//		printTestDisabledMessage("test for bug 30304");
-		helper1(7, 14, 7, 30, true, false, "temp", "b");
-	}	
-
-	public void test59() throws Exception{
-//		printTestDisabledMessage("test for bug 30304");
-		helper1(7, 17, 7, 18, true, false, "temp", "i");
-	}	
-
-	public void test60() throws Exception{
-//		printTestDisabledMessage("test for bug 30304");
-		helper1(7, 17, 7, 18, true, false, "temp", "i");
-	}	
-
-	public void test61() throws Exception{
-//		printTestDisabledMessage("test for bug 30304");
-		helper1(7, 17, 7, 18, true, false, "temp", "i");
-	}	
-		
-	public void test62() throws Exception{
-//		printTestDisabledMessage("test for bug 33405 Refactoring extract local variable fails in nested if statements");
-		helper1(10, 17, 10, 28, true, false, "temp", "string");
-	}	
-
-	public void test63() throws Exception{
-//		printTestDisabledMessage("test for bug 33405 Refactoring extract local variable fails in nested if statements");
-		helper1(9, 20, 9, 23, true, false, "temp", "string");
-	}	
-
-	public void test64() throws Exception{
-//		printTestDisabledMessage("test for bug 33405 Refactoring extract local variable fails in nested if statements");
-		helper1(10, 17, 10, 28, true, false, "temp", "string");
-	}	
-
-	public void test65() throws Exception{
-//		printTestDisabledMessage("test for bug 35981 extract local variable causing exception [refactoring] ");
-		helper1(6, 19, 6, 22, true, false, "temp", "string");
-	}	
-
-	public void test66() throws Exception{
-		helper1(7, 32, 7, 33, true, false, "temp", "exception");
-	}	
-
-	public void test67() throws Exception{
-//		printTestDisabledMessage("test for bug 37834");
-		helper1(6, 16, 6, 21, true, false, "temp", "integer");
-	}	
-
-	public void test68() throws Exception{
-//		printTestDisabledMessage("test for bug 37834");
-		helper1(6, 14, 6, 21, true, false, "temp", "d2");
-	}	
-
-	public void test69() throws Exception{
-		helper1(5, 24, 5, 26, true, false, "temp", "string2");
-	}	
-
-	public void test70() throws Exception{
-//		printTestDisabledMessage("test for bug 40353");
-		helper1(7, 28, 7, 42, true, true, "temp", "j");
-	}	
-
-	public void test71() throws Exception{
-//		printTestDisabledMessage("test for bug 40353");
-		helper1(8, 24, 8, 34, true, false, "temp", "string");
-	}	
-
-	public void test72() throws Exception{
-//		printTestDisabledMessage("test for bug 40353");
-		helper1(8, 32, 8, 33, true, false, "temp", "j");
-	}	
-
-	public void test73() throws Exception{
-//		printTestDisabledMessage("test for bug 40353");
-		warningHelper1(6, 39, 6, 40, true, false, "temp", "j", RefactoringStatus.WARNING);
-		// (warning is superfluous, but detection would need flow analysis)
-	}	
-
-	public void test74() throws Exception{
-//		printTestDisabledMessage("test for bug 40353");
-		helper1(7, 36, 7, 49, true, false, "temp", "string");
-	}	
-
-	public void test75() throws Exception{
-//		printTestDisabledMessage("test for bug 40353");
-		helper1(7, 36, 7, 39, true, false, "temp", "j");
-	}	
-
-	public void test76() throws Exception{
-//		printTestDisabledMessage("test for bug 40353");
-		helper1(7, 48, 7, 49, true, false, "temp", "j");
-	}	
-
-	public void test77() throws Exception {
-//		printTestDisabledMessage("test for bug 40353: extracting fragment which matches for_initializer");
-		helper1(10, 13, 10, 17, true, false, "temp", "i");
-	}
-
-	public void testZeroLengthSelection0() throws Exception {
-//		printTestDisabledMessage("test for bug 30146");
-		helper1(4, 18, 4, 18, true, false, "temp", "j");
-	}
-
-	// -- testing failing preconditions
-	public void testFail0() throws Exception{
-		failHelper1(5, 16, 5, 17, false, false, "temp", RefactoringStatus.ERROR);
-	}	
-
-	public void testFail1() throws Exception{
-		failHelper1(4, 9, 5, 13, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail2() throws Exception{
-		failHelper1(4, 9, 4, 20, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail3() throws Exception{
-		failHelper1(4, 9, 4, 20, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail4() throws Exception{
-		failHelper1(5, 9, 5, 12, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-	
-	public void testFail5() throws Exception{
-		failHelper1(3, 12, 3, 15, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail6() throws Exception{
-		failHelper1(4, 14, 4, 19, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail7() throws Exception{
-		failHelper1(4, 15, 4, 20, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-//	public void testFail8() throws Exception{
-//		printTestDisabledMessage("removed");
-//		failHelper1(5, 16, 5, 20, false, false, "temp", RefactoringStatus.FATAL);
-//	}	
-
-	public void testFail9() throws Exception{
-		failHelper1(4, 19, 4, 23, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail10() throws Exception{
-		failHelper1(4, 33, 4, 39, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail11() throws Exception{
-//		printTestDisabledMessage("regression test for bug#13061");
-		failHelper1(4, 18, 4, 19, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail12() throws Exception{
-		failHelper1(4, 16, 4, 29, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-//removed
-//	public void testFail13() throws Exception{
-//		failHelper1(5, 16, 5, 20, false, false, "temp", RefactoringStatus.FATAL);
-//	}	
-
-//removed
-//	public void testFail14() throws Exception{
-//		failHelper1(4, 16, 4, 22, false, false, "temp", RefactoringStatus.FATAL);
-//	}	
-
-//removed
-//	public void testFail15() throws Exception{
-//		failHelper1(4, 19, 4, 22, false, false, "temp", RefactoringStatus.FATAL);
-//	}	
-
-//removed - allowed now (see bug 21815)
-//	public void testFail16() throws Exception{
-//		failHelper1(5, 9, 5, 12, false, false, "temp", RefactoringStatus.FATAL);
-//	}	
-//
-//	public void testFail17() throws Exception{
-//		failHelper1(6, 13, 6, 16, false, false, "temp", RefactoringStatus.FATAL);
-//	}	
-
-	public void testFail18() throws Exception{
-//		printTestDisabledMessage("regression test for bug#8149");
-//		printTestDisabledMessage("regression test for bug#37547");
-		// test for bug 40353: is now FATAL"
-		failHelper1(4, 27, 4, 28, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail19() throws Exception{
-		printTestDisabledMessage("regression test for bug#8149");
-//		failHelper1(6, 16, 6, 18, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail20() throws Exception{
-//		printTestDisabledMessage("regression test for bug#13249");
-		failHelper1(3, 9, 3, 41, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-	
-	public void testFail21() throws Exception{
-		//test for bug 19851
-		failHelper1(6, 9, 6, 24, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail22() throws Exception{
-//		printTestDisabledMessage("test for bug 21815");
-		failHelper1(5, 9, 5, 12, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-	
-	public void testFail23() throws Exception{
-//		printTestDisabledMessage("test for bug 24265");
-		failHelper1(4, 13, 4, 14, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail24() throws Exception{
-//		printTestDisabledMessage("test for bug 24265");
-		failHelper1(4, 13, 4, 14, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail25() throws Exception{
-		failHelper1(4, 16, 4, 18, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail26() throws Exception{
-		failHelper1(4, 15, 4, 20, false, false, "temp", RefactoringStatus.FATAL);
-	}	
-	
-	public void testFail27() throws Exception{
-//		printTestDisabledMessage("test for bug 29513");
-		failHelper1(7, 13, 7, 24, true, false, "temp", RefactoringStatus.WARNING);
-	}	
-
-	public void testFail28() throws Exception{
-//		printTestDisabledMessage("test for bug 29513");
-		failHelper1(7, 17, 7, 28, true, false, "temp", RefactoringStatus.WARNING);
-	}	
-
-	public void testFail29() throws Exception {
-//		printTestDisabledMessage("test for bug 40353: extracting for_updater referring to loop variable");
-		failHelper1(5, 32, 5, 35, true, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail30() throws Exception {
-//		printTestDisabledMessage("test for bug 40353: extracting for_test referring to loop variable");
-		failHelper1(5, 25, 5, 30, true, false, "temp", RefactoringStatus.FATAL);
-	}	
-
-	public void testFail31() throws Exception {
-//		printTestDisabledMessage("test for bug 40353: extracting for_test referring to loop variable");
-		failHelper1(5, 31, 5, 32, true, false, "temp", RefactoringStatus.FATAL);
-	}
-
-	public void testFail32() throws Exception {
-//		printTestDisabledMessage("test for bug 40353: extracting for_test referring to loop variable");
-		failHelper1(6, 35, 6, 36, true, false, "temp", RefactoringStatus.FATAL);
-	}
-
-	public void testFail33() throws Exception {
-//		printTestDisabledMessage("test for bug 40353: extracting for_updater");
-		failHelper1(6, 17, 6, 21, true, false, "temp", RefactoringStatus.FATAL);
-	}
-
-	public void testFail34() throws Exception {
-//		printTestDisabledMessage("test for bug 40353: extracting for_initializer");
-		failHelper1(9, 20, 9, 24, true, false, "temp", RefactoringStatus.FATAL);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineConstantTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineConstantTests.java
deleted file mode 100644
index e15d51a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineConstantTests.java
+++ /dev/null
@@ -1,233 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.ISourceRange;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-import org.eclipse.jdt.internal.corext.Assert;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatusCodes;
-import org.eclipse.jdt.internal.corext.refactoring.code.InlineConstantRefactoring;
-
-public class InlineConstantTests extends RefactoringTest {
-
-	private static final Class clazz = InlineConstantTests.class;
-	private static final String REFACTORING_PATH = "InlineConstant/";
-
-	private boolean toSucceed;
-
-	public InlineConstantTests(String name) {
-		super(name);
-	} 
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH + successPath();
-	}
-	
-	private String successPath() {
-		return toSucceed ? "/canInline/" : "/cannotInline/";
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	private String getSimpleName(String qualifiedName) {
-		return qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1);
-	}
-	
-	private String getQualifier(String qualifiedName) {
-		int dot= qualifiedName.lastIndexOf('.');
-		return qualifiedName.substring(0, dot != -1 ? dot : 0);
-	}
-
-	private ICompilationUnit[] createCUs(String[] qualifiedNames) throws Exception {
-		ICompilationUnit[] cus= new ICompilationUnit[qualifiedNames.length];
-		for(int i= 0; i < qualifiedNames.length; i++) {
-			Assert.isNotNull(qualifiedNames[i]);
-			
-			cus[i]= createCUfromTestFile(getRoot().createPackageFragment(getQualifier(qualifiedNames[i]), true, null),
-			                                          getSimpleName(qualifiedNames[i]));
-		}
-		return cus;
-	}
-
-	private int firstIndexOf(String one, String[] others) {
-		for(int i= 0; i < others.length; i++)
-			if(one == null && others[i] == null || one.equals(others[i]))
-				return i;
-		return -1;
-	}
-	private void helper1(String cuQName, int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean removeDeclaration) throws Exception{
-		helper1(new String[] {cuQName}, cuQName, startLine, startColumn, endLine, endColumn, replaceAll, removeDeclaration);
-	}
-	private void helper1(String[] cuQNames, String selectionCuQName, int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean removeDeclaration) throws Exception{
-		int selectionCuIndex= firstIndexOf(selectionCuQName, cuQNames);
-		Assert.isTrue(selectionCuIndex != -1, "parameter selectionCuQName must match some String in cuQNames.");
-		helper1(cuQNames, selectionCuIndex, startLine, startColumn, endLine, endColumn, replaceAll, removeDeclaration);
-	}
-	private void helper1(String[] cuQNames, int selectionCuIndex, int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean removeDeclaration) throws Exception{
-		Assert.isTrue(0 <= selectionCuIndex && selectionCuIndex < cuQNames.length);
-		
-		toSucceed= true;
-		
-		ICompilationUnit[] cus= createCUs(cuQNames);
-		ICompilationUnit selectionCu= cus[selectionCuIndex];
-		
-		ISourceRange selection= TextRangeUtil.getSelection(selectionCu, startLine, startColumn, endLine, endColumn);
-		InlineConstantRefactoring ref= InlineConstantRefactoring.create(selectionCu, selection.getOffset(), selection.getLength(), JavaPreferencesSettings.getCodeGenerationSettings());
-
-		RefactoringStatus preconditionResult= ref.checkActivation(new NullProgressMonitor());	
-
-		assertTrue("activation was supposed to be successful", preconditionResult.isOK());
-
-		ref.setReplaceAllReferences(replaceAll);
-		ref.setRemoveDeclaration(removeDeclaration);
-		
-		preconditionResult.merge(ref.checkInput(new NullProgressMonitor()));
-
-		assertTrue("precondition was supposed to pass",preconditionResult.isOK());
-
-		IChange change= ref.createChange(new NullProgressMonitor());
-		performChange(change);
-
-		for(int i= 0; i < cus.length; i++){
-			String outputTestFileName= getOutputTestFileName(getSimpleName(cuQNames[i]));
-			assertEqualLines("Incorrect inline in " + outputTestFileName, getFileContents(outputTestFileName), cus[i].getSource());				
-		}	
-	}
-
-	private void failHelper1(String cuQName, int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean removeDeclaration, int errorCode) throws Exception{
-		failHelper1(new String[] {cuQName}, cuQName, startLine, startColumn, endLine, endColumn, replaceAll, removeDeclaration, errorCode);
-	}	
-	private void failHelper1(String[] cuQNames, String selectionCuQName, int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean removeDeclaration, int errorCode) throws Exception{
-		int selectionCuIndex= firstIndexOf(selectionCuQName, cuQNames);
-		Assert.isTrue(selectionCuIndex != -1, "parameter selectionCuQName must match some String in cuQNames.");
-		failHelper1(cuQNames, selectionCuIndex, startLine, startColumn, endLine, endColumn, replaceAll, removeDeclaration, errorCode);
-	}
-	private void failHelper1(String[] cuQNames, int selectionCuIndex, int startLine, int startColumn, int endLine, int endColumn, boolean replaceAll, boolean removeDeclaration, int errorCode) throws Exception{
-		Assert.isTrue(0 <= selectionCuIndex && selectionCuIndex < cuQNames.length);
-		
-		toSucceed= false;
-		
-		ICompilationUnit[] cus= createCUs(cuQNames);
-		ICompilationUnit selectionCu= cus[selectionCuIndex];
-			
-		ISourceRange selection= TextRangeUtil.getSelection(selectionCu, startLine, startColumn, endLine, endColumn);
-		InlineConstantRefactoring ref= InlineConstantRefactoring.create(selectionCu, selection.getOffset(), selection.getLength(), 
-										
-		JavaPreferencesSettings.getCodeGenerationSettings());
-		if (ref == null)
-			return;
-		RefactoringStatus result= ref.checkActivation(new NullProgressMonitor());	
-
-		if(!result.isOK()) {
-			assertEquals(errorCode, result.getEntryMatchingSeverity(RefactoringStatus.ERROR).getCode());
-			return;				
-		} else {
-
-			ref.setReplaceAllReferences(replaceAll);
-			ref.setRemoveDeclaration(removeDeclaration);
-			
-			result.merge(ref.checkInput(new NullProgressMonitor()));
-	
-			assertTrue("precondition checking is expected to fail.", !result.isOK());
-			assertEquals(errorCode, result.getEntryMatchingSeverity(RefactoringStatus.ERROR).getCode());
-		}
-	}
-
-	//--- TESTS
-	
-	public void test0() throws Exception {
-		helper1("p.C", 5, 30, 5, 36, true, false);
-	}
-	
-	public void test1() throws Exception {
-		helper1("C", 3, 33, 3, 40, true, false);
-	}	
-
-	public void test2() throws Exception {
-		helper1("p.Klass", 10, 22, 10, 30, false, false);
-	}
-	
-	public void test3() throws Exception {
-		helper1("p.LeVinSuperieure", 5, 32, 5, 43, true, true);
-	}		
-
-	public void test4() throws Exception {
-		helper1("p.Klus", 5, 36, 5, 36, true, false);
-	}		
-
-	public void test5() throws Exception {
-		helper1("p.PartOfDeclNameSelected", 5, 32, 5, 34, true, true);
-	}		
-	
-	public void test6() throws Exception {
-		helper1("p.CursorPositionedInReference", 8, 57, 8, 57, false, false);
-	}		
-	
-	public void test7() throws Exception {
-		helper1("p.PartOfReferenceSelected", 8, 52, 8, 62, false, false);
-	}
-	
-	public void test8() throws Exception {
-		helper1(new String[] {"p1.C", "p2.D"}, "p1.C", 5, 29, 5, 37, true, false);	
-	}
-	
-	public void test9() throws Exception {
-		helper1(new String[] {"p1.C", "p2.D", "p3.E"}, "p2.D", 8, 18, 8, 26, true, true);	
-	}
-	
-	public void test10() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B"}, "p2.B", 9, 28, 9, 37, false, false);
-	}
-	
-	public void test11() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B", "p3.C"}, "p1.A", 8, 25, 8, 25, false, false);	
-	}
-	
-	public void test12() throws Exception {
-		helper1(new String[] {"p1.Declarer", "p2.InlineSite"}, "p2.InlineSite", 7, 37, 7, 43, true, false);	
-	}
-	
-	public void test13() throws Exception {
-		helper1(new String[] {"p1.A", "p2.InlineSite"}, "p2.InlineSite", 8, 19, 8, 29, false, false);
-	}
-	
-	public void test14() throws Exception {
-		helper1("cantonzuerich.GrueziWohl", 7, 35, 7, 35, true, false);
-	}
-	
-	public void test15() throws Exception {
-		helper1("schweiz.zuerich.zuerich.Froehlichkeit", 14, 16, 14, 32, true, false);
-	}
-		
-	// -- testing failing preconditions
-	
-	public void testFail0() throws Exception {
-		failHelper1("foo.NeueZuercherZeitung", 5, 27, 5, 28, true, false, RefactoringStatusCodes.NOT_STATIC_FINAL_SELECTED);
-	}
-	
-	public void testFail1() throws Exception {
-		failHelper1("fun.Fun", 8, 35, 8, 35, false, false, RefactoringStatusCodes.DECLARED_IN_CLASSFILE);	
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup.java
deleted file mode 100644
index 7ba21d0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup.java
+++ /dev/null
@@ -1,178 +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.jdt.ui.tests.refactoring;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-
-public class InlineMethodTestSetup extends TestSetup {
-
-	private IJavaProject fJavaProject;
-	private IPackageFragmentRoot fRoot;
-	private static final String CONTAINER= "src";
-
-	private IPackageFragment fInvalid;
-	private IPackageFragment fSimple;
-	private IPackageFragment fArgument;
-	private IPackageFragment fNameConflict;
-	private IPackageFragment fCall;
-	private IPackageFragment fExpression;
-	private IPackageFragment fControlStatement;
-	private IPackageFragment fReceiver;
-	private IPackageFragment fImport;
-	private IPackageFragment fCast;
-
-	public InlineMethodTestSetup(Test test) {
-		super(test);
-	}
-
-	public IPackageFragmentRoot getRoot() {
-		return fRoot;
-	}
-		
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		fJavaProject= JavaProjectHelper.createJavaProject("TestProject", "bin");
-		JavaProjectHelper.addRTJar(fJavaProject);
-		fRoot= JavaProjectHelper.addSourceContainer(fJavaProject, CONTAINER);
-		
-		Refactoring.getUndoManager().flush();
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceDescription description= workspace.getDescription();
-		description.setAutoBuilding(false);
-		workspace.setDescription(description);
-		
-		fInvalid= fRoot.createPackageFragment("invalid", true, null);
-		fSimple= fRoot.createPackageFragment("simple_in", true, null);		
-		fArgument= fRoot.createPackageFragment("argument_in", true, null);
-		fNameConflict= fRoot.createPackageFragment("nameconflict_in", true, null);
-		fCall= fRoot.createPackageFragment("call_in", true, null);
-		fExpression= fRoot.createPackageFragment("expression_in", true, null);
-		fControlStatement= fRoot.createPackageFragment("controlStatement_in", true, null);
-		fReceiver= fRoot.createPackageFragment("receiver_in", true, null);
-		fImport= fRoot.createPackageFragment("import_in", true, null);
-		fCast= fRoot.createPackageFragment("cast_in", true, null);
-		
-		fImport.createCompilationUnit(
-			"Provider.java",
-			"package import_in;\n" +
-			"\n" +
-			"import import_use.List;\n" +
-			"import java.io.File;\n" +
-			"import java.util.ArrayList;\n" +
-			"import java.util.Map;\n" +
-			"\n" +
-			"public class Provider {\n" +
-			"	public File useAsReturn() {\n" +
-			"		return null;\n" +
-			"	}\n" +
-			"	public void useInArgument(File file) {\n" +
-			"		file= null;\n" +
-			"	}\n" +
-			"	public void useInDecl() {\n" +
-			"		List list= null;\n" +
-			"	}\n" +
-			"	public int useInDecl2() {\n" +
-		  	"		return new ArrayList().size();\n" +
-			"	}\n" +	
-			"	public Object useInDecl3() {\n" +
-		  	"		return new java.util.HashMap();\n" +
-			"	}\n" +	
-			"	public void useInClassLiteral() {\n" +
-			"		Class clazz= File.class;\n" +
-			"	}\n" +
-			"	public void useArray() {\n" +
-			"		List[] lists= null;\n" +
-			"	}\n" +
-			"	public void useInLocalClass() {\n" +
-			"		class Local extends File implements Comparable {\n" +
-			"			public Local(String s) {\n" +
-			"				super(s);\n" +
-			"			}\n" +
-			"			public void foo(Map map) {\n" +
-			"			}\n" +
-			"			public int compareTo(Object o) {\n" +
-			"				return 0;\n" +
-			"			}\n" +
-			"		}\n" +
-			"	}\n" +
-			"}\n", 
-			true, null);
-			
-			IPackageFragment importUse= fRoot.createPackageFragment("import_use", true, null);
-			importUse.createCompilationUnit("List.java",
-			"package import_use;" +
-			"" +
-			"public class List {" +
-			"}", 
-			true, null);
-			
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		RefactoringTest.performDummySearch(fJavaProject);
-		JavaProjectHelper.delete(fJavaProject);
-	}
-	
-	public IPackageFragment getInvalidPackage() {
-		return fInvalid;
-	}
-
-	public IPackageFragment getSimplePackage() {
-		return fSimple;
-	}
-
-	public IPackageFragment getArgumentPackage() {
-		return fArgument;
-	}
-
-	public IPackageFragment getNameConflictPackage() {
-		return fNameConflict;
-	}
-
-	public IPackageFragment getCallPackage() {
-		return fCall;
-	}
-
-	public IPackageFragment getExpressionPackage() {
-		return fExpression;
-	}
-	
-	public IPackageFragment getControlStatementPackage() {
-		return fControlStatement;
-	}
-	
-	public IPackageFragment getReceiverPackage() {
-		return fReceiver;
-	}
-	
-	public IPackageFragment getImportPackage() {
-		return fImport;
-	}	
-
-	public IPackageFragment getCastPackage() {
-		return fCast;
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests.java
deleted file mode 100644
index cd42ba7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests.java
+++ /dev/null
@@ -1,505 +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
- *     Dmitry Stalnov (dstalnov@fusionone.com) - contributed fixes for:
- *       o bug "inline method - doesn't handle implicit cast" (see
- *         https://bugs.eclipse.org/bugs/show_bug.cgi?id=24941).
- *       o bug inline method: compile error (array related) [refactoring] 
- *         (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=38471)
- * 	     o bug "Inline refactoring showed bogus error" (see bugzilla
- *         https://bugs.eclipse.org/bugs/show_bug.cgi?id=42753)
- *       o inline call that is used in a field initializer 
- *         (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=38137)
- *       o inline call a field initializer: could detect self reference 
- *         (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=44417)
- *       o Allow 'this' constructor to be inlined  
- *         (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=38093)
- *******************************************************************************/
-package org.eclipse.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-import org.eclipse.jdt.internal.corext.refactoring.code.InlineMethodRefactoring;
-
-public class InlineMethodTests extends AbstractSelectionTestCase {
-
-	private static InlineMethodTestSetup fgTestSetup;
-	
-	public InlineMethodTests(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		fgTestSetup= new InlineMethodTestSetup(new TestSuite(InlineMethodTests.class));
-		return fgTestSetup;
-	}
-	
-	protected String getResourceLocation() {
-		return "InlineMethodWorkspace/TestCases/";
-	}
-	
-	protected String adaptName(String name) {
-		return Character.toUpperCase(name.charAt(0)) + name.substring(1) + ".java";
-	}
-	
-	protected void performTest(IPackageFragment packageFragment, String id, int mode, String outputFolder) throws Exception {
-		ICompilationUnit unit= createCU(packageFragment, id);
-		String source= unit.getSource();
-		int[] selection= getSelection(source);
-		InlineMethodRefactoring refactoring= InlineMethodRefactoring.create(
-			unit, selection[0], selection[1],
-			JavaPreferencesSettings.getCodeGenerationSettings());
-		refactoring.setSaveChanges(true);
-		String out= null;
-		switch (mode) {
-			case COMPARE_WITH_OUTPUT:
-				out= getProofedContent(outputFolder, id);
-				break;		
-		}
-		performTest(unit, refactoring, mode, out);
-	}
-
-	/************************ Invalid Tests ********************************/
-		
-	protected void performInvalidTest() throws Exception {
-		performTest(fgTestSetup.getInvalidPackage(), getName(), INVALID_SELECTION, null);
-	}
-	
-	public void testRecursion() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testInvalidFieldInitializer1() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testInvalidFieldInitializer2() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testInvalidFieldInitializer3() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testLocalInitializer() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testInterruptedStatement() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testMultiLocal() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testComplexBody() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testCompileError1() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testCompileError2() throws Exception {
-		performInvalidTest();
-	}
-	
-	public void testCompileError3() throws Exception {
-		performInvalidTest();
-	}
-	
-	/************************ Simple Tests ********************************/
-		
-	private void performSimpleTest() throws Exception {
-		performTest(fgTestSetup.getSimplePackage(), getName(), COMPARE_WITH_OUTPUT, "simple_out");
-	}
-	
-	public void testBasic1() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testBasic2() throws Exception {
-		performSimpleTest();
-	}	
-	
-	public void testEmptyBody() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testPrimitiveArray() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testTypeArray() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testInitializer() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testSuper() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testFieldInitializer1() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testFieldInitializer2() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testLabeledStatement() throws Exception {
-		performSimpleTest();
-	}	
-
-	public void testConstructor1() throws Exception {
-		performSimpleTest();
-	}	
-
-	/************************ Argument Tests ********************************/
-		
-	private void performArgumentTest() throws Exception {
-		performTest(fgTestSetup.getArgumentPackage(), getName(), COMPARE_WITH_OUTPUT, "argument_out");
-	}
-	
-	public void testFieldReference() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testLocalReferenceUnused() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testLocalReferenceRead() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testLocalReferenceRead2() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testLocalReferenceWrite() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testLocalReferenceLoop() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testLocalReferencePrefix() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testLiteralReferenceRead() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testLiteralReferenceWrite() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testParameterNameUsed1() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testParameterNameUsed2() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testParameterNameUsed3() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testParameterNameUsed4() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testParameterNameUnused1() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testParameterNameUnused2() throws Exception {
-		performArgumentTest();
-	}	
-	
-	public void testParameterNameUnused3() throws Exception {
-		performArgumentTest();
-	}
-	
-	public void testOneRead() throws Exception {
-		performArgumentTest();
-	}
-	
-	public void testTwoReads() throws Exception {
-		performArgumentTest();
-	}
-	
-	public void testWrite() throws Exception {
-		performArgumentTest();
-	}
-	
-	public void testArray() throws Exception {
-		performArgumentTest();
-	}
-	
-	/************************ Name Conflict Tests ********************************/
-		
-	private void performNameConflictTest() throws Exception {
-		performTest(fgTestSetup.getNameConflictPackage(), getName(), COMPARE_WITH_OUTPUT, "nameconflict_out");
-	}
-	
-	public void testSameLocal() throws Exception {
-		performNameConflictTest();
-	}
-	
-	public void testSameType() throws Exception {
-		performNameConflictTest();
-	}
-	
-	public void testSameTypeAfter() throws Exception {
-		performNameConflictTest();
-	}
-	
-	public void testSameTypeInSibling() throws Exception {
-		performNameConflictTest();
-	}
-	
-	public void testLocalInType() throws Exception {
-		performNameConflictTest();
-	}
-	
-	public void testFieldInType() throws Exception {
-		performNameConflictTest();
-	}
-
-	public void testSwitchStatement() throws Exception {
-		performNameConflictTest();
-	}
-
-	public void testBlocks() throws Exception {
-		performNameConflictTest();
-	}
-
-	/************************ Call Tests ********************************/
-		
-	private void performCallTest() throws Exception {
-		performTest(fgTestSetup.getCallPackage(), getName(), COMPARE_WITH_OUTPUT, "call_out");
-	}
-	
-	public void testExpressionStatement() throws Exception {
-		performCallTest();
-	}
-
-	public void testExpressionStatementWithReturn() throws Exception {
-		performCallTest();
-	}
-	
-	public void testStatementWithFunction1() throws Exception {
-		performCallTest();
-	}
-	
-	public void testStatementWithFunction2() throws Exception {
-		performCallTest();
-	}
-	
-	public void testParenthesis() throws Exception {
-		performCallTest();
-	}
-	
-	/************************ Expression Tests ********************************/
-		
-	private void performExpressionTest() throws Exception {
-		performTest(fgTestSetup.getExpressionPackage(), getName(), COMPARE_WITH_OUTPUT, "expression_out");
-	}
-	
-	public void testSimpleExpression() throws Exception {
-		performExpressionTest();
-	}
-	
-	public void testSimpleExpressionWithStatements() throws Exception {
-		performExpressionTest();
-	}
-	
-	public void testSimpleBody() throws Exception {
-		performExpressionTest();
-	}
-	
-	public void testAssignment() throws Exception {
-		performExpressionTest();
-	}
-	
-	public void testReturnStatement() throws Exception {
-		performExpressionTest();
-	}
-	
-	/************************ Control Statements Tests ********************************/
-		
-	private void performControlStatementTest() throws Exception {
-		performTest(fgTestSetup.getControlStatementPackage(), getName(), COMPARE_WITH_OUTPUT, "controlStatement_out");
-	}
-	
-	public void testForEmpty() throws Exception {
-		performControlStatementTest();
-	}
-	
-	public void testForOne() throws Exception {
-		performControlStatementTest();
-	}
-	
-	public void testForTwo() throws Exception {
-		performControlStatementTest();
-	}
-	
-	public void testIfThenTwo() throws Exception {
-		performControlStatementTest();
-	}
-	
-	public void testIfElseTwo() throws Exception {
-		performControlStatementTest();
-	}
-	
-	public void testForAssignmentOne() throws Exception {
-		performControlStatementTest();
-	}
-	
-	public void testForAssignmentTwo() throws Exception {
-		performControlStatementTest();
-	}
-
-	/************************ Receiver Tests ********************************/
-		
-	private void performReceiverTest() throws Exception {
-		performTest(fgTestSetup.getReceiverPackage(), getName(), COMPARE_WITH_OUTPUT, "receiver_out");
-	}
-	
-	public void testNoImplicitReceiver() throws Exception {
-		performReceiverTest();
-	}
-
-	public void testNameThisReceiver() throws Exception {
-		performReceiverTest();
-	}
-
-	public void testNameImplicitReceiver() throws Exception {
-		performReceiverTest();
-	}
-
-	public void testExpressionZeroImplicitReceiver() throws Exception {
-		performReceiverTest();
-	}
-
-	public void testExpressionOneImplicitReceiver() throws Exception {
-		performReceiverTest();
-	}
-
-	public void testExpressionTwoImplicitReceiver() throws Exception {
-		performReceiverTest();
-	}
-
-	public void testStaticReceiver() throws Exception {
-		performReceiverTest();
-	}
-
-	public void testReceiverWithStatic() throws Exception {
-		performReceiverTest();
-	}
-	
-	public void testThisExpression() throws Exception {
-		performReceiverTest();
-	}
-	
-	/************************ Import Tests ********************************/
-		
-	private void performImportTest() throws Exception {
-		performTest(fgTestSetup.getImportPackage(), getName(), COMPARE_WITH_OUTPUT, "import_out");
-	}
-		
-	public void testUseArray() throws Exception {
-		performImportTest();
-	}	
-		
-	public void testUseInArgument() throws Exception {
-		performImportTest();
-	}	
-		
-	public void testUseInClassLiteral() throws Exception {
-		performImportTest();
-	}	
-		
-	public void testUseInDecl() throws Exception {
-		performImportTest();
-	}	
-		
-	public void testUseInDecl2() throws Exception {
-		performImportTest();
-	}	
-		
-	public void testUseInDecl3() throws Exception {
-		performImportTest();
-	}	
-		
-	public void testUseInDeclClash() throws Exception {
-		performImportTest();
-	}	
-		
-	public void testUseInLocalClass() throws Exception {
-		performImportTest();
-	}	
-
-	/************************ Cast Tests ********************************/
-
-	private void performCastTest() throws Exception {
-		performTest(fgTestSetup.getCastPackage(), getName(), COMPARE_WITH_OUTPUT, "cast_out");
-	}
-	
-	public void testNotOverloaded() throws Exception {
-		performCastTest();
-	}
-
-	public void testOverloadedPrimitives() throws Exception {
-		performCastTest();
-	}
-
-	public void testNotCastableOverloaded() throws Exception {
-		performCastTest();
-	}
-
-	public void testOverloaded() throws Exception {
-		performCastTest();
-	}
-
-	public void testHierarchyOverloadedPrimitives() throws Exception {
-		performCastTest();
-	}
-
-	public void testHierarchyOverloaded() throws Exception {
-		performCastTest();
-	}
-
-	public void testHierarchyOverloadedPrivate() throws Exception {
-		performCastTest();
-	}
-
-	public void testReceiverCast() throws Exception {
-		performCastTest();
-	}
-	
-	public void testNoCast() throws Exception {
-		performCastTest();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineTempTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineTempTests.java
deleted file mode 100644
index c41b843..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineTempTests.java
+++ /dev/null
@@ -1,297 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-import org.eclipse.jdt.internal.corext.SourceRange;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.code.InlineTempRefactoring;
-
-public class InlineTempTests extends RefactoringTest {
-
-	private static final Class clazz= InlineTempTests.class;
-	private static final String REFACTORING_PATH= "InlineTemp/";
-	
-	public InlineTempTests(String name) {
-		super(name);
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private String getSimpleTestFileName(boolean canInline, boolean input){
-		String fileName = "A_" + getName();
-		if (canInline)
-			fileName += input ? "_in": "_out";
-		return fileName + ".java"; 
-	}
-	
-	private String getTestFileName(boolean canInline, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += (canInline ? "canInline/": "cannotInline/");
-		return fileName + getSimpleTestFileName(canInline, input);
-	}
-	
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canInline, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(canInline, input), getFileContents(getTestFileName(canInline, input)));
-	}
-	
-	private ISourceRange getSelection(ICompilationUnit cu) throws Exception{
-		String source= cu.getSource();
-		int offset= source.indexOf(AbstractSelectionTestCase.SQUARE_BRACKET_OPEN);
-		int end= source.indexOf(AbstractSelectionTestCase.SQUARE_BRACKET_CLOSE);
-		return new SourceRange(offset, end - offset);
-	}
-	
-	private void helper1(ICompilationUnit cu, ISourceRange selection) throws Exception{
-		InlineTempRefactoring ref= InlineTempRefactoring.create(cu, selection.getOffset(), selection.getLength());
-		
-		RefactoringStatus result= performRefactoring(ref);
-		assertEquals("precondition was supposed to pass", null, result);
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		assertEqualLines("incorrect inlining", getFileContents(getTestFileName(true, false)), newcu.getSource());
-	}
-	
-	private void helper1(int startLine, int startColumn, int endLine, int endColumn) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		helper1(cu, selection);
-	}
-		
-	private void helper2() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);
-		helper2(cu, getSelection(cu));
-	}
-	
-	private void helper2(ICompilationUnit cu, ISourceRange selection) throws Exception{
-		InlineTempRefactoring ref= InlineTempRefactoring.create(cu, selection.getOffset(), selection.getLength());
-		
-		if (ref != null){
-			RefactoringStatus result= performRefactoring(ref);
-			assertNotNull("precondition was supposed to fail", result);		
-		}
-	}
-	
-	private void helper2(int startLine, int startColumn, int endLine, int endColumn) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		helper2(cu, selection);
-	}
-	
-	
-	//--- tests 
-	
-	public void test0() throws Exception{
-		helper1(4, 9, 4, 18);
-	}
-
-	public void test1() throws Exception{
-		helper1(4, 9, 4, 18);
-	}
-
-	public void test2() throws Exception{
-		helper1(4, 9, 4, 18);
-	}
-	
-	public void test3() throws Exception{
-		helper1(4, 9, 4, 22);
-	}
-
-	public void test4() throws Exception{
-		helper1(4, 9, 4, 22);
-	}
-
-	public void test5() throws Exception{
-		helper1(4, 9, 4, 22);
-	}
-
-	public void test6() throws Exception{
-		//printTestDisabledMessage("bug#6429 declaration source start incorrect on local variable");
-		helper1(9, 13, 9, 14);
-	}
-
-	public void test7() throws Exception{
-		helper1(9, 9, 9, 18);
-	}
-	
-	public void test8() throws Exception{
-		//printTestDisabledMessage("bug#6429 declaration source start incorrect on local variable");
-		helper1(5, 13, 5, 14);
-	}
-	
-	public void test9() throws Exception{
-		helper1(5, 9, 5, 21);
-	}
-	
-	public void test10() throws Exception{
-//		printTestDisabledMessage("regression test for bug#9001");
-		helper1(4, 21, 4, 25);
-	}
-	
-	public void test11() throws Exception{
-		helper1(5, 21, 5, 25);
-	}	
-
-	public void test12() throws Exception{
-		helper1(5, 15, 5, 19);
-	}	
-
-	public void test13() throws Exception{
-		helper1(5, 17, 5, 18);
-	}	
-	
-	public void test14() throws Exception{
-		printTestDisabledMessage("regression for bug 11664");		
-//		helper1(4, 13, 4, 14);
-	}	
-	
-	public void test15() throws Exception{
-		printTestDisabledMessage("regression for bug 11664");		
-//		helper1(4, 19, 4, 20);
-	}	
-	
-	public void test16() throws Exception{
-//		printTestDisabledMessage("regression test for 10751");		
-		helper1(5, 17, 5, 24);
-	}	
-	
-	public void test17() throws Exception{
-//		printTestDisabledMessage("regression test for 12200");		
-		helper1(8, 18, 8, 21);
-	}	
-
-	public void test18() throws Exception{
-//		printTestDisabledMessage("regression test for 12200");		
-		helper1(6, 18, 6, 21);
-	}	
-
-	public void test19() throws Exception{
-//		printTestDisabledMessage("regression test for 12212");		
-		helper1(6, 19, 6, 19);
-	}	
-
-	public void test20() throws Exception{
-//		printTestDisabledMessage("regression test for 16054");		
-		helper1(4, 17, 4, 18);
-	}	
-
-	public void test21() throws Exception{
-//		printTestDisabledMessage("regression test for 17479");		
-		helper1(6, 20, 6, 25);
-	}	
-
-	public void test22() throws Exception{
-//		printTestDisabledMessage("regression test for 18284");		
-		helper1(5, 13, 5, 17);
-	}	
-
-	public void test23() throws Exception{
-//		printTestDisabledMessage("regression test for 22938");		
-		helper1(5, 16, 5, 20);
-	}	
-
-	public void test24() throws Exception{
-//		printTestDisabledMessage("regression test for 26242");		
-		helper1(5, 19, 5, 24);
-	}	
-
-	public void test25() throws Exception{
-//		printTestDisabledMessage("regression test for 26242");		
-		helper1(5, 19, 5, 24);
-	}	
-
-	//------
-	
-	public void testFail0() throws Exception{
-		printTestDisabledMessage("compile errors are ok now");
-//		helper2();
-	}
-
-	public void testFail1() throws Exception{
-		helper2();
-	}
-
-	public void testFail2() throws Exception{
-		helper2();
-	}
-
-	public void testFail3() throws Exception{
-		helper2();
-	}
-
-	public void testFail4() throws Exception{
-		helper2();
-	}
-
-	public void testFail5() throws Exception{
-		helper2();
-	}
-
-	public void testFail6() throws Exception{
-		helper2();
-	}
-
-	public void testFail7() throws Exception{
-		helper2();
-	}
-
-	public void testFail8() throws Exception{
-		helper2();
-	}
-
-	public void testFail9() throws Exception{
-		//test for 16737
-		helper2(3, 9, 3, 13);
-	}
-
-	public void testFail10() throws Exception{
-		//test for 16737
-		helper2(3, 5, 3, 17);
-	}
-
-	public void testFail11() throws Exception{
-		//test for 17253
-		helper2(8, 14, 8, 18);
-	}
-	
-	public void testFail12() throws Exception{
-		//test for 19851
-		helper2(10, 16, 10, 19);
-	}
-
-	public void testFail13() throws Exception{
-//		printTestDisabledMessage("12106");
-		helper2(4, 18, 4, 19);
-	}
-
-	public void testFail14() throws Exception{
-//		printTestDisabledMessage("22632");
-		helper2(4, 8, 4, 11);
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests.java
deleted file mode 100644
index 1433707..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests.java
+++ /dev/null
@@ -1,514 +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.jdt.ui.tests.refactoring;
-
-import java.io.IOException;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.internal.corext.SourceRange;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.code.IntroduceFactoryRefactoring;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-/**
- * @author rfuhrer@watson.ibm.com
- */
-public class IntroduceFactoryTests extends RefactoringTest {
-	
-	private static final Class clazz= IntroduceFactoryTests.class;
-	private static final String REFACTORING_PATH= "IntroduceFactory/";
-
-	public IntroduceFactoryTests(String name) {
-		super(name);
-	} 
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	/**
-	 * Produces a test file name based on the name of this JUnit testcase.
-	 * For input files, trims off the trailing part of the test name that
-	 * begins with a '_', to get rid of the options part, so that we can
-	 * have a single (suite of) input file(s) but several outputs dependent
-	 * on the option settings.
-	 * @param input true iff the requested file is an input file.
-	 * @return the name of the test file, with a trailing "_in.java" if an input
-	 * file and a trailing "_XXX.java" if an output file and the test name/options
-	 * are "_XXX".
-	 */
-	private String getSimpleTestFileName(boolean input) {
-		String	testName = getName();
-		int		usIdx=  testName.indexOf('_'); 
-		int		endIdx= (usIdx >= 0) ? usIdx : testName.length();
-		String	fileName = (input ? (testName.substring(4, endIdx) + "_in") : testName.substring(4));
-
-		return fileName + ".java";
-	}
-
-	/**
-	 * Produces a test file name based on the name of this JUnit testcase,
-	 * like getSimpleTestFileName(), but also prepends the appropriate version
-	 * of the resource path (depending on the value of <code>positive</code>).
-	 * Test files are assumed to be located in the resources directory.
-	 * @param positive true iff the requested file is for a positive unit test
-	 * @param input true iff the requested file is an input file
-	 * @see getSimpleTestFileName(boolean input)
-	 */
-	private String getTestFileName(boolean positive, boolean input) {
-		String path= TEST_PATH_PREFIX + getRefactoringPath();
-
-		path += (positive ? "positive/": "negative/");
-		return path + getSimpleTestFileName(input);
-	}
-
-	/**
-	 * Produces a compilation unit from an input source file whose name
-	 * is based on the testcase name.
-	 * Test files are assumed to be located in the resources directory.
-	 * @param pack
-	 * @param positive
-	 * @param input
-	 * @return the ICompilationUnit created from the specified test file
-	 * @see getTestFileName()
-	 */
-	private ICompilationUnit createCUForSimpleTest(IPackageFragment pack,
-												  boolean positive, boolean input)
-		throws Exception
-	{
-		String	fileName= getTestFileName(positive, input);
-		String	cuName= getSimpleTestFileName(input);
-
-		return createCU(pack, cuName, getFileContents(fileName));
-	}
-
-	/**
-	 * Produces a test file name based on the name of this JUnit testcase,
-	 * like getSimpleTestFileName(), but also prepends the appropriate version
-	 * of the resource path (depending on the value of <code>positive</code>).
-	 * Test files are assumed to be located in the resources directory.
-	 * @param positive true iff the requested file is for a positive unit test
-	 * @param input true iff the requested file is an input file
-	 * @see getSimpleTestFileName(boolean input)
-	 */
-	private String getBugTestFileName(IPackageFragment pack, String fileName, boolean input) {
-		String testName= getName();
-		String testNumber= testName.substring("test".length());//$NON-NLS-1$
-		String path= TEST_PATH_PREFIX + getRefactoringPath() + "Bugzilla/" + testNumber + "/" +
-									(pack == getPackageP() ? "" : pack.getElementName() + "/");
-
-		return path + fileName + (input ? "" : "_out") + ".java";//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	/**
-	 * Produces a compilation unit from an input source file whose path
-	 * is based on the testcase name, but whose basename is supplied by
-	 * the caller.
-	 * Test files are assumed to be located in the resources directory.
-	 * @param pack
-	 * @param baseName
-	 * @param input
-	 * @return the ICompilationUnit created from the specified test file
-	 * @see getTestFileName()
-	 */
-	private ICompilationUnit createCUForBugTestCase(IPackageFragment pack,
-													String baseName, boolean input)
-		throws Exception
-	{
-		String	fileName= getBugTestFileName(pack, baseName, input);
-		String	cuName= baseName + (input ? "" : "_out") + ".java";
-
-		return createCU(pack, cuName, getFileContents(fileName));
-	}
-
-	static final String SELECTION_START_HERALD= "/*[*/";
-	static final String SELECTION_END_HERALD= "/*]*/";
-
-	/**
-	 * Finds and returns the selection markers in the given source string,
-	 * i.e. the first occurrences of <code>SELECTION_START_HERALD</code> and
-	 * <code>SELECTION_END_HERALD</code>. Fails an assertion if either of these
-	 * markers is not present in the source string.
-	 * @return an ISourceRange representing the marked selection
-	 */
-	private ISourceRange findSelectionInSource(String source) throws Exception {
-		int		begin= source.indexOf(SELECTION_START_HERALD) + SELECTION_START_HERALD.length();
-		int		end= source.indexOf(SELECTION_END_HERALD);
-
-		if (begin < SELECTION_START_HERALD.length())
-			assertTrue("No selection start comment in input source file!", false);
-		if (end < 0)
-			assertTrue("No selection end comment in input source file!", false);
-
-		return new SourceRange(begin, end-begin);
-	}
-
-	private void doSingleUnitTest(boolean protectConstructor, ICompilationUnit cu, String outputFileName) throws Exception, JavaModelException, IOException {
-		ISourceRange		selection= findSelectionInSource(cu.getSource());
-		IntroduceFactoryRefactoring	ref= IntroduceFactoryRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-												   JavaPreferencesSettings.getCodeGenerationSettings());
-
-		ref.setProtectConstructor(protectConstructor);
-
-		RefactoringStatus	activationResult= ref.checkActivation(new NullProgressMonitor());	
-
-		assertTrue("activation was supposed to be successful", activationResult.isOK());																
-
-		RefactoringStatus	checkInputResult= ref.checkInput(new NullProgressMonitor());
-
-		if (!checkInputResult.isOK()) {
-			performChange(ref.createChange(new NullProgressMonitor()));
-
-			String newSource = cu.getSource();
-
-			System.err.println("!!!Precondition failed for " + getName() + "!!!");
-			System.err.println("Compile-time error: " + checkInputResult.toString());
-			System.err.println("Offending source:");
-			System.err.print(newSource);
-			assertTrue("precondition was supposed to pass but was " + checkInputResult.toString(), false);
-		}
-
-		performChange(ref.createChange(new NullProgressMonitor()));
-
-		String newSource = cu.getSource();
-
-		assertEqualLines(getName() + ": ", newSource, getFileContents(outputFileName));
-	}
-
-	/**
-	 * Tests the IntroduceFactoryRefactoring refactoring on a single input source file
-	 * whose name is the test name (minus the "test" prefix and any trailing
-	 * options indicator such as "_FFF"), and compares the transformed code
-	 * to a source file whose name is the test name (minus the "test" prefix).
-	 * Test files are assumed to be located in the resources directory.
-	 * @param staticFactoryMethod true iff IntroduceFactoryRefactoring should make the factory method static
-	 * @param protectConstructor true iff IntroduceFactoryRefactoring should make the constructor private
-	 * @see getTestFileName()
-	 */
-	void singleUnitHelper(boolean protectConstructor)
-		throws Exception
-	{
-		ICompilationUnit	cu= createCUForSimpleTest(getPackageP(), true, true);
-
-		doSingleUnitTest(protectConstructor, cu, getTestFileName(true, false));
-	}
-
-	/**
-	 * Tests the IntroduceFactoryRefactoring refactoring on a single input source file
-	 * whose name is the test name (minus the "test" prefix and any trailing
-	 * options indicator such as "_FFF"), and compares the transformed code
-	 * to a source file whose name is the test name (minus the "test" prefix).
-	 * Test files are assumed to be located in the resources directory.
-	 * @param staticFactoryMethod true iff IntroduceFactoryRefactoring should make the factory method static
-	 * @param protectConstructor true iff IntroduceFactoryRefactoring should make the constructor private
-	 * @see getTestFileName()
-	 */
-	protected void singleUnitBugHelper(String baseFileName, boolean protectConstructor)
-		throws Exception
-	{
-		ICompilationUnit	cu= createCUForBugTestCase(getPackageP(), baseFileName, true);
-
-		doSingleUnitTest(protectConstructor, cu, getBugTestFileName(getPackageP(), baseFileName, false));
-	}
-
-	/**
-	 * Like singleUnitHelper(), but allows for the specification of the names of
-	 * the generated factory method, class, and interface, as appropriate.
-	 * @param staticFactoryMethod true iff IntroduceFactoryRefactoring should make the factory method static
-	 * @param factoryMethodName the name to use for the generated factory method
-	 * @see singleUnitHelper()
-	 */
-	void namesHelper(String factoryMethodName)
-		throws Exception
-	{
-		ICompilationUnit	cu= createCUForSimpleTest(getPackageP(), true, true);
-		ISourceRange		selection= findSelectionInSource(cu.getSource());
-		IntroduceFactoryRefactoring	ref= IntroduceFactoryRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-												   JavaPreferencesSettings.getCodeGenerationSettings());
-
-		RefactoringStatus	activationResult= ref.checkActivation(new NullProgressMonitor());	
-
-		assertTrue("activation was supposed to be successful", activationResult.isOK());																
-
-		ref.setNewMethodName(factoryMethodName);
-
-		RefactoringStatus	checkInputResult= ref.checkInput(new NullProgressMonitor());
-
-		assertTrue("precondition was supposed to pass but was " + checkInputResult.toString(), checkInputResult.isOK());
-
-		performChange(ref.createChange(new NullProgressMonitor()));
-
-		String newSource = cu.getSource();
-
-		assertEqualLines(getName() + ": ", newSource, getFileContents(getTestFileName(true, false)));
-	}
-
-	/**
-	 * Creates a compilation unit for a source file with a given base name (plus
-	 * "_in" suffix) in the given package. The source file is assumed to be
-	 * located in the test resources directory.<br>
-	 * Currently only handles positive tests.
-	 * @param fileName the base name of the source file (minus the "_in" suffix)
-	 * @param pack an IPackageFragment for the containing package
-	 * @return the ICompilationUnit for the newly-created unit
-	 */
-	private ICompilationUnit createCUFromFileName(String fileName, IPackageFragment pack) throws Exception {
-		String fullName = TEST_PATH_PREFIX + getRefactoringPath() + "positive/" + fileName + "_in.java";
-
-		return createCU(pack, fileName + "_in.java", getFileContents(fullName));
-	}
-
-	private void doMultiUnitTest(ICompilationUnit[] CUs, String testPath, String[] outputFileBaseNames) throws Exception, JavaModelException, IOException {
-		ISourceRange		selection= findSelectionInSource(CUs[0].getSource());
-		IntroduceFactoryRefactoring	ref= IntroduceFactoryRefactoring.create(CUs[0], selection.getOffset(), selection.getLength(), 
-												   JavaPreferencesSettings.getCodeGenerationSettings());
-
-		RefactoringStatus	activationResult= ref.checkActivation(new NullProgressMonitor());
-
-		assertTrue("activation was supposed to be successful", activationResult.isOK());																
-
-		RefactoringStatus	checkInputResult= ref.checkInput(new NullProgressMonitor());
-
-		assertTrue("precondition was supposed to pass but was " + checkInputResult.toString(), checkInputResult.isOK());
-
-		performChange(ref.createChange(new NullProgressMonitor()));
-
-		String	testName= getName();
-
-		for (int i = 0; i < CUs.length; i++) {
-			int		optIdx= testName.indexOf("_");
-			String	testOptions= (optIdx >= 0) ? testName.substring(optIdx) : "";
-			String	outFileName= testPath + outputFileBaseNames[i] + testOptions + "_out.java";
-			String	newSource= CUs[i].getSource();
-
-			assertEqualLines(getName() + ": ", newSource, getFileContents(outFileName));
-		}
-	}
-
-	/**
-	 * Tests the IntroduceFactoryRefactoring refactoring on a set of input source files
-	 * whose names are supplied in the <code>fileBaseNames</code> argument,
-	 * and compares the transformed code to source files whose names are 
-	 * the input base names plus the options suffix (e.g. "_FFF").
-	 * Test files are assumed to be located in the resources directory.
-	 * @param staticFactoryMethod true iff IntroduceFactoryRefactoring should make the factory method static
-	 * @param inputFileBaseNames an array of input source file base names
-	 * @see createCUFromFileName()
-	 */
-	void multiUnitHelper(boolean staticFactoryMethod, String[] inputFileBaseNames)
-		throws Exception
-	{
-		IPackageFragment	pkg= getPackageP();
-		ICompilationUnit	CUs[]= new ICompilationUnit[inputFileBaseNames.length];
-
-		for (int i = 0; i < inputFileBaseNames.length; i++)
-			CUs[i] = createCUFromFileName(inputFileBaseNames[i], pkg);
-
-		String	testPath= TEST_PATH_PREFIX + getRefactoringPath() + "positive/";
-
-		doMultiUnitTest(CUs, testPath, inputFileBaseNames);
-	}
-
-	/**
-	 * Tests the IntroduceFactoryRefactoring refactoring on a set of input source files
-	 * whose names are supplied in the <code>fileBaseNames</code> argument,
-	 * and compares the transformed code to source files whose names are 
-	 * the input base names plus the options suffix (e.g. "_FFF").
-	 * Test files are assumed to be located in the resources directory.
-	 * @param staticFactoryMethod true iff IntroduceFactoryRefactoring should make the factory method static
-	 * @param inputFileBaseNames an array of input source file base names
-	 * @see createCUFromFileName()
-	 */
-	void multiUnitBugHelper(boolean staticFactoryMethod, String[] inputFileBaseNames)
-		throws Exception
-	{
-		ICompilationUnit CUs[]= new ICompilationUnit[inputFileBaseNames.length];
-
-		for (int i = 0; i < inputFileBaseNames.length; i++) {
-			int pkgEnd= inputFileBaseNames[i].lastIndexOf('/')+1;
-			boolean explicitPkg= (pkgEnd > 0);
-			IPackageFragment pkg= explicitPkg ? getRoot().createPackageFragment(inputFileBaseNames[i].substring(0, pkgEnd-1), true, new NullProgressMonitor()) : getPackageP();
-
-			CUs[i] = createCUForBugTestCase(pkg, inputFileBaseNames[i].substring(pkgEnd), true);
-		}
-
-		String	testName= getName();
-		String	testNumber= testName.substring("test".length());
-		String	testPath= TEST_PATH_PREFIX + getRefactoringPath() + "Bugzilla/" + testNumber + "/";
-
-		doMultiUnitTest(CUs, testPath, inputFileBaseNames);
-	}
-
-	private void failHelper(boolean staticFactory, int expectedStatus) throws Exception {
-		ICompilationUnit	cu= createCUForSimpleTest(getPackageP(), false, true);
-		ISourceRange		selection= findSelectionInSource(cu.getSource());
-		IntroduceFactoryRefactoring	ref= IntroduceFactoryRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-												   JavaPreferencesSettings.getCodeGenerationSettings());
-		RefactoringStatus	result= performRefactoring(ref);
-
-		assertNotNull("precondition was supposed to fail", result);
-		assertEquals("status", expectedStatus, result.getSeverity());
-	}	
-
-	private void failBugHelper(String baseFileName, boolean staticFactory, int expectedStatus) throws Exception {
-		ICompilationUnit	cu= createCUForBugTestCase(getPackageP(), baseFileName, true);
-		ISourceRange		selection= findSelectionInSource(cu.getSource());
-		IntroduceFactoryRefactoring	ref= IntroduceFactoryRefactoring.create(cu, selection.getOffset(), selection.getLength(), 
-				JavaPreferencesSettings.getCodeGenerationSettings());
-		RefactoringStatus	result= performRefactoring(ref);
-
-		assertNotNull("precondition was supposed to fail", result);
-		assertEquals("status", expectedStatus, result.getSeverity());
-	}	
-
-	//--- TESTS
-	public void testStaticContext_FFF() throws Exception {
-		singleUnitHelper(false);
-	}
-	//
-	// ================================================================================
-	//
-	public void testInstanceContext_FFF() throws Exception {
-		singleUnitHelper(false);
-	}
-	//
-	// ================================================================================
-	//
-	static final String[]	k_Names = { "createThing", "ThingFactory", "IThingFactory" };
-
-	public void testNames_FFF() throws Exception {
-		namesHelper(k_Names[0]);
-	}
-	//
-	// ================================================================================
-	//
-	public void testMultipleCallers_FFF() throws Exception {
-		singleUnitHelper(false);
-	}
-	//
-	// ================================================================================
-	//
-	public void testSelectConstructor() throws Exception {
-		singleUnitHelper(false);
-	}
-	//
-	// ================================================================================
-	//
-	public void testDifferentSigs() throws Exception {
-		singleUnitHelper(false);
-	}
-
-	public void testDifferentArgs1() throws Exception {
-		singleUnitHelper(false);
-	}
-
-	public void testDifferentArgs2() throws Exception {
-		singleUnitHelper(false);
-	}
-
-	public void testDifferentArgs3() throws Exception {
-		singleUnitHelper(false);
-	}
-	//
-	// ================================================================================
-	//
-	public void testUnmovableArg1() throws Exception {
-		singleUnitHelper(false);
-	}
-
-	public void testUnmovableArg2() throws Exception {
-		singleUnitHelper(false);
-	}
-
-	public void testDontMoveArgs1() throws Exception {
-		singleUnitHelper(false);
-	}
-
-	public void testDontMoveArgs2() throws Exception {
-		singleUnitHelper(false);
-	}
-	//
-	// ================================================================================
-	//
-	public void testProtectConstructor1() throws Exception {
-		singleUnitHelper(true);
-	}
-
-	public void testProtectConstructor2() throws Exception {
-		singleUnitHelper(true);
-	}
-	//
-	// ================================================================================
-	//
-	public void testStaticInstance() throws Exception {
-		singleUnitHelper(false);
-	}
-	//
-	// ================================================================================
-	//
-	public void testCtorThrows() throws Exception {
-		singleUnitHelper(true);
-	}
-	//
-	// ================================================================================
-	//
-	public void testNestedClass() throws Exception {
-		failHelper(false, RefactoringStatus.FATAL);
-	}
-	//
-	// ================================================================================
-	//
-	public void testMultipleUnits_FFF() throws Exception {
-		multiUnitHelper(false, new String[] { "MultiUnit1A", "MultiUnit1B", "MultiUnit1C" });
-	}
-	//
-	// ================================================================================
-	// Bugzilla bug regression tests
-	// ================================================================================
-	//
-	public void test45942() throws Exception {
-		multiUnitBugHelper(true, new String[] { "TestClass", "UseTestClass" });
-	}
-
-	public void test46189() throws Exception {
-		singleUnitBugHelper("TestClass", true);
-	}
-
-	public void test46189B() throws Exception {
-		failBugHelper("TestClass", true, RefactoringStatus.FATAL);
-	}
-
-	public void test46373() throws Exception {
-		singleUnitBugHelper("ImplicitCtor", false);
-	}
-
-	public void test46374() throws Exception {
-		singleUnitBugHelper("QualifiedName", false);
-	}
-
-	public void test46608() throws Exception {
-		multiUnitBugHelper(true, new String[] { "p1/TT", "p2/TT" });
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceParameterTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceParameterTests.java
deleted file mode 100644
index 5ade5ff..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceParameterTests.java
+++ /dev/null
@@ -1,154 +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.jdt.ui.tests.refactoring;
-
-import java.util.StringTokenizer;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.code.IntroduceParameterRefactoring;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class IntroduceParameterTests extends LineColumnSelectionTestCase {
-
-	private static final String SLASH_OUT= "/out";
-	public IntroduceParameterTests(String name) {
-		super(name);
-	} 
-
-	/** for the JUnit Launcher */
-	public static Test suite() {
-		//TODO: re-runnable tests: setUp() should create project iff neccessary (circumvent TestDecorator "MySetup")
-		if (true) {
-			return new MySetup(new TestSuite(IntroduceParameterTests.class));
-		} else {
-			System.err.println("*** Running only parts of IntroduceParameterTests!");
-			TestSuite suite= new TestSuite();
-			suite.addTest(new IntroduceParameterTests("testSimple_StaticGetter1"));
-			return new MySetup(suite);
-		}
-	}
-	
-	protected String getResourceLocation() {
-		return "IntroduceParameter/";
-	}
-
-	/**
-	 * get names from comment in source "//name: guessedName -> nameToUse"
-	 * <br>relies on tabwidth == 4
-	 * @return {"guessedName", "nameToUse"} or null iff no name comment found
-	 */
-	private String[] getNames(ICompilationUnit cu) throws Exception {
-		String source= cu.getSource();
-		String name= "//name:";
-		int namStart= source.indexOf(name);
-		if (namStart == -1)
-			return null;
-
-		int dataStart= namStart + name.length();
-		StringTokenizer tokenizer= new StringTokenizer(source.substring(dataStart), " ->\t\r\n");
-		String[] result= {tokenizer.nextToken(), tokenizer.nextToken()};
-		return result;
-	}
-
-	private void performOK() throws Exception {
-		perform(RefactoringStatus.OK, RefactoringStatus.OK);
-	}
-
-	private void performInvalidSelection() throws Exception {
-		perform(RefactoringStatus.FATAL, RefactoringStatus.FATAL);
-	}
-
-	private void perform(int expectedActivationStatus, int expectedInputStatus) throws Exception {
-		String packageName= adaptPackage(getName());
-		IPackageFragment packageFragment= MySetup.getDefaultSourceFolder().createPackageFragment(packageName, true , null);
-		ICompilationUnit cu= createCU(packageFragment, getName());
-
-		ISourceRange selection= getSelection(cu);
-		IntroduceParameterRefactoring refactoring= IntroduceParameterRefactoring.create(
-			cu, selection.getOffset(), selection.getLength(),
-			JavaPreferencesSettings.getCodeGenerationSettings());		
-
-		NullProgressMonitor pm= new NullProgressMonitor();
-		RefactoringStatus status= refactoring.checkActivation(pm);
-		assertEquals("wrong activation status", expectedActivationStatus, status.getSeverity());
-		if (! status.isOK())
-			return;
-		
-		String[] names= getNames(cu);
-		if (names == null) {
-			refactoring.setParameterName(refactoring.guessedParameterName());
-		} else {
-			assertEquals("incorrectly guessed parameter name", names[0], refactoring.guessedParameterName());
-			refactoring.setParameterName(names[1]);
-		}
-
-		status.merge(refactoring.checkInput(pm));
-		assertEquals("wrong input status", expectedInputStatus, status.getSeverity());
-		if (status.getSeverity() == RefactoringStatus.FATAL)
-			return;
-		
-		String out= getProofedContent(packageName + SLASH_OUT, getName());
-		performTest(cu, refactoring, out);
-	}
-		
-// ---
-
-	public void testInvalid_NotInMethod1() throws Exception {
-		performInvalidSelection();
-	}
-	public void testInvalid_NotInMethod2() throws Exception {
-		performInvalidSelection();
-	}
-	public void testInvalid_NotInMethod3() throws Exception {
-		performInvalidSelection();
-	}
-
-	public void testInvalid_PartName1() throws Exception {
-		performInvalidSelection();
-	}
-
-	public void testInvalid_PartString() throws Exception {
-		performInvalidSelection();
-	}
-
-	//	---
-
-	public void testSimple_ConstantExpression1() throws Exception {
-		performOK();
-	}
-
-	public void testSimple_ConstantExpression2() throws Exception {
-		performOK();
-	}
-
-	public void testSimple_NewInstance1() throws Exception {
-		performOK();
-	}
-
-	public void testSimple_NewInstanceImport() throws Exception {
-		performOK();
-	}
-
-	public void testSimple_StaticGetter1() throws Exception {
-		performOK();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/LineColumnSelectionTestCase.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/LineColumnSelectionTestCase.java
deleted file mode 100644
index 4d4d802..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/LineColumnSelectionTestCase.java
+++ /dev/null
@@ -1,124 +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.jdt.ui.tests.refactoring;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.core.resources.IWorkspaceRunnable;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.AbstractCUTestCase;
-import org.eclipse.jdt.ui.tests.refactoring.infra.RefactoringTestPlugin;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-/**
- * Test Naming Convention:<p>
- * - testSimple_A() -> package 'simple', file 'A.java'; result in package 'simple.out'<br>
- * - testSuch_ALongName17() -> package 'such', file 'ALongName17.java'
- */
-public class LineColumnSelectionTestCase extends AbstractCUTestCase {
-
-	public LineColumnSelectionTestCase(String name) {
-		super(name);
-	}
-
-	protected InputStream getFileInputStream(String fileName) throws IOException {
-		return RefactoringTestPlugin.getDefault().getTestResourceStream(fileName);
-	}
-
-	/**
-	 * @param name e.g. "testSuch_ALongName17"
-	 * @return e.g. "ALongName17"
-	 */
-	protected String adaptName(String name) {
-		int separator= name.indexOf('_');
-		assertTrue(separator != -1);
-		assertTrue(separator >= 5);
-		return name.substring(separator + 1) + ".java";
-	}
-
-	/**
-	 * @param name e.g. "testSuch_ALongName17"
-	 * @return e.g. "such"
-	 */
-	protected String adaptPackage(String name) {
-		int separator= name.indexOf('_');
-		assertTrue(separator != -1);
-		assertTrue(separator >= 5);
-		return Character.toLowerCase(name.charAt(4))
-				+ name.substring(5, separator);
-	}
-
-	/**
-	 * get selection from comment in source "//selection: line, col, line, col"
-	 * <br>relies on tabwidth == 4
-	 */
-	protected ISourceRange getSelection(ICompilationUnit cu) throws Exception {
-		String source= cu.getSource();
-		String selection= "//selection:";
-		int selStart= source.indexOf(selection);
-		assertTrue(selStart != -1);
-	
-		int dataStart= selStart + selection.length();
-		StringTokenizer tokenizer= new StringTokenizer(source.substring(dataStart), " ,\t\r\n");
-		int line1= Integer.parseInt(tokenizer.nextToken());
-		int col1= Integer.parseInt(tokenizer.nextToken());
-		int line2= Integer.parseInt(tokenizer.nextToken());
-		int col2= Integer.parseInt(tokenizer.nextToken());
-		return TextRangeUtil.getSelection(cu, line1, col1, line2, col2);
-	}
-
-	/** @require refactoring.checkActivation().isOK() */
-	protected void performTest(ICompilationUnit unit, Refactoring refactoring, String out) throws Exception {
-		IProgressMonitor pm= new NullProgressMonitor();
-		String original= unit.getSource();
-		final IChange change= refactoring.createChange(pm);
-		assertNotNull(change);
-		final ChangeContext context= new ChangeContext(new TestExceptionHandler());
-		change.aboutToPerform(context, pm);
-		JavaCore.run(new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				change.perform(context, monitor);
-			}
-		}, pm);
-		change.performed();
-		
-		final IChange undo= change.getUndoChange();
-		assertNotNull(undo);
-		compareSource(unit.getSource(), out);
-		final ChangeContext context2= new ChangeContext(new TestExceptionHandler());
-		undo.aboutToPerform(context, pm);
-		JavaCore.run(new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				undo.perform(context2, monitor);
-			}
-		}, pm);
-		undo.performed();
-		
-		compareSource(unit.getSource(), original);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToTopLevelTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToTopLevelTests.java
deleted file mode 100644
index b5e8a0e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToTopLevelTests.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInstanceMethodTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInstanceMethodTests.java
deleted file mode 100644
index 2958bd5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInstanceMethodTests.java
+++ /dev/null
@@ -1,418 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.internal.corext.Assert;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatusCodes;
-import org.eclipse.jdt.internal.corext.refactoring.structure.MoveInstanceMethodRefactoring;
-import org.eclipse.jdt.internal.corext.refactoring.structure.MoveInstanceMethodRefactoring.INewReceiver;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-public class MoveInstanceMethodTests extends RefactoringTest {
-
-	private static final Class clazz= MoveInstanceMethodTests.class;
-	private static final String REFACTORING_PATH= "MoveInstanceMethod/";
-
-	private static final int PARAMETER= 0;
-	private static final int FIELD= 1;
-
-	private boolean toSucceed;
-
-	public MoveInstanceMethodTests(String name) {
-		super(name);
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH+ successPath();
-	}
-
-	private String successPath() {
-		return toSucceed ? "/canMove/" : "/cannotMove/";
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	private String getSimpleName(String qualifiedName) {
-		return qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1);
-	}
-
-	private String getQualifier(String qualifiedName) {
-		int dot= qualifiedName.lastIndexOf('.');
-		return qualifiedName.substring(0, dot != -1 ? dot : 0);
-	}
-
-	private ICompilationUnit[] createCUs(String[] qualifiedNames) throws Exception {
-		ICompilationUnit[] cus= new ICompilationUnit[qualifiedNames.length];
-		for(int i= 0; i < qualifiedNames.length; i++) {
-			Assert.isNotNull(qualifiedNames[i]);
-
-			cus[i]= createCUfromTestFile(getRoot().createPackageFragment(getQualifier(qualifiedNames[i]), true, null),
-													  getSimpleName(qualifiedNames[i]));
-		}
-		return cus;
-	}
-
-	private int firstIndexOf(String one, String[] others) {
-		for(int i= 0; i < others.length; i++)
-			if(one == null && others[i] == null || one.equals(others[i]))
-				return i;
-		return -1;
-	}
-	
-	private void helper1(String cuQName, int startLine, int startColumn, int endLine, int endColumn, int newReceiverType, String newReceiverName, boolean inlineDelegator, boolean removeDelegator) throws Exception {
-		helper1(new String[] {cuQName}, cuQName, startLine, startColumn, endLine, endColumn, newReceiverType, newReceiverName, inlineDelegator, removeDelegator);
-	}
-	
-	private void helper1(String[] cuQNames, String selectionCuQName, int startLine, int startColumn, int endLine, int endColumn, int newReceiverType, String newReceiverName, boolean inlineDelegator, boolean removeDelegator) throws Exception {
-		int selectionCuIndex= firstIndexOf(selectionCuQName, cuQNames);
-		Assert.isTrue(selectionCuIndex != -1, "parameter selectionCuQName must match some String in cuQNames.");
-		helper1(cuQNames, selectionCuIndex, startLine, startColumn, endLine, endColumn, newReceiverType, newReceiverName, null, inlineDelegator, removeDelegator);
-	}
-	
-	private static void chooseNewReceiver(MoveInstanceMethodRefactoring ref, int newReceiverType, String newReceiverName) {
-		INewReceiver chosen= null;
-		INewReceiver[] possibleNewReceivers= ref.getPossibleNewReceivers();
-		for(int i= 0; i < possibleNewReceivers.length; i++)  {
-			INewReceiver candidate= possibleNewReceivers[i];
-			if(   candidate.getName().equals(newReceiverName)
-			   && typeMatches(newReceiverType, candidate)) {
-				assertNull(chosen);
-				chosen= candidate;
-			}
-		}
-		assertNotNull("Expected new receiver not available.", chosen);
-		ref.chooseNewReceiver(chosen);		
-	}
-	
-	private static boolean typeMatches(int newReceiverType, INewReceiver newReceiver) {
-		return    newReceiverType == PARAMETER && newReceiver.isParameter()
-		        || newReceiverType == FIELD && newReceiver.isField();
-	}
-	
-	private void helper1(String[] cuQNames, int selectionCuIndex, int startLine, int startColumn, int endLine, int endColumn, int newReceiverType, String newReceiverName, String newMethodName, boolean inlineDelegator, boolean removeDelegator) throws Exception{
-		Assert.isTrue(0 <= selectionCuIndex && selectionCuIndex < cuQNames.length);
-
-		toSucceed= true;
-
-		ICompilationUnit[] cus= createCUs(cuQNames);
-		ICompilationUnit selectionCu= cus[selectionCuIndex];
-
-		ISourceRange selection= TextRangeUtil.getSelection(selectionCu, startLine, startColumn, endLine, endColumn);
-		IMethod method= getMethod(selectionCu, selection);
-		assertNotNull(method);
-		MoveInstanceMethodRefactoring ref= MoveInstanceMethodRefactoring.create(method, JavaPreferencesSettings.getCodeGenerationSettings());
-		
-		assertNotNull("refactoring should be created", ref);
-		RefactoringStatus preconditionResult= ref.checkActivation(new NullProgressMonitor());
-
-		assertTrue("activation was supposed to be successful", preconditionResult.isOK());
-
-		chooseNewReceiver(ref, newReceiverType, newReceiverName);
-		
-		ref.setRemoveDelegator(removeDelegator);
-		ref.setInlineDelegator(inlineDelegator);
-		if(newMethodName != null)
-			ref.setNewMethodName(newMethodName);
-
-		preconditionResult.merge(ref.checkInput(new NullProgressMonitor()));
-
-		assertTrue("precondition was supposed to pass",preconditionResult.isOK());
-
-		IChange change= ref.createChange(new NullProgressMonitor());
-		performChange(change);
-
-		for(int i= 0; i < cus.length; i++) {
-			String outputTestFileName= getOutputTestFileName(getSimpleName(cuQNames[i]));
-			assertEqualLines("Incorrect inline in " + outputTestFileName, getFileContents(outputTestFileName), cus[i].getSource());
-		}
-	}
-
-	private void failHelper1(String cuQName, int startLine, int startColumn, int endLine, int endColumn, int newReceiverType, String newReceiverName, boolean inlineDelegator, boolean removeDelegator, int errorCode) throws Exception {
-		failHelper1(new String[] {cuQName}, cuQName, startLine, startColumn, endLine, endColumn, newReceiverType, newReceiverName, inlineDelegator, removeDelegator, errorCode);
-	}
-	private void failHelper1(String[] cuQNames, String selectionCuQName, int startLine, int startColumn, int endLine, int endColumn, int newReceiverType, String newReceiverName, boolean inlineDelegator, boolean removeDelegator, int errorCode) throws Exception {
-		int selectionCuIndex= firstIndexOf(selectionCuQName, cuQNames);
-		Assert.isTrue(selectionCuIndex != -1, "parameter selectionCuQName must match some String in cuQNames.");
-		failHelper1(cuQNames, selectionCuIndex, startLine, startColumn, endLine, endColumn, newReceiverType, newReceiverName, null, null, inlineDelegator, removeDelegator, errorCode);
-	}
-	private void failHelper2(String[] cuQNames, String selectionCuQName, int startLine, int startColumn, int endLine, int endColumn, int newReceiverType, String newReceiverName, String originalReceiverParameterName, boolean inlineDelegator, boolean removeDelegator, int errorCode) throws Exception {
-		int selectionCuIndex= firstIndexOf(selectionCuQName, cuQNames);
-		Assert.isTrue(selectionCuIndex != -1, "parameter selectionCuQName must match some String in cuQNames.");
-		failHelper1(cuQNames, selectionCuIndex, startLine, startColumn, endLine, endColumn, newReceiverType, newReceiverName, null, originalReceiverParameterName, inlineDelegator, removeDelegator, errorCode);
-	}
-	private void failHelper1(String[] cuQNames, int selectionCuIndex, int startLine, int startColumn, int endLine, int endColumn, int newReceiverType, String newReceiverName, String newMethodName, String originalReceiverParameterName, boolean inlineDelegator, boolean removeDelegator, int errorCode) throws Exception {
-		Assert.isTrue(0 <= selectionCuIndex && selectionCuIndex < cuQNames.length);
-
-		toSucceed= false;
-
-		ICompilationUnit[] cus= createCUs(cuQNames);
-		ICompilationUnit selectionCu= cus[selectionCuIndex];
-
-		ISourceRange selection= TextRangeUtil.getSelection(selectionCu, startLine, startColumn, endLine, endColumn);
-		IMethod method= getMethod(selectionCu, selection);
-		assertNotNull(method);
-		MoveInstanceMethodRefactoring ref= MoveInstanceMethodRefactoring.create(method,
-																									JavaPreferencesSettings.getCodeGenerationSettings());
-		if (ref == null) {
-			assertTrue(errorCode != 0);
-		} else  {
-			RefactoringStatus result= ref.checkActivation(new NullProgressMonitor());
-
-			if(!result.isOK()) {
-				assertEquals(errorCode, result.getEntryMatchingSeverity(RefactoringStatus.ERROR).getCode());
-				return;
-			} else {
-				chooseNewReceiver(ref, newReceiverType, newReceiverName);
-	
-				if (originalReceiverParameterName != null)
-					ref.setOriginalReceiverParameterName(originalReceiverParameterName);
-				ref.setRemoveDelegator(removeDelegator);			
-				ref.setInlineDelegator(inlineDelegator);
-				if(newMethodName != null)
-					ref.setNewMethodName(newMethodName);
-	
-				result.merge(ref.checkInput(new NullProgressMonitor()));
-	
-				assertTrue("precondition checking is expected to fail.", !result.isOK());
-				assertEquals(errorCode, result.getEntryMatchingSeverity(RefactoringStatus.ERROR).getCode());
-			}
-		}
-	}	
-
-	private static IMethod getMethod(ICompilationUnit cu, ISourceRange sourceRange) throws JavaModelException {
-		IJavaElement[] jes= cu.codeSelect(sourceRange.getOffset(), sourceRange.getLength());
-		if (jes.length != 1 || ! (jes[0] instanceof IMethod))
-			return null;
-		return (IMethod)jes[0];
-	}
-	
-	//--- TESTS
-	
-	// Move mA1 to parameter b, do not inline delegator	
-	public void test0() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B", "p3.C"}, "p1.A", 7, 17, 7, 20, PARAMETER, "b", false, false);
-	}
-	
-	// Move mA1 to parameter b, inline delegator
-	public void test1() throws Exception {
-		printTestDisabledMessage("not implemented yet");
-//		helper1(new String[] {"p1.A", "p2.B", "p3.C"}, "p1.A", 7, 17, 7, 20, PARAMETER, "b", true, false);
-	}
-
-//	// Move mA1 to parameter b, inline delegator, remove delegator
-	public void test2() throws Exception {
-		printTestDisabledMessage("not implemented yet");
-//		helper1(new String[] {"p1.A", "p2.B", "p3.C"}, "p1.A", 7, 17, 7, 20, PARAMETER, "b", true, true);
-	}
-	
-	// Move mA1 to field fB, do not inline delegator
-	public void test3() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B", "p3.C"}, "p1.A", 9, 17, 9, 20, FIELD, "fB", false, false);
-	}
-	
-//	// Move mA1 to field fB, inline delegator, remove delegator
-	public void test4() throws Exception {
-		printTestDisabledMessage("not implemented yet");		
-//		helper1(new String[] {"p1.A", "p2.B", "p3.C"}, "p1.A", 9, 17, 9, 20, FIELD, "fB", true, true);
-	}
-	
-	// Move mA1 to field fB, unqualified static member references are qualified
-	public void test5() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B"}, "p1.A", 15, 19, 15, 19, FIELD, "fB", false, false);	
-	}
-	
-	// class qualify referenced type name to top level, original receiver not used in method
-	public void test6() throws Exception {
-		helper1(new String[] {"p1.Nestor", "p2.B"}, "p1.Nestor", 11, 17, 11, 17, PARAMETER, "b", false, false);
-	}	
-	
-	public void test7() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B", "p3.N1"}, "p1.A", 8, 17, 8, 18, PARAMETER, "b", false, false);
-	}
-	
-	// access to fields, non-void return type
-	public void test8() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B"}, "p1.A", 9, 19, 9, 20, PARAMETER, "b", false, false);
-	}
-	
-	// multiple parameters, some left of new receiver parameter, some right of it,
-	// "this" is passed as first argument
-	public void test9() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B"}, "p1.A", 6, 17, 6, 17, PARAMETER, "b", false, false);
-	}	
-	
-	// multiple parameters, some left of new receiver parameter, some right of it,
-	// "this" is NOT passed as first argument, (since it's not used in the method)
-	public void test10() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B"}, "p1.A", 6, 17, 6, 17, PARAMETER, "b", false, false);
-	}
-	
-	//move to field, method has parameters, choice of fields, some non-class type fields
-	// ("this" is passed as first argument)
-	public void test11() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B"}, "p1.A", 11, 17, 11, 17, FIELD, "fB", false, false);
-	}	
-
-	//move to field - do not pass 'this' because it's unneeded
-	public void test12() throws Exception {
-		helper1(new String[] {"p1.A", "p2.B"}, "p1.A", 8, 17, 8, 20, FIELD, "fB", false, false);
-	}	
-
-	//junit case
-	public void test13() throws Exception {
-		helper1(new String[] {"p1.TR", "p1.TC", "p1.P"}, "p1.TR", 4, 20, 4, 23, PARAMETER, "test", false, false);
-	}	
-
-	//simplified junit case
-	public void test14() throws Exception {
-		helper1(new String[] {"p1.TR", "p1.TC"}, "p1.TR", 4, 20, 4, 23, PARAMETER, "test", false, false);
-	}	
-	
-	//move to type in same cu
-	public void test15() throws Exception {
-		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=40120
-		helper1(new String[] {"p.A"}, "p.A", 13, 18, 13, 18, PARAMETER, "s", false, false);
-	}	
-
-	//move to inner type in same cu
-	public void test16() throws Exception {
-		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=40120
-		helper1(new String[] {"p.B"}, "p.B", 11, 17, 11, 22, PARAMETER, "s", false, false);
-	}
-
-	//don't generate parameter for unused field (bug 38310)
-	public void test17() throws Exception {
-		helper1(new String[] {"p.Shape", "p.Rectangle"}, "p.Shape", 7, 16, 7, 20, FIELD, "fBounds", false, false);
-	}	
-
-	//generate parameter for used field (bug 38310)
-	public void test18() throws Exception {
-		helper1(new String[] {"p.Shape", "p.Rectangle"}, "p.Shape", 13, 22, 13, 22, FIELD, "fInnerBounds", false, false);
-	}	
-
-	//generate parameter for used field (bug 38310)
-	public void test19() throws Exception {
-		helper1(new String[] {"p.Shape", "p.Rectangle"}, "p.Shape", 17, 20, 17, 33, PARAMETER, "rect", false, false);
-	}	
-	
-	// Can move if "super" is used in inner class 
-	public void test20() throws Exception {
-		helper1(new String[] {"p.A", "p.B", "p.StarDecorator"}, "p.A", 10, 17, 10, 22, PARAMETER, "b", false, false);
-	}	
-
-	// Arguments of method calls preserved in moved body (bug 41468)
-	public void test21() throws Exception {
-		helper1(new String[] {"p.A", "p.Second"}, "p.A", 5, 17, 5, 22, FIELD, "s", false, false);
-	}
-
-	// arguments of method calls preserved in moved body (bug 41468),
-	// use "this" instead of field (bug 38310)
-	public void test22() throws Exception {
-		helper1(new String[] {"p.A", "p.Second"}, "p.A", 5, 17, 5, 22, FIELD, "s", false, false);
-	}
-
-	// "this"-qualified field access: this.s -> this (bug 41597)
-	public void test23() throws Exception {
-		helper1(new String[] {"p.A", "p.Second"}, "p.A", 5, 17, 5, 22, FIELD, "s", false, false);
-	}
-
-	// move local class (41530)
-	public void test24() throws Exception {
-		helper1(new String[] {"p1.A", "p1.B", "p1.StarDecorator"}, "p1.A", 9, 17, 9, 22, PARAMETER, "b", false, false);
-	}
-
-
-	// Cannot move interface method declaration
-	public void testFail0() throws Exception {
-		failHelper1("p1.IA", 5, 17, 5, 20, PARAMETER, "b", true, true, RefactoringStatusCodes.SELECT_METHOD_IMPLEMENTATION);	
-	}
-	
-	// Cannot move abstract method declaration
-	public void testFail1() throws Exception {
-		failHelper1("p1.A", 5, 26, 5, 29, PARAMETER, "b", true, true, RefactoringStatusCodes.SELECT_METHOD_IMPLEMENTATION);
-	}
-	
-	// Cannot move static method
-	public void testFail2() throws Exception {
-		failHelper1(new String[] {"p1.A", "p2.B"}, "p1.A", 6, 23, 6, 24, PARAMETER, "b", true, true, RefactoringStatusCodes.CANNOT_MOVE_STATIC);
-	}
-	
-	// Cannot move native method
-	public void testFail3() throws Exception {
-		failHelper1(new String[] {"p1.A", "p2.B"}, "p1.A", 6, 23, 6, 24, PARAMETER, "b", true, true, RefactoringStatusCodes.CANNOT_MOVE_NATIVE);
-	}
-	
-	// Cannot move method that references "super"
-	public void testFail4() throws Exception {
-		failHelper1(new String[] {"p1.A", "p2.B"}, "p1.A", 11, 20, 11, 21, PARAMETER, "b", true, true, RefactoringStatusCodes.SUPER_REFERENCES_NOT_ALLOWED);
-	}
-	
-	// Cannot move method that references an enclosing instance
-	public void testFail5() throws Exception {
-		failHelper1(new String[] {"p1.A", "p2.B"}, "p1.A", 8, 21, 8, 21, PARAMETER, "b", true, true, RefactoringStatusCodes.ENCLOSING_INSTANCE_REFERENCES_NOT_ALLOWED);
-	}
-	
-	// Cannot move potentially directly recursive method
-	public void testFail6() throws Exception {
-		failHelper1(new String[] {"p1.A", "p2.B"}, "p1.A", 6, 16, 6, 17, PARAMETER, "b", true, true, RefactoringStatusCodes.CANNOT_MOVE_RECURSIVE);
-	}
-	
-	// Cannot move to local class
-	public void testFail7() throws Exception {
-		printTestDisabledMessage("not implemented yet - jcore does not have elements for local types");
-//		failHelper1("p1.A", 9, 25, 9, 26, PARAMETER, "p", true, true, RefactoringStatusCodes.CANNOT_MOVE_TO_LOCAL);
-	}		
-
-	// Cannot move synchronized method
-	public void testFail8() throws Exception {
-		failHelper1(new String[] {"p1.A", "p2.B"}, "p1.A", 6, 29, 6, 29, PARAMETER, "b", true, true, RefactoringStatusCodes.CANNOT_MOVE_SYNCHRONIZED);
-	}
-
-	// Cannot move method if there's no new potential receiver
-	public void testFail9() throws Exception {
-		failHelper1(new String[] {"p1.A", "p2.B", "p3.C"}, "p1.A", 7, 17, 7, 20, PARAMETER, "b", true, true, RefactoringStatusCodes.NO_NEW_RECEIVERS);	
-	}
-
-	// Cannot move method if there's no new potential receiver
-	public void testFail10() throws Exception {
-		failHelper1(new String[] {"p1.A", "p2.B", "p3.C"}, "p1.A", 8, 17, 8, 20, PARAMETER, "b", true, true, RefactoringStatusCodes.NO_NEW_RECEIVERS);	
-	}
-	
-	// Cannot move method - parameter name conflict
-	public void testFail11() throws Exception {
-		failHelper2(new String[] {"p1.A", "p2.B"}, "p1.A", 7, 17, 7, 20, PARAMETER, "b", "a", true, true, RefactoringStatusCodes.PARAM_NAME_ALREADY_USED);	
-	}
-
-	// Cannot move method if there's no new potential receiver (because of null bindings here)
-	public void testFail12() throws Exception {
-//		printTestDisabledMessage("bug 39871");
-		failHelper1(new String[] {"p1.A"}, "p1.A", 5, 10, 5, 16, PARAMETER, "b", true, true, RefactoringStatusCodes.NO_NEW_RECEIVERS);	
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveMembersTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveMembersTests.java
deleted file mode 100644
index ffef31e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveMembersTests.java
+++ /dev/null
@@ -1,551 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.DebugUtils;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.structure.MoveStaticMembersRefactoring;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class MoveMembersTests extends RefactoringTest {
-
-	private static final Class clazz= MoveMembersTests.class;
-	
-	private static final String REFACTORING_PATH= "MoveMembers/";
-
-	public MoveMembersTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	public static Test setUpTest(Test someTest) {
-		return new MySetup(someTest);
-	}	
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	//---
-	private static MoveStaticMembersRefactoring createRefactoring(IMember[] members) throws JavaModelException{
-		return MoveStaticMembersRefactoring.create(members, JavaPreferencesSettings.getCodeGenerationSettings());
-	}
-	
-	protected void setUp() throws Exception {
-		if (fIsVerbose)
-			DebugUtils.dump("--------- " + getName() + " ---------------");
-		super.setUp();
-	}
-	
-	private void fieldMethodTypePackageHelper_passing(String[] fieldNames, String[] methodNames, String[][] signatures, String[] typeNames, IPackageFragment packForA, IPackageFragment packForB) throws Exception {
-		ICompilationUnit cuA= createCUfromTestFile(packForA, "A");
-		ICompilationUnit cuB= createCUfromTestFile(packForB, "B");
-		IType typeA= getType(cuA, "A");
-		IType typeB= getType(cuB, "B");
-		IField[] fields= getFields(typeA, fieldNames);
-		IMethod[] methods= getMethods(typeA, methodNames, signatures);
-		IType[] types= getMemberTypes(typeA, typeNames);
-	
-		MoveStaticMembersRefactoring ref= createRefactoring(merge(methods, fields, types));
-		IType destinationType= typeB;
-		ref.setDestinationTypeFullyQualifiedName(destinationType.getFullyQualifiedName());
-	
-		RefactoringStatus result= performRefactoringWithStatus(ref);
-		assertTrue("precondition was supposed to pass", result.getSeverity() <= RefactoringStatus.WARNING);
-	
-		String expected;
-		String actual;
-	
-		expected= getFileContents(getOutputTestFileName("A"));
-		actual= cuA.getSource();
-		assertEqualLines("incorrect modification of  A", expected, actual);
-	
-		expected= getFileContents(getOutputTestFileName("B"));
-		actual= cuB.getSource();
-		assertEqualLines("incorrect modification of  B", expected, actual);
-		//tearDown() deletes resources and does performDummySearch();
-	}
-	
-	/** Move members from p.A to r.B*/
-	private void fieldMethodTypeABHelper_passing(String[] fieldNames, String[] methodNames, String[][] signatures, String[] typeNames) throws Exception {
-		IPackageFragment packageForB= getRoot().createPackageFragment("r", false, null);
-		fieldMethodTypePackageHelper_passing(fieldNames, methodNames, signatures, typeNames, getPackageP(), packageForB);
-		//tearDown() deletes resources and does performDummySearch();
-	}
-
-	/** Move members from p.A to r.B under presence of other.C */
-	private void fieldMethodType3CUsHelper_passing(String[] fieldNames, String[] methodNames, String[][] signatures, String[] typeNames) throws Exception {
-		IPackageFragment packageForB= getRoot().createPackageFragment("r", false, null);
-		IPackageFragment packageForC= getRoot().createPackageFragment("other", false, null);
-
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(packageForB, "B");
-		ICompilationUnit cuC= createCUfromTestFile(packageForC, "C");
-		
-		IType typeA= getType(cuA, "A");
-		IType typeB= getType(cuB, "B");
-
-		IField[] fields= getFields(typeA, fieldNames);
-		IMethod[] methods= getMethods(typeA, methodNames, signatures);
-		IType[] types= getMemberTypes(typeA, typeNames);
-	
-		MoveStaticMembersRefactoring ref= createRefactoring(merge(methods, fields, types));
-		IType destinationType= typeB;
-		ref.setDestinationTypeFullyQualifiedName(destinationType.getFullyQualifiedName());
-	
-		RefactoringStatus result= performRefactoringWithStatus(ref);
-		assertTrue("precondition was supposed to pass", result.getSeverity() <= RefactoringStatus.WARNING);
-	
-		String expected;
-		String actual;
-	
-		expected= getFileContents(getOutputTestFileName("A"));
-		actual= cuA.getSource();
-		assertEqualLines("incorrect modification of  A", expected, actual);
-	
-		expected= getFileContents(getOutputTestFileName("B"));
-		actual= cuB.getSource();
-		assertEqualLines("incorrect modification of  B", expected, actual);
-	
-		expected= getFileContents(getOutputTestFileName("C"));
-		actual= cuC.getSource();
-		assertEqualLines("incorrect modification of  C", expected, actual);
-		//tearDown() deletes resources and does performDummySearch();
-	}
-
-	private void fieldMethodTypeHelper_passing(String[] fieldNames, String[] methodNames, String[][] signatures, String[] typeNames) throws Exception{
-		IPackageFragment packForA= getPackageP();
-		IPackageFragment packForB= getPackageP();
-		fieldMethodTypePackageHelper_passing(fieldNames, methodNames, signatures, typeNames, packForA, packForB);
-	}
-	
-	private void fieldHelper_passing(String[] fieldNames) throws Exception {
-		fieldMethodTypeHelper_passing(fieldNames, new String[0], new String[0][0], new String[0]);
-	}
-	
-	private void methodHelper_passing(String[] methodNames, String[][] signatures) throws Exception {
-		fieldMethodTypeHelper_passing(new String[0], methodNames, signatures, new String[0]);
-	}
-
-	private void typeHelper_passing(String[] typeNames) throws Exception {
-		fieldMethodTypeHelper_passing(new String[0], new String[0], new String[0][0], typeNames);
-	}
-	
-	private void fieldMethodTypePackageHelper_failing(String[] fieldNames,
-												String[] methodNames, String[][] signatures,
-												String[] typeNames,
-												int errorLevel, String destinationTypeName,
-												IPackageFragment packForA,
-												IPackageFragment packForB) throws Exception {
-		ICompilationUnit cuA= createCUfromTestFile(packForA, "A");
-		ICompilationUnit cuB= createCUfromTestFile(packForB, "B");
-		try{
-			IType typeA= getType(cuA, "A");
-			IField[] fields= getFields(typeA, fieldNames);
-			IMethod[] methods= getMethods(typeA, methodNames, signatures);
-			IType[] types= getMemberTypes(typeA, typeNames);
-		
-			MoveStaticMembersRefactoring ref= createRefactoring(merge(methods, fields, types));
-			if (ref == null){
-				assertEquals(errorLevel, RefactoringStatus.FATAL);
-				return;
-			}
-			ref.setDestinationTypeFullyQualifiedName(destinationTypeName);
-		
-			RefactoringStatus result= performRefactoring(ref);
-			if (fIsVerbose)
-				DebugUtils.dump("status:" + result);
-			assertNotNull("precondition was supposed to fail", result);
-			assertEquals("precondition was supposed to fail", errorLevel, result.getSeverity());
-		
-		} finally{
-			performDummySearch();			
-			cuA.delete(false, null);
-			cuB.delete(false, null);
-		}	
-	}
-	
-	private void fieldMethodTypeHelper_failing(String[] fieldNames, 
-												String[] methodNames, String[][] signatures, 
-												String[] typeNames,
-												int errorLevel, String destinationTypeName) throws Exception {
-		IPackageFragment packForA= getPackageP();
-		IPackageFragment packForB= getPackageP();											
-		fieldMethodTypePackageHelper_failing(fieldNames, methodNames, signatures, typeNames,
-												errorLevel, destinationTypeName, packForA, packForB);	
-	}
-
-
-	//---
-
-	public void test0() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test1() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test2() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test3() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test4() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test5() throws Exception{
-		fieldHelper_passing(new String[]{"f"});
-	}
-
-	public void test6() throws Exception{
-		fieldHelper_passing(new String[]{"f"});
-	}
-
-	public void test7() throws Exception{
-		fieldHelper_passing(new String[]{"f"});
-	}
-	
-	public void test8() throws Exception{
-//		printTestDisabledMessage("36835");
-		IPackageFragment packageForB= null;
-		try{
-			packageForB= getRoot().createPackageFragment("r", false, null);
-			fieldMethodTypePackageHelper_passing(new String[]{"f"}, new String[0], new String[0][0], new String[0], getPackageP(), packageForB);
-		} finally{
-			performDummySearch();
-			if (packageForB != null)
-				packageForB.delete(true, null);
-		}	
-	}
-
-	public void test9() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test10() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test11() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test12() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test13() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test14() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test15() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test16() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test17() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test18() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test19() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test20() throws Exception{
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-	
-	public void test21() throws Exception{
-		fieldHelper_passing(new String[]{"F", "i"});
-	}
-	
-	public void test22() throws Exception{
-		fieldHelper_passing(new String[]{"i"});
-	}
-	
-	public void test23() throws Exception{
-		fieldHelper_passing(new String[]{"FRED"});
-	}
-	
-	public void test24() throws Exception{
-		fieldHelper_passing(new String[]{"FRED"});
-	}
-	
-	public void test25() throws Exception{
-		//printTestDisabledMessage("test for 27098");
-		fieldHelper_passing(new String[]{"FRED"});
-	}
-	
-	public void test26() throws Exception{
-		IPackageFragment packageForB= null;
-		try{
-			packageForB= getRoot().createPackageFragment("r", false, null);
-			fieldMethodTypePackageHelper_passing(new String[0], new String[]{"n"}, new String[][]{new String[0]}, new String[0], getPackageP(), packageForB);
-		} finally{
-			performDummySearch();
-			if (packageForB != null)
-				packageForB.delete(true, null);
-		}	
-	}
-	
-	public void test27() throws Exception{
-		IPackageFragment packageForB= null;
-		try{
-			packageForB= getRoot().createPackageFragment("r", false, null);
-			fieldMethodTypePackageHelper_passing(new String[0], new String[]{"n"}, new String[][]{new String[0]}, new String[0], getPackageP(), packageForB);
-		} finally{
-			performDummySearch();
-			if (packageForB != null)
-				packageForB.delete(true, null);
-		}	
-	}
-	
-	public void test28() throws Exception{
-		methodHelper_passing(new String[]{"m", "n"}, new String[][]{new String[0], new String[0]});
-	}
-	
-	public void test29() throws Exception{ //test for bug 41691
-		methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test30() throws Exception{ //test for bug 41691
-		fieldHelper_passing(new String[]{"id"});
-	}
-
-	public void test31() throws Exception{ //test for bug 41691
-		fieldHelper_passing(new String[]{"odd"});
-	}
-
-	public void test32() throws Exception{ //test for bug 41734, 41691
-		printTestDisabledMessage("test for 41734");
-		//methodHelper_passing(new String[]{"m"}, new String[][]{new String[0]});
-	}
-
-	public void test33() throws Exception{ //test for bug 28022
-		fieldHelper_passing(new String[]{"i"});
-	}
-
-	public void test34() throws Exception{ //test for bug 28022
-		fieldHelper_passing(new String[]{"i"});
-	}
-
-	public void test35() throws Exception{ //test for bug 28022
-		fieldHelper_passing(new String[]{"i"});
-	}
-	
-	//-- move types:
-	
-	public void test36() throws Exception {
-		typeHelper_passing(new String[]{"I"});
-	}
-	
-	public void test37() throws Exception {
-		printTestDisabledMessage("qualified access to source");
-//		typeHelper_passing(new String[] {"Inner"});
-	}
-	
-	public void test38() throws Exception {
-		fieldMethodTypeABHelper_passing(new String[0], new String[0], new String[0][0], new String[]{"Inner"});
-	}
-
-	public void test39() throws Exception {
-		printTestDisabledMessage("complex imports - need more work");
-//		fieldMethodType3CUsHelper_passing(new String[0], new String[0], new String[0][0],
-//							new String[]{"Inner"});
-	}
-	
-	//---
-	public void testFail0() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0],
-									  new String[]{"m"}, new String[][]{new String[0]},
-									  new String[0],
-									  RefactoringStatus.FATAL, "p.B");
-	}
-	
-
-	public void testFail1() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, 
-									  new String[0],
-									  RefactoringStatus.ERROR, "p.B.X");
-	}
-	
-	public void testFail2() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, 
-									  new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-
-	public void testFail3() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[]{"I", "I"}}, 
-									  new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-
-	public void testFail4() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[]{"I", "I"}}, 
-									  new String[0],
-									  RefactoringStatus.WARNING, "p.B");
-	}
-	
-	public void testFail5() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[]{"I", "I"}}, 
-									  new String[0],
-									  RefactoringStatus.WARNING, "p.B");
-	}
-
-	public void testFail6() throws Exception{
-		fieldMethodTypeHelper_failing(new String[]{"i"}, new String[0], new String[0][0], new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-	
-	public void testFail7() throws Exception{
-		fieldMethodTypeHelper_failing(new String[]{"i"}, new String[0], new String[0][0], new String[0], 
-									  RefactoringStatus.ERROR, "p.B");
-	}
-	
-	public void testFail8() throws Exception{
-		fieldMethodTypeHelper_failing(new String[]{"i"}, new String[0], new String[0][0], new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-	
-	public void testFail9() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-	
-	public void testFail10() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-
-	public void testFail11() throws Exception{
-		fieldMethodTypeHelper_failing(new String[]{"i"}, new String[0], new String[0][0], new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-
-	public void testFail12() throws Exception{
-		fieldMethodTypeHelper_failing(new String[]{"i"}, new String[0], new String[0][0], new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-
-	public void testFail13() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-
-	public void testFail14() throws Exception{
-		fieldMethodTypeHelper_failing(new String[]{"i"}, new String[0], new String[0][0], new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-
-	public void testFail15() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.WARNING, "p.B");
-	}
-
-	public void testFail16() throws Exception{
-		IPackageFragment packageForB= null;
-		try{
-			packageForB= getRoot().createPackageFragment("r", false, null);
-			fieldMethodTypePackageHelper_failing(new String[]{"f"}, new String[0], new String[0][0], new String[0],
-										 RefactoringStatus.ERROR, "r.B", 
-										 getPackageP(), packageForB);
-		} finally{
-			performDummySearch();
-			if (packageForB != null)
-				packageForB.delete(true, null);
-		}	
-	}
-
-	public void testFail17() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.FATAL, "java.lang.Object");
-	}
-	
-	public void testFail18() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.FATAL, "p.DontExist");
-	}
-
-	public void testFail19() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.ERROR, "p.B");
-	}
-	
-	public void testFail20() throws Exception{
-		// was same as test19
-	}
-	
-	public void testFail21() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.FATAL, "p.B");
-	}
-
-	public void testFail22() throws Exception{
-		//free slot
-	}
-
-	public void testFail23() throws Exception{
-		//free slot
-	}
-
-	public void testFail24() throws Exception{
-		fieldMethodTypeHelper_failing(new String[0], 
-									  new String[]{"m"}, new String[][]{new String[0]}, new String[0],
-									  RefactoringStatus.FATAL, "p.B");
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MySetup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MySetup.java
deleted file mode 100644
index 4896109..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MySetup.java
+++ /dev/null
@@ -1,72 +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.jdt.ui.tests.refactoring;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-public class MySetup extends TestSetup {
-	
-	public MySetup(Test test) {
-		super(test);
-	}
-	public static final String CONTAINER= "src";
-	private static IPackageFragmentRoot fgRoot;
-	private static IPackageFragment fgPackageP;
-	private static IJavaProject fgJavaTestProject;
-	
-	public static IPackageFragmentRoot getDefaultSourceFolder() throws Exception {
-		if (fgRoot != null) 
-			return fgRoot;
-		throw new Exception("MySetup not initialized");
-	}
-	
-	public static IJavaProject getProject()throws Exception {
-		if (fgJavaTestProject != null)
-			return fgJavaTestProject;
-		throw new Exception("MySetup not initialized");
-	}
-	
-	public static IPackageFragment getPackageP()throws Exception {
-		if (fgPackageP != null) 
-			return fgPackageP;
-		throw new Exception("MySetup not initialized");
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		JavaProjectHelper.setAutoBuilding(false);
-		if (JavaPlugin.getActivePage() != null)
-			JavaPlugin.getActivePage().close();
-		fgJavaTestProject= JavaProjectHelper.createJavaProject("TestProject"+System.currentTimeMillis(), "bin");
-		JavaProjectHelper.addRTJar(fgJavaTestProject);
-		fgRoot= JavaProjectHelper.addSourceContainer(fgJavaTestProject, CONTAINER);
-		fgPackageP= fgRoot.createPackageFragment("p", true, null);
-	}
-	
-	protected void tearDown() throws Exception {
-		if (fgPackageP.exists())
-			fgPackageP.delete(true, null);
-		JavaProjectHelper.removeSourceContainer(fgJavaTestProject, CONTAINER);
-		JavaProjectHelper.delete(fgJavaTestProject);
-		super.tearDown();
-	}
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/NullRefactoring.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/NullRefactoring.java
deleted file mode 100644
index e20c5f5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/NullRefactoring.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.jdt.ui.tests.refactoring;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.jdt.internal.corext.refactoring.NullChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-
-/**
- * useful for tests
- */
-public class NullRefactoring extends Refactoring {
-	
-	public IChange createChange(IProgressMonitor pm) throws CoreException {
-		pm.beginTask("", 1);
-		pm.worked(1);
-		pm.done();
-		return new NullChange("NullRefactoring");
-	}
-
-
-	public RefactoringStatus checkActivation(IProgressMonitor pm) throws CoreException {
-		pm.beginTask("", 1);
-		pm.worked(1);
-		pm.done();
-		return new RefactoringStatus();
-	}
-
-	public RefactoringStatus checkInput(IProgressMonitor pm) throws CoreException {
-		pm.beginTask("", 1);
-		pm.worked(1);
-		pm.done();
-		return new RefactoringStatus();
-	}
-	
-	public String getName() {
-		return "Null Refactoring";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PathTransformationTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PathTransformationTests.java
deleted file mode 100644
index d0775c1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PathTransformationTests.java
+++ /dev/null
@@ -1,114 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jdt.internal.corext.refactoring.changes.RenameResourceChange;
-
-public class PathTransformationTests extends TestCase {
-	
-	private static final Class clazz= PathTransformationTests.class;
-	public PathTransformationTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-/************/	
-	private IPath createIPath(String p){
-		return Path.EMPTY.append(p);
-	}
-	
-	private void  check(String path, String oldName, String newName){
-		IPath pOld= createIPath(path + "/" + oldName);
-		String extension= "";
-		//if (oldName.lastIndexOf(".") != -1)
-		//	extension= oldName.substring(oldName.lastIndexOf("."));
-		IPath pNew= createIPath(path + "/" + newName + extension);
-		IPath newPath= RenameResourceChange.renamedResourcePath(pOld, newName);
-		
-		assertEquals(pNew.toString(), newPath.toString());
-	}
-	
-/************/
-	
-	public void test0(){
-		check("/s/p", "A.java", "B.java");
-	}
-	
-	public void test1(){
-		check("/s/p", "A.java", "A.java");
-	}		
-
-	public void test2(){
-		check("/s/p", "A.txt", "B.txt");
-	}		
-	
-	public void test3(){
-		check("/s/p", "A", "B");
-	}		
-	
-	public void test4(){
-		check("/s/p/p", "A.java", "B.java");
-	}
-	
-	public void test5(){
-		check("/s/p/p", "A.java", "A.java");
-	}		
-
-	public void test6(){
-		check("/s/p/p", "A.txt", "B.txt");
-	}		
-	
-	public void test7(){
-		check("/s", "A", "B.java");
-	}		
-	
-	public void test8(){
-		check("/s", "A.java", "B.java");
-	}
-	
-	public void test9(){
-		check("/s", "A.java", "A.java");
-	}		
-
-	public void test10(){
-		check("/s", "A.txt", "B.txt");
-	}		
-	
-	public void test11(){
-		check("/s", "A", "B");
-	}			
-	
-	public void test12(){
-		check("", "A.java", "B.java");
-	}
-	
-	public void test13(){
-		check("", "A.java", "A.java");
-	}		
-
-	public void test14(){
-		check("", "A.txt", "B.txt");
-	}		
-	
-	public void test15(){
-		check("", "A", "B");
-	}			
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PromoteTempToFieldTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PromoteTempToFieldTests.java
deleted file mode 100644
index f38fdda..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PromoteTempToFieldTests.java
+++ /dev/null
@@ -1,537 +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.jdt.ui.tests.refactoring;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.Modifier;
-import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.code.PromoteTempToFieldRefactoring;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class PromoteTempToFieldTests extends RefactoringTest{
-	
-	private static final Class clazz= PromoteTempToFieldTests.class;
-	private static final String REFACTORING_PATH= "PromoteTempToField/";
-    private Object fCompactPref;
-	
-	public PromoteTempToFieldTests(String name){
-		super(name);
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	/** See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=47316">Bug 47316</a>. */
-	public static Test setUpTest(Test someTest) {
-		return new MySetup(someTest);
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		Hashtable options= JavaCore.getOptions();
-		
-		String setting= DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR;
-		fCompactPref= options.get(setting);
-		options.put(setting, DefaultCodeFormatterConstants.TRUE);
-		JavaCore.setOptions(options);
-	}
-	
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		Hashtable options= JavaCore.getOptions();
-		options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR, fCompactPref);
-		JavaCore.setOptions(options);	
-	}
-	
-	
-	
-	private String getSimpleTestFileName(boolean canRename, boolean input){
-		String fileName = "A_" + getName();
-		if (canRename)
-			fileName += input ? "_in": "_out";
-		return fileName + ".java"; 
-	}
-
-	private String getSimpleEnablementTestFileName(){
-		return "A_" + getName() + ".java"; 
-	}
-	
-	private String getTestFileName(boolean canRename, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += (canRename ? "canPromote/": "cannotPromote/");
-		return fileName + getSimpleTestFileName(canRename, input);
-	}
-	
-	private String getEnablementTestFileName(){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += "testEnablement/";
-		return fileName + getSimpleEnablementTestFileName();
-	}
-	
-	
-	//------------
-	protected final ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canPromote, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(canPromote, input), getFileContents(getTestFileName(canPromote, input)));
-	}
-
-	protected final ICompilationUnit createCUfromEnablementTestFile(IPackageFragment pack) throws Exception {
-		return createCU(pack, getSimpleEnablementTestFileName(), getFileContents(getEnablementTestFileName()));
-	}
-	
-	private void passHelper(int startLine, int startColumn, int endLine, int endColumn, 
-						  String newName,
-						  boolean declareStatic,
-						  boolean declareFinal,
-						  int initializeIn,
-						  int accessModifier) throws Exception{
-						  	
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);						  	
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-        PromoteTempToFieldRefactoring ref= PromoteTempToFieldRefactoring.create(cu, selection.getOffset(), selection.getLength(), JavaPreferencesSettings.getCodeGenerationSettings());
-
-		RefactoringStatus activationResult= ref.checkActivation(new NullProgressMonitor());	
-		assertTrue("activation was supposed to be successful", activationResult.isOK());
-
-        ref.setFieldName(newName);
-        ref.setDeclareFinal(declareFinal);
-        ref.setDeclareStatic(declareStatic);
-        ref.setInitializeIn(initializeIn);
-        ref.setVisibility(accessModifier);
-		
-		RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-		assertTrue("precondition was supposed to pass", checkInputResult.isOK());
-
-		performChange(ref.createChange(new NullProgressMonitor()));
-        		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		assertEqualLines("incorrect changes", getFileContents(getTestFileName(true, false)), newcu.getSource());
-	}
-
-	private void failHelper(int startLine, int startColumn, int endLine, int endColumn, 
-						  String newName,
-						  boolean declareStatic,
-						  boolean declareFinal,
-						  int initializeIn,
-						  int accessModifier,
-						  int expectedSeverity) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);						  	
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-        PromoteTempToFieldRefactoring ref= PromoteTempToFieldRefactoring.create(cu, selection.getOffset(), selection.getLength(), JavaPreferencesSettings.getCodeGenerationSettings());
-		
-		RefactoringStatus result= ref.checkActivation(new NullProgressMonitor());	
-        ref.setFieldName(newName);
-        ref.setDeclareFinal(declareFinal);
-        ref.setDeclareStatic(declareStatic);
-        ref.setInitializeIn(initializeIn);
-        ref.setVisibility(accessModifier);
-		result.merge(ref.checkInput(new NullProgressMonitor()));
-		if (result.isOK())
-			result= null;
-		assertNotNull("precondition was supposed to fail",result);
-
-		assertEquals("incorrect severity:", expectedSeverity, result.getSeverity());
-	}
-
-	private void enablementHelper(int startLine, int startColumn, int endLine, int endColumn,
-						  String newName,
-						  boolean declareStatic,
-						  boolean declareFinal,
-						  int initializeIn,
-						  int accessModifier,
-						  boolean expectedCanEnableSettingFinal,
-						  boolean expectedCanEnableSettingStatic,
-						  boolean expectedCanEnableInitInField,
-						  boolean expectedCanEnableInitInMethod,
-  						  boolean expectedCanEnableInitInConstructors) throws Exception{
-		ICompilationUnit cu= createCUfromEnablementTestFile(getPackageP());
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-        PromoteTempToFieldRefactoring ref= PromoteTempToFieldRefactoring.create(cu, selection.getOffset(), selection.getLength(), JavaPreferencesSettings.getCodeGenerationSettings());
-		RefactoringStatus result= ref.checkActivation(new NullProgressMonitor());
-		ref.setFieldName(newName);
-        ref.setDeclareFinal(declareFinal);
-        ref.setDeclareStatic(declareStatic);
-        ref.setInitializeIn(initializeIn);
-        ref.setVisibility(accessModifier);
-		
-		assertEquals("activation checking was supposed to pass", RefactoringStatus.OK, result.getSeverity());
-		
-		assertEquals("incorrect in-constructor enablement", expectedCanEnableInitInConstructors, 	ref.canEnableSettingDeclareInConstructors());
-		assertEquals("incorrect in-field enablement", 		expectedCanEnableInitInField, 			ref.canEnableSettingDeclareInFieldDeclaration());
-		assertEquals("incorrect in-method enablement", 		expectedCanEnableInitInMethod, 			ref.canEnableSettingDeclareInMethod());
-		assertEquals("incorrect static enablement", 		expectedCanEnableSettingStatic, 		ref.canEnableSettingStatic());
-		assertEquals("incorrect final enablement", 			expectedCanEnableSettingFinal, 			ref.canEnableSettingFinal());
-	}
-	private void enablementHelper1(int startLine, int startColumn, int endLine, int endColumn,
-						  boolean expectedCanEnableSettingFinal,
-						  boolean expectedCanEnableSettingStatic,
-						  boolean expectedCanEnableInitInField,
-						  boolean expectedCanEnableInitInMethod,
-  						  boolean expectedCanEnableInitInConstructors) throws Exception{
-  	   enablementHelper(startLine, startColumn, endLine, endColumn, "i", false, false, PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD, Modifier.PRIVATE, 
-  	   				expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}	
-
-	///---------------------- tests -------------------------//
-	
-	public void testEnablement0() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= true;
-        boolean expectedCanEnableInitInMethod			= true;
-        boolean expectedCanEnableInitInField			= true;
-        boolean expectedCanEnableSettingStatic			= true;
-        boolean expectedCanEnableSettingFinal			= true;
-        
-        String newName= "i";
-		boolean declareStatic = false;
-	  	boolean declareFinal= false;
-	  	int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_FIELD;
-	  	int accessModifier= Modifier.PRIVATE;
-        
-		enablementHelper(5, 13, 5, 14, newName, declareStatic, declareFinal, initializeIn, accessModifier,
-					expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-
-	public void testEnablement1() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= false;
-        boolean expectedCanEnableInitInMethod			= false;
-        boolean expectedCanEnableInitInField			= false;
-        boolean expectedCanEnableSettingStatic			= true;
-        boolean expectedCanEnableSettingFinal			= false;
-		enablementHelper1(5, 13, 5, 14, expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-	
-	public void testEnablement2() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= false;
-        boolean expectedCanEnableInitInMethod			= false;
-        boolean expectedCanEnableInitInField			= false;
-        boolean expectedCanEnableSettingStatic			= true;
-        boolean expectedCanEnableSettingFinal			= false;
-		enablementHelper1(5, 13, 5, 14, expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-	
-	public void testEnablement3() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= true;
-        boolean expectedCanEnableInitInMethod			= true;
-        boolean expectedCanEnableInitInField			= true;
-        boolean expectedCanEnableSettingStatic			= true;
-        boolean expectedCanEnableSettingFinal			= false;
-		enablementHelper1(5, 13, 5, 14, expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-	
-	public void testEnablement4() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= false;
-        boolean expectedCanEnableInitInMethod			= true;
-        boolean expectedCanEnableInitInField			= true;
-        boolean expectedCanEnableSettingStatic			= true;
-        boolean expectedCanEnableSettingFinal			= true;
-
-        String newName= "i";
-		boolean declareStatic = false;
-	  	boolean declareFinal= false;
-	  	int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_FIELD;
-	  	int accessModifier= Modifier.PRIVATE;
-
-		enablementHelper(5, 13, 5, 14, newName, declareStatic, declareFinal, initializeIn, accessModifier,
-					expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-	
-	public void testEnablement5() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= false;
-        boolean expectedCanEnableInitInMethod			= true;
-        boolean expectedCanEnableInitInField			= true;
-        boolean expectedCanEnableSettingStatic			= true;
-        boolean expectedCanEnableSettingFinal			= true;
-        
-        String newName= "i";
-		boolean declareStatic = false;
-	  	boolean declareFinal= false;
-	  	int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_FIELD;
-	  	int accessModifier= Modifier.PRIVATE;
-        
-		enablementHelper(7, 21, 7, 22, newName, declareStatic, declareFinal, initializeIn, accessModifier,
-					expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-	
-	public void testEnablement6() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= false;
-        boolean expectedCanEnableInitInMethod			= false;
-        boolean expectedCanEnableInitInField			= false;
-        boolean expectedCanEnableSettingStatic			= true;
-        boolean expectedCanEnableSettingFinal			= false;
-		enablementHelper1(7, 21, 7, 22, expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-	
-	public void testEnablement7() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= false;
-        boolean expectedCanEnableInitInMethod			= true;
-        boolean expectedCanEnableInitInField			= true;
-        boolean expectedCanEnableSettingStatic			= false;
-        boolean expectedCanEnableSettingFinal			= false;
-		enablementHelper1(5, 13, 5, 14, expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-
-	public void testEnablement8() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= true;
-        boolean expectedCanEnableInitInMethod			= true;
-        boolean expectedCanEnableInitInField			= true;
-        boolean expectedCanEnableSettingStatic			= false;
-        boolean expectedCanEnableSettingFinal			= true;
-        
-        String newName= "i";
-		boolean declareStatic = false;
-	  	boolean declareFinal= false;
-	  	int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR;
-	  	int accessModifier= Modifier.PRIVATE;
-        
-		enablementHelper(4, 13, 4, 14, newName, declareStatic, declareFinal, initializeIn, accessModifier,
-					expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-
-	public void testEnablement9() throws Exception{
-        boolean expectedCanEnableInitInConstructors	= false;
-        boolean expectedCanEnableInitInMethod			= true;
-        boolean expectedCanEnableInitInField			= true;
-        boolean expectedCanEnableSettingStatic			= true;
-        boolean expectedCanEnableSettingFinal			= false;
-        
-        String newName= "i";
-		boolean declareStatic = true;
-	  	boolean declareFinal= false;
-	  	int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-	  	int accessModifier= Modifier.PRIVATE;
-        
-		enablementHelper(4, 13, 4, 14, newName, declareStatic, declareFinal, initializeIn, accessModifier,
-					expectedCanEnableSettingFinal, expectedCanEnableSettingStatic, expectedCanEnableInitInField, expectedCanEnableInitInMethod, expectedCanEnableInitInConstructors);
-	}
-	
-	///---- test failing preconditions --------------
-	
-	public void testFail0() throws Exception{
-		failHelper(3, 16, 3, 17, "i", false, false, PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD, Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-
-	public void testFail1() throws Exception{
-		failHelper(5, 28, 5, 29, "i", false, false, PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD, Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-
-	public void testFail2() throws Exception{
-		failHelper(5, 15, 5, 16, "i", false, false, PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD, Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-
-	public void testFail3() throws Exception{
-		failHelper(5, 16, 5, 17, "i", false, false, PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR, Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-
-	public void testFail4() throws Exception{
-		failHelper(7, 13, 7, 14, "i", false, false, PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR, Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-
-	public void testFail5() throws Exception{
-		failHelper(6, 13, 6, 14, "i", false, false, PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD, Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-
-	public void testFail6() throws Exception{
-		failHelper(4, 18, 4, 19, "i", false, false, PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR, Modifier.PRIVATE, RefactoringStatus.FATAL);
-	}
-	
-	///----------- tests of transformation ------------
-
-	public void test0() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(5, 13, 5, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test1() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_FIELD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(5, 13, 5, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test2() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(7, 13, 7, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test3() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(9, 13, 9, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test4() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(5, 13, 5, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test5() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(6, 21, 6, 22, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test6() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_FIELD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(6, 21, 6, 22, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test7() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_FIELD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(4, 13, 4, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test8() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(4, 13, 4, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test9() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(5, 13, 5, 14, "field", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test10() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR;
-        boolean declareFinal= true;
-        boolean declareStatic= false;
-		passHelper(7, 13, 7, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test11() throws Exception{
-        int accessModifier= Modifier.PUBLIC;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(7, 13, 7, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test12() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= true;
-		passHelper(5, 13, 5, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test13() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= true;
-		passHelper(5, 13, 5, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test14() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= true;
-		passHelper(5, 19, 5, 20, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test15() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= true;
-		passHelper(5, 19, 5, 20, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test16() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(10, 13, 10, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test17() throws Exception{
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(4, 13, 4, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-	
-	public void test18() throws Exception{
-		printTestDisabledMessage("regression test for bug 39363");
-		if (true) return;
-		int accessModifier= Modifier.PRIVATE;
-		int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_CONSTRUCTOR;
-		boolean declareFinal= false;
-		boolean declareStatic= false;
-		passHelper(5, 13, 5, 14, "i", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test19() throws Exception{ //test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=49840
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(4, 13, 4, 22, "fSomeArray", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-
-	public void test20() throws Exception{ //test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=49840
-        int accessModifier= Modifier.PRIVATE;
-        int initializeIn= PromoteTempToFieldRefactoring.INITIALIZE_IN_METHOD;
-        boolean declareFinal= false;
-        boolean declareStatic= false;
-		passHelper(4, 24, 4, 24, "fDoubleDim", declareStatic, declareFinal, initializeIn, accessModifier);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PullUpTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PullUpTests.java
deleted file mode 100644
index 91028da..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PullUpTests.java
+++ /dev/null
@@ -1,1399 +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.jdt.ui.tests.refactoring;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.structure.PullUpRefactoring;
-import org.eclipse.jdt.internal.corext.refactoring.util.JavaElementUtil;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class PullUpTests extends RefactoringTest {
-
-	private static final Class clazz= PullUpTests.class;
-	
-	private static final String REFACTORING_PATH= "PullUp/";
-
-	public PullUpTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	public static Test setUpTest(Test someTest) {
-		return new MySetup(someTest);
-	}	
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	//-------------------
-	
-	private static PullUpRefactoring createRefactoring(IMember[] methods) throws JavaModelException{
-		return PullUpRefactoring.create(methods, JavaPreferencesSettings.getCodeGenerationSettings());
-	}
-	
-	private void fieldMethodHelper1(String[] fieldNames, String[] methodNames, String[][] signatures, boolean deleteAllInSourceType, boolean deleteAllMatchingMethods) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType type= getType(cu, "B");
-			IField[] fields= getFields(type, fieldNames);
-			IMethod[] methods= getMethods(type, methodNames, signatures);
-
-			PullUpRefactoring ref= createRefactoring(merge(methods, fields));
-//			assertTrue("preactivation", ref.checkPreactivation().isOK());
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-			setSuperclassAsTargetClass(ref);
-
-			if (deleteAllInSourceType)
-				ref.setMethodsToDelete(methods);
-			if (deleteAllMatchingMethods)
-				ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-								
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to pass", checkInputResult.isOK());	
-			performChange(ref.createChange(new NullProgressMonitor()));
-			
-			String expected= getFileContents(getOutputTestFileName("A"));
-			String actual= cu.getSource();
-			assertEqualLines(expected, actual);
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-
-	private IType[] getPossibleTargetClasses(PullUpRefactoring ref) throws JavaModelException{
-		return ref.getPossibleTargetClasses(new NullProgressMonitor());
-	}
-	
-	private void setSuperclassAsTargetClass(PullUpRefactoring ref) throws JavaModelException {
-		IType[] possibleClasses= getPossibleTargetClasses(ref);
-		ref.setTargetClass(possibleClasses[possibleClasses.length - 1]);
-	}
-	
-	private void setTargetClass(PullUpRefactoring ref, int targetClassIndex) throws JavaModelException{
-		IType[] possibleClasses= getPossibleTargetClasses(ref);
-		ref.setTargetClass(getPossibleTargetClasses(ref)[possibleClasses.length - 1 - targetClassIndex]);
-	}
-	
-	private void addRequiredMembersHelper(String[] fieldNames, String[] methodNames, String[][] methodSignatures, String[] expectedFieldNames, String[] expectedMethodNames, String[][] expectedMethodSignatures) throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType type= getType(cu, "B");
-			IField[] fields= getFields(type, fieldNames);
-			IMethod[] methods= getMethods(type, methodNames, methodSignatures);
-
-			IMember[] members= merge(methods, fields);
-			PullUpRefactoring ref= createRefactoring(members);
-//			assertTrue("preactivation", ref.checkPreactivation().isOK());
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-			setSuperclassAsTargetClass(ref);
-
-			List  additionalRequired= Arrays.asList(ref.getAdditionalRequiredMembersToPullUp(new NullProgressMonitor()));
-			List required= new ArrayList();
-			required.addAll(additionalRequired);
-			required.addAll(Arrays.asList(members));
-			IField[] expectedFields= getFields(type, expectedFieldNames);
-			IMethod[] expectedMethods= getMethods(type, expectedMethodNames, expectedMethodSignatures);
-			List expected= Arrays.asList(merge(expectedFields, expectedMethods));
-			assertEquals("incorrect size", expected.size(), required.size());
-			for (Iterator iter= expected.iterator(); iter.hasNext();) {
-				Object each= iter.next();
-				assertTrue ("required does not contain " + each, required.contains(each));
-			}
-			for (Iterator iter= required.iterator(); iter.hasNext();) {
-				Object each= iter.next();
-				assertTrue ("expected does not contain " + each, expected.contains(each));
-			}
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-
-	private void fieldHelper1(String[] fieldNames, int targetClassIndex) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType type= getType(cu, "B");
-			IField[] fields= getFields(type, fieldNames);
-			
-			PullUpRefactoring ref= createRefactoring(fields);
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-			setTargetClass(ref, targetClassIndex);
-		
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to pass", checkInputResult.isOK());	
-			performChange(ref.createChange(new NullProgressMonitor()));
-			
-			String expected= getFileContents(getOutputTestFileName("A"));
-			String actual= cu.getSource();
-			assertEqualLines(expected, actual);
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-	
-	private void fieldHelper2(String[] fieldNames, int targetClassIndex) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType type= getType(cu, "B");
-			IField[] fields= getFields(type, fieldNames);
-			PullUpRefactoring ref= createRefactoring(fields);
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-			setTargetClass(ref, targetClassIndex);
-
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to fail", ! checkInputResult.isOK());	
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}		
-	}
-	
-	private static IMethod[] getMethods(IMember[] members){
-		List l= Arrays.asList(JavaElementUtil.getElementsOfType(members, IJavaElement.METHOD));
-		return (IMethod[]) l.toArray(new IMethod[l.size()]);
-	}
-
-	private PullUpRefactoring createRefactoringPrepareForInputCheck(String[] selectedMethodNames, String[][] selectedMethodSignatures, 
-						String[] selectedFieldNames, 
-						String[] selectedTypeNames, String[] namesOfMethodsToPullUp, 
-						String[][] signaturesOfMethodsToPullUp, 
-						String[] namesOfFieldsToPullUp, String[] namesOfTypesToPullUp, 
-						String[] namesOfMethodsToDeclareAbstract, String[][] signaturesOfMethodsToDeclareAbstract, 
-						boolean deleteAllPulledUpMethods, boolean deleteAllMatchingMethods, int targetClassIndex, ICompilationUnit cu) throws CoreException {
-		IType type= getType(cu, "B");
-		IMethod[] selectedMethods= getMethods(type, selectedMethodNames, selectedMethodSignatures);
-		IField[] selectedFields= getFields(type, selectedFieldNames);
-		IType[] selectedTypes= getMemberTypes(type, selectedTypeNames);
-		IMember[] selectedMembers= merge(selectedFields, selectedMethods, selectedTypes);
-		
-		PullUpRefactoring ref= createRefactoring(selectedMembers);
-//		assertTrue("preactivation", ref.checkPreactivation().isOK());
-		assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-		
-		setTargetClass(ref, targetClassIndex);
-		
-		IMethod[] methodsToPullUp= findMethods(selectedMethods, namesOfMethodsToPullUp, signaturesOfMethodsToPullUp);
-		IField[] fieldsToPullUp= findFields(selectedFields, namesOfFieldsToPullUp);
-		IType[] typesToPullUp= findTypes(selectedTypes, namesOfTypesToPullUp);
-		IMember[] membersToPullUp= merge(methodsToPullUp, fieldsToPullUp, typesToPullUp);
-		
-		IMethod[] methodsToDeclareAbstract= findMethods(selectedMethods, namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract);
-		ref.setMembersToPullUp(membersToPullUp);
-		ref.setMethodsToDeclareAbstract(methodsToDeclareAbstract);
-		if (deleteAllPulledUpMethods && methodsToPullUp.length != 0)
-			ref.setMethodsToDelete(methodsToPullUp);
-		if (deleteAllMatchingMethods && methodsToPullUp.length != 0)
-			ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-		return ref;
-	}
-	
-	private void declareAbstractFailHelper(String[] selectedMethodNames, String[][] selectedMethodSignatures,
-											String[] selectedFieldNames,
-											String[] selectedTypeNames, String[] namesOfMethodsToPullUp, 
-											String[][] signaturesOfMethodsToPullUp, String[] namesOfFieldsToPullUp, 
-											String[] namesOfMethodsToDeclareAbstract,
-											String[][] signaturesOfMethodsToDeclareAbstract, String[] namesOfTypesToPullUp,
-											boolean deleteAllPulledUpMethods, boolean deleteAllMatchingMethods, int targetClassIndex) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			PullUpRefactoring ref= createRefactoringPrepareForInputCheck(selectedMethodNames, selectedMethodSignatures, selectedFieldNames, selectedTypeNames, namesOfMethodsToPullUp, signaturesOfMethodsToPullUp, namesOfFieldsToPullUp, namesOfTypesToPullUp, namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, deleteAllPulledUpMethods, deleteAllMatchingMethods, targetClassIndex, cu);
-
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to fail", ! checkInputResult.isOK());	
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-
-	private void declareAbstractHelper(String[] selectedMethodNames, String[][] selectedMethodSignatures,
-											String[] selectedFieldNames,
-											String[] selectedTypeNames, String[] namesOfMethodsToPullUp, 
-											String[][] signaturesOfMethodsToPullUp, String[] namesOfFieldsToPullUp, 
-											String[] namesOfMethodsToDeclareAbstract,
-											String[][] signaturesOfMethodsToDeclareAbstract, String[] namesOfTypesToPullUp,
-											boolean deleteAllPulledUpMethods, boolean deleteAllMatchingMethods, int targetClassIndex) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			PullUpRefactoring ref= createRefactoringPrepareForInputCheck(selectedMethodNames, selectedMethodSignatures, selectedFieldNames, selectedTypeNames, namesOfMethodsToPullUp, signaturesOfMethodsToPullUp, namesOfFieldsToPullUp, namesOfTypesToPullUp, namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, deleteAllPulledUpMethods, deleteAllMatchingMethods, targetClassIndex, cu);
-
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to pass", checkInputResult.isOK());	
-			performChange(ref.createChange(new NullProgressMonitor()));
-
-			String expected= getFileContents(getOutputTestFileName("A"));
-			String actual= cu.getSource();
-			assertEqualLines(expected, actual);
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-
-	private void helper1(String[] methodNames, String[][] signatures, boolean deleteAllInSourceType, boolean deleteAllMatchingMethods, int targetClassIndex) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType type= getType(cu, "B");
-			IMethod[] methods= getMethods(type, methodNames, signatures);
-			PullUpRefactoring ref= createRefactoring(methods);
-//			assertTrue("preactivation", ref.checkPreactivation().isOK());
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-
-			setTargetClass(ref, targetClassIndex);
-			if (deleteAllInSourceType)
-				ref.setMethodsToDelete(methods);
-			if (deleteAllMatchingMethods)
-				ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-		
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to pass", checkInputResult.isOK());	
-			performChange(ref.createChange(new NullProgressMonitor()));
-			
-			String expected= getFileContents(getOutputTestFileName("A"));
-			String actual= cu.getSource();
-			assertEqualLines(expected, actual);
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-	
-	private void helper2(String[] methodNames, String[][] signatures, boolean deleteAllInSourceType, boolean deleteAllMatchingMethods, int targetClassIndex) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType type= getType(cu, "B");
-			IMethod[] methods= getMethods(type, methodNames, signatures);
-			PullUpRefactoring ref= createRefactoring(methods);
-//			assertTrue("preactivation", ref.checkPreactivation().isOK());
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-			setTargetClass(ref, targetClassIndex);
-			if (deleteAllInSourceType)
-				ref.setMethodsToDelete(methods);
-			if (deleteAllMatchingMethods)
-				ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-		
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to fail", ! checkInputResult.isOK());	
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}		
-	}
-	
-	private void helper3(String[] methodNames, String[][] signatures, boolean deleteAllInSourceType, boolean deleteAllMatchingMethods, int targetClassIndex, boolean shouldActivationCheckPass) throws Exception {
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(getPackageP(), "B");
-		try{
-			IType type= getType(cuB, "B");
-			IMethod[] methods= getMethods(type, methodNames, signatures);
-			PullUpRefactoring ref= createRefactoring(methods);
-//			assertTrue("preactivation", ref.checkPreactivation().isOK());
-			assertEquals("activation", shouldActivationCheckPass, ref.checkActivation(new NullProgressMonitor()).isOK());
-			if (! shouldActivationCheckPass)
-				return;
-			setTargetClass(ref, targetClassIndex);			
-			if (deleteAllInSourceType)
-				ref.setMethodsToDelete(methods);
-			if (deleteAllMatchingMethods)
-				ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to fail", ! checkInputResult.isOK());	
-		} finally{
-			performDummySearch();
-			cuA.delete(false, null);
-			cuB.delete(false, null);
-		}				
-	}
-	
-	//------------------ tests -------------
-	
-	public void test0() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void test1() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void test2() throws Exception{
-		helper1(new String[]{"mmm", "n"}, new String[][]{new String[0], new String[0]}, true, false, 0);
-	}
-
-	public void test3() throws Exception{
-		helper1(new String[]{"mmm", "n"}, new String[][]{new String[0], new String[0]}, true, true, 0);
-	}
-
-	public void test4() throws Exception{
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(getPackageP(), "B");
-		
-		try{
-			String[] methodNames= new String[]{"m"};
-			String[][] signatures= new String[][]{new String[]{"QList;"}};
-			
-			IType type= getType(cuB, "B");
-			IMethod[] methods= getMethods(type, methodNames, signatures);
-			PullUpRefactoring ref= createRefactoring(methods);
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-			setSuperclassAsTargetClass(ref);
-
-			ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-		
-			RefactoringStatus result= performRefactoring(ref);
-			assertEquals("precondition was supposed to pass", null, result);
-			
-			assertEqualLines("A", cuA.getSource(), getFileContents(getOutputTestFileName("A")));
-			assertEqualLines("B", cuB.getSource(), getFileContents(getOutputTestFileName("B")));
-		} finally{
-			performDummySearch();
-			cuA.delete(false, null);
-			cuB.delete(false, null);
-		}					
-	}
-
-	public void test5() throws Exception{
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(getPackageP(), "B");
-		
-		try{
-			String[] methodNames= new String[]{"m"};
-			String[][] signatures= new String[][]{new String[0]};
-			
-			IType type= getType(cuB, "B");
-			IMethod[] methods= getMethods(type, methodNames, signatures);
-			PullUpRefactoring ref= createRefactoring(methods);
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-			setSuperclassAsTargetClass(ref);
-
-			ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-		
-			RefactoringStatus result= performRefactoring(ref);
-			assertEquals("precondition was supposed to pass", null, result);
-			
-			assertEqualLines("A", cuA.getSource(), getFileContents(getOutputTestFileName("A")));
-			assertEqualLines("B", cuB.getSource(), getFileContents(getOutputTestFileName("B")));
-		} finally{
-			performDummySearch();
-			cuA.delete(false, null);
-			cuB.delete(false, null);
-		}		
-	}
-
-	public void test6() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void test7() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void test8() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void test9() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void test10() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void test11() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void test12() throws Exception{
-		//printTestDisabledMessage("bug#6779 searchDeclarationsOfReferencedTyped - missing exception  types");
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(getPackageP(), "B");
-
-		try{
-			String[] methodNames= new String[]{"m"};
-			String[][] signatures= new String[][]{new String[0]};
-			
-			IType type= getType(cuB, "B");
-			IMethod[] methods= getMethods(type, methodNames, signatures);
-			PullUpRefactoring ref= createRefactoring(methods);
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-			setSuperclassAsTargetClass(ref);
-			ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-		
-			RefactoringStatus result= performRefactoring(ref);
-			assertEquals("precondition was supposed to pass", null, result);
-			
-			assertEqualLines("A", cuA.getSource(), getFileContents(getOutputTestFileName("A")));
-			assertEqualLines("B", cuB.getSource(), getFileContents(getOutputTestFileName("B")));
-		} finally{
-			performDummySearch();
-			cuA.delete(false, null);
-			cuB.delete(false, null);
-		}							
-	}
-	
-	public void test13() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void test14() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void test15() throws Exception{
-		printTestDisabledMessage("must fix - incorrect error");
-//		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false);
-	}
-	
-	public void test16() throws Exception{
-		printTestDisabledMessage("must fix - incorrect error");
-//		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false);
-	}
-	
-	public void test17() throws Exception{
-		printTestDisabledMessage("must fix - incorrect error with static method access");
-//		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false);
-	}
-
-	public void test18() throws Exception{
-		printTestDisabledMessage("must fix - incorrect error with static field access");
-//		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false);
-	}
-	
-	public void test19() throws Exception{
-//		printTestDisabledMessage("bug 18438");
-//		printTestDisabledMessage("bug 23324 ");
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void test20() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 1);
-	}
-
-	public void test21() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 1);
-	}
-
-	public void test22() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void test23() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void test24() throws Exception{
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void test25() throws Exception{
-//		printTestDisabledMessage("bug in ASTRewrite - extra dimentions 29553");
-		helper1(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void test26() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test27() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-	
-	public void test28() throws Exception{
-//		printTestDisabledMessage("unimplemented (increase method visibility if declare abstract in superclass)");
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test29() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[]{"[I"}};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-	
-	public void test30() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[]{"[I"}};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-	
-	public void test31() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[]{"[I"}};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test32() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-	
-	public void test33() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= selectedMethodNames;
-		String[][] signaturesOfMethodsToPullUp= selectedMethodSignatures;
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {new String[0]};
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test34() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test35() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test36() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test37() throws Exception{
-		String[] selectedMethodNames= {"m", "f"};
-		String[][] selectedMethodSignatures= {new String[0], new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {"m"};
-		String[][] signaturesOfMethodsToPullUp= {new String[0]};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= {"f"};
-		String[][] signaturesOfMethodsToDeclareAbstract= {new String[0]};
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test38() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {"A"};
-		String[] namesOfMethodsToPullUp= {"m"};
-		String[][] signaturesOfMethodsToPullUp= {new String[0]};
-		String[] namesOfFieldsToPullUp= {"A"};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void test39() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {"A"};
-		String[] selectedTypeNames= {"X", "Y"};
-		String[] namesOfMethodsToPullUp= {"m"};
-		String[][] signaturesOfMethodsToPullUp= {new String[0]};
-		String[] namesOfFieldsToPullUp= {"A"};
-		String[] namesOfTypesToPullUp= {"X", "Y"};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	public void test40() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] selectedTypeNames= {};
-		String[] namesOfMethodsToPullUp= {"m"};
-		String[][] signaturesOfMethodsToPullUp= {new String[0]};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfTypesToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	public void test41() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"i"};
-		String[] selectedTypeNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {"i"};
-		String[] namesOfTypesToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	public void test42() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"i", "j"};
-		String[] selectedTypeNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {"i", "j"};
-		String[] namesOfTypesToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	public void test43() throws Exception{
-//		printTestDisabledMessage("bug 35562 Method pull up wrongly indents javadoc comment [refactoring]");
-		
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] selectedTypeNames= {};
-		String[] namesOfMethodsToPullUp= selectedMethodNames;
-		String[][] signaturesOfMethodsToPullUp= selectedMethodSignatures;
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfTypesToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		declareAbstractHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	public void testFail0() throws Exception{
-//		printTestDisabledMessage("6538: searchDeclarationsOf* incorrect");
-		helper2(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void testFail1() throws Exception{
-		printTestDisabledMessage("overloading - current limitation");
-//		helper2(new String[]{"m"}, new String[][]{new String[0]}, true, false);
-	}
-	
-	public void testFail2() throws Exception{
-//		printTestDisabledMessage("6538: searchDeclarationsOf* incorrect");
-		helper2(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void testFail3() throws Exception{
-//		printTestDisabledMessage("6538: searchDeclarationsOf* incorrect");
-		helper2(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void testFail4() throws Exception{
-//		printTestDisabledMessage("6538: searchDeclarationsOf* incorrect");
-		helper2(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-
-	public void testFail5() throws Exception{
-		helper2(new String[]{"m"}, new String[][]{new String[0]}, true, false, 0);
-	}
-	
-	public void testFail6() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		
-		helper3(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 0, true);
-	}
-	
-	public void testFail7() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper3(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 0, false);
-	}
-	
-	public void testFail8() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper3(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 0, true);
-	}
-	
-	public void testFail9() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper3(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 0, true);
-	}
-	
-	public void testFail10() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper3(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 0, false);
-	}
-
-	public void testFail11() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper3(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 0, true);
-	}
-
-	public void testFail12() throws Exception{
-		printTestDisabledMessage("overloading - current limitation");
-//		String[] methodNames= new String[]{"m"};
-//		String[][] signatures= new String[][]{new String[0]};
-//		boolean deleteAllInSourceType= true;
-//		boolean deleteAllMatchingMethods= false;
-//		helper3(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods);
-	}
-
-	public void testFail13() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper2(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 0);
-	}
-	
-	public void testFail14() throws Exception{
-		//removed - this (pulling up classes) is allowed now
-				
-//		String[] methodNames= new String[]{"m"};
-//		String[][] signatures= new String[][]{new String[0]};
-//		boolean deleteAllInSourceType= true;
-//		boolean deleteAllMatchingMethods= false;
-//		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-//		try{
-//			IType type= getType(cu, "A");
-//			IMethod[] methods= getMethods(type, methodNames, signatures);
-//			IMember[] members= merge(methods, new IMember[]{type.getType("Quux")});
-//
-//			PullUpRefactoring ref= createRefactoring(members);
-//			assertTrue("preactivation", ref.checkPreactivation().isOK());
-//			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-//			setSuperclassAsTargetClass(ref);
-//			if (deleteAllInSourceType)
-//				ref.setMethodsToDelete(methods);
-//			if (deleteAllMatchingMethods)
-//				ref.setMethodsToDelete(getMethods(ref.getMatchingElements(new NullProgressMonitor(), false)));
-//		
-//			RefactoringStatus result= performRefactoring(ref);
-//
-//			assertTrue("precondition was supposed to fail", result != null && ! result.isOK());
-//		} finally{
-//			performDummySearch();
-//			cu.delete(false, null);
-//		}		
-	}
-	
-	public void testFail15() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper2(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 1);
-	}
-
-	public void testFail16() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper2(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 1);
-	}
-
-	public void testFail17() throws Exception{
-		printTestDisabledMessage("unimplemented test - see bug 29522");
-//		String[] methodNames= new String[]{"m"};
-//		String[][] signatures= new String[][]{new String[0]};
-//		boolean deleteAllInSourceType= true;
-//		boolean deleteAllMatchingMethods= false;
-//		helper2(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 1);
-	}
-
-	public void testFail18() throws Exception{
-		printTestDisabledMessage("unimplemented test - see bug 29522");
-//		String[] methodNames= new String[]{"m"};
-//		String[][] signatures= new String[][]{new String[0]};
-//		boolean deleteAllInSourceType= true;
-//		boolean deleteAllMatchingMethods= false;
-//		helper2(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 0);
-	}
-
-	public void testFail19() throws Exception{
-		String[] methodNames= new String[]{"m"};
-		String[][] signatures= new String[][]{new String[0]};
-		boolean deleteAllInSourceType= true;
-		boolean deleteAllMatchingMethods= false;
-		helper2(methodNames, signatures, deleteAllInSourceType, deleteAllMatchingMethods, 1);
-	}
-
-	public void testFail20() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void testFail21() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void testFail22() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void testFail23() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void testFail24() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								new String[0], namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, new String[0], true, true, 0);
-	}
-
-	public void testFail25() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {};
-		String[] selectedTypeNames= {"Test"};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfTypesToPullUp= {"Test"};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	public void testFail26() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {};
-		String[] selectedTypeNames= {"Test"};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfTypesToPullUp= {"Test"};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	public void testFail27() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {};
-		String[] selectedTypeNames= {"A"};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfTypesToPullUp= {"A"};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	public void testFail28() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {};
-		String[] selectedTypeNames= {"Test"};
-		String[] namesOfMethodsToPullUp= {};
-		String[][] signaturesOfMethodsToPullUp= {};
-		String[] namesOfFieldsToPullUp= {};
-		String[] namesOfTypesToPullUp= {"Test"};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		declareAbstractFailHelper(selectedMethodNames, selectedMethodSignatures, 
-								selectedFieldNames,	
-								selectedTypeNames, namesOfMethodsToPullUp, 
-								signaturesOfMethodsToPullUp, 
-								namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, 
-								signaturesOfMethodsToDeclareAbstract, namesOfTypesToPullUp, true, true, 0);
-	}
-
-	//----------------------------------------------------------
-	public void testField0() throws Exception{
-		fieldHelper1(new String[]{"i"}, 0);
-	}
-	
-	public void testFieldFail0() throws Exception{
-		fieldHelper2(new String[]{"x"}, 0);
-	}
-	
-	public void testFieldFail1() throws Exception{
-		fieldHelper2(new String[]{"x"}, 0);
-	}
-
-	public void testFieldFail2() throws Exception{
-		fieldHelper2(new String[]{"f"}, 1);
-	}
-
-	//---------------------------------------------------------
-	public void testFieldMethod0() throws Exception{
-//		printTestDisabledMessage("bug 23324 ");
-		fieldMethodHelper1(new String[]{"f"}, new String[]{"m"}, new String[][]{new String[0]}, true, false);
-	}
-	
-	//----
-	public void testAddingRequiredMembers0() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers1() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers2() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers3() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"m", "y"};
-		String[][] expectedMethodSignatures= {new String[0], new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers4() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"m", "y"};
-		String[][] expectedMethodSignatures= {new String[0], new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers5() throws Exception{
-		String[] fieldNames= {"y"};
-		String[] methodNames= {};
-		String[][] methodSignatures= {};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"m"};
-		String[][] expectedMethodSignatures= {new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers6() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers7() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers8() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"m", "foo"};
-		String[][] expectedMethodSignatures= {new String[0], new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers9() throws Exception{
-		String[] fieldNames= {"m"};
-		String[] methodNames= {};
-		String[][] methodSignatures= {};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers10() throws Exception{
-		String[] fieldNames= {"m"};
-		String[] methodNames= {};
-		String[][] methodSignatures= {};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"foo"};
-		String[][] expectedMethodSignatures= {new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers11() throws Exception{
-		String[] fieldNames= {"m"};
-		String[] methodNames= {};
-		String[][] methodSignatures= {};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"foo"};
-		String[][] expectedMethodSignatures= {new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers12() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"foo", "m"};
-		String[][] expectedMethodSignatures= {new String[0], new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-	
-	public void testEnablement0() throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType typeB= cu.getType("B");
-		IMember[] members= {typeB};
-		assertTrue("should be enabled", PullUpRefactoring.isAvailable(members));
-	}
-
-	public void testEnablement1() throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType typeB= cu.getType("B");
-		IType typeD= cu.getType("D");
-		IMember[] members= {typeB, typeD};
-		assertTrue("should be disabled", ! PullUpRefactoring.isAvailable(members));
-	}
-
-	public void testEnablement2() throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType typeB= cu.getType("Outer").getType("B");
-		IMember[] members= {typeB};
-		assertTrue("should be disabled", ! PullUpRefactoring.isAvailable(members));
-	}
-
-	public void testEnablement3() throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType typeB= cu.getType("B");
-		IMember[] members= {typeB};
-		assertTrue("should be disabled", ! PullUpRefactoring.isAvailable(members));
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PushDownTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PushDownTests.java
deleted file mode 100644
index 4ade73c..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PushDownTests.java
+++ /dev/null
@@ -1,1138 +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.jdt.ui.tests.refactoring;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.structure.PushDownRefactoring;
-import org.eclipse.jdt.internal.corext.refactoring.structure.PushDownRefactoring.MemberActionInfo;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class PushDownTests extends RefactoringTest {
-
-	private static final Class clazz= PushDownTests.class;
-	
-	private static final String REFACTORING_PATH= "PushDown/";
-
-	public PushDownTests(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	private static PushDownRefactoring createRefactoring(IMember[] members) throws JavaModelException{
-		return PushDownRefactoring.create(members, JavaPreferencesSettings.getCodeGenerationSettings());
-	}
-
-	private PushDownRefactoring createRefactoringPrepareForInputCheck(String[] selectedMethodNames, String[][] selectedMethodSignatures, 
-						String[] selectedFieldNames, 
-						String[] namesOfMethodsToPullUp, String[][] signaturesOfMethodsToPullUp, 
-						String[] namesOfFieldsToPullUp, 
-						String[] namesOfMethodsToDeclareAbstract, String[][] signaturesOfMethodsToDeclareAbstract,
-						ICompilationUnit cu) throws CoreException {
-							
-		IType type= getType(cu, "A");
-		IMethod[] selectedMethods= getMethods(type, selectedMethodNames, selectedMethodSignatures);
-		IField[] selectedFields= getFields(type, selectedFieldNames);
-		IMember[] selectedMembers= merge(selectedFields, selectedMethods);
-		
-		PushDownRefactoring ref= createRefactoring(selectedMembers);
-//		assertTrue("preactivation", ref.checkPreactivation().isOK());
-		assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-		
-		prepareForInputCheck(ref, selectedMethods, selectedFields, namesOfMethodsToPullUp, signaturesOfMethodsToPullUp, namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract);
-		return ref;
-	}
-
-	private void prepareForInputCheck(PushDownRefactoring ref, IMethod[] selectedMethods, IField[] selectedFields, String[] namesOfMethodsToPullUp, String[][] signaturesOfMethodsToPullUp, String[] namesOfFieldsToPullUp, String[] namesOfMethodsToDeclareAbstract, String[][] signaturesOfMethodsToDeclareAbstract) {
-		IMethod[] methodsToPushDown= findMethods(selectedMethods, namesOfMethodsToPullUp, signaturesOfMethodsToPullUp);
-		IField[] fieldsToPushDown= findFields(selectedFields, namesOfFieldsToPullUp);
-		List membersToPushDown= Arrays.asList(merge(methodsToPushDown, fieldsToPushDown));
-		List methodsToDeclareAbstract= Arrays.asList(findMethods(selectedMethods, namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract));
-		
-		PushDownRefactoring.MemberActionInfo[] infos= ref.getMemberActionInfos();
-		for (int i= 0; i < infos.length; i++) {
-			if (membersToPushDown.contains(infos[i].getMember())){
-				infos[i].setAction(MemberActionInfo.PUSH_DOWN_ACTION);
-				assertTrue(! methodsToDeclareAbstract.contains(infos[i].getMember()));
-			}
-			if (methodsToDeclareAbstract.contains(infos[i].getMember())){
-				infos[i].setAction(MemberActionInfo.PUSH_ABSTRACT_ACTION);
-				assertTrue(! membersToPushDown.contains(infos[i].getMember()));
-			}
-		}
-	}
-
-	private void helper(String[] selectedMethodNames, String[][] selectedMethodSignatures,
-						String[] selectedFieldNames,
-						String[] namesOfMethodsToPullUp, String[][] signaturesOfMethodsToPullUp, 
-						String[] namesOfFieldsToPullUp, String[] namesOfMethodsToDeclareAbstract, 
-						String[][] signaturesOfMethodsToDeclareAbstract, String[] additionalCuNames, String[] additionalPackNames) throws Exception{
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		
-		IPackageFragment[] addtionalPacks= createAdditionalPackages(additionalCuNames, additionalPackNames);
-		ICompilationUnit[] additonalCus= createAdditionalCus(additionalCuNames, addtionalPacks);
-		
-		try{
-			PushDownRefactoring ref= createRefactoringPrepareForInputCheck(selectedMethodNames, selectedMethodSignatures, selectedFieldNames, namesOfMethodsToPullUp, signaturesOfMethodsToPullUp, namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, cuA);
-
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertTrue("precondition was supposed to pass but got " + checkInputResult.toString(), checkInputResult.isOK());	
-			performChange(ref.createChange(new NullProgressMonitor()));
-
-			String expected= getFileContents(getOutputTestFileName("A"));
-			String actual= cuA.getSource();
-			assertEqualLines("A.java", expected, actual);
-			
-			for (int i= 0; i < additonalCus.length; i++) {
-				ICompilationUnit unit= additonalCus[i];
-				String expectedS= getFileContents(getOutputTestFileName(additionalCuNames[i]));
-				String actualS= unit.getSource();
-				assertEqualLines(unit.getElementName(), expectedS, actualS);
-			}
-			
-		} finally{
-			performDummySearch();
-			cuA.delete(false, null);
-			for (int i= 0; i < additonalCus.length; i++) {
-				additonalCus[i].delete(false, null);
-			}
-			for (int i= 0; i < addtionalPacks.length; i++) {
-				if (! addtionalPacks[i].equals(getPackageP()))
-					addtionalPacks[i].delete(false, null);
-			}
-		}	
-	}
-
-	private ICompilationUnit[] createAdditionalCus(String[] additionalCuNames, IPackageFragment[] addtionalPacks) throws Exception {
-		ICompilationUnit[] additonalCus= new ICompilationUnit[0];
-		if (additionalCuNames != null){
-			additonalCus= new ICompilationUnit[additionalCuNames.length];
-			for (int i= 0; i < additonalCus.length; i++) {
-				additonalCus[i]= createCUfromTestFile(addtionalPacks[i], additionalCuNames[i]);
-			}
-		}
-		return additonalCus;
-	}
-
-	private IPackageFragment[] createAdditionalPackages(String[] additionalCuNames, String[] additionalPackNames) {
-		IPackageFragment[] additionalPacks= new IPackageFragment[0];
-		if (additionalPackNames != null){
-			additionalPacks= new IPackageFragment[additionalPackNames.length];
-			assertTrue(additionalPackNames.length == additionalCuNames.length);
-			for (int i= 0; i < additionalPackNames.length; i++) {
-				additionalPacks[i]= getRoot().getPackageFragment(additionalPackNames[i]);
-			}
-		}
-		return additionalPacks;
-	}
-
-	private void failActivationHelper(String[] selectedMethodNames, String[][] selectedMethodSignatures,
-										String[] selectedFieldNames,
-										String[] namesOfMethodsToPullUp, String[][] signaturesOfMethodsToPullUp, 
-										String[] namesOfFieldsToPullUp, String[] namesOfMethodsToDeclareAbstract, 
-										String[][] signaturesOfMethodsToDeclareAbstract,
-										int expectedSeverity) throws Exception{
-												
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType type= getType(cu, "A");
-			IMethod[] selectedMethods= getMethods(type, selectedMethodNames, selectedMethodSignatures);
-			IField[] selectedFields= getFields(type, selectedFieldNames);
-			IMember[] selectedMembers= merge(selectedFields, selectedMethods);
-		
-			PushDownRefactoring ref= createRefactoring(selectedMembers);
-//			assertTrue("preactivation", ref.checkPreactivation().isOK());
-			assertEquals("activation was expected to fail", expectedSeverity, ref.checkActivation(new NullProgressMonitor()).getSeverity());
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-
-	private void failInputHelper(String[] selectedMethodNames, String[][] selectedMethodSignatures,
-											String[] selectedFieldNames,
-											String[] namesOfMethodsToPullUp, String[][] signaturesOfMethodsToPullUp, 
-											String[] namesOfFieldsToPullUp, String[] namesOfMethodsToDeclareAbstract, 
-											String[][] signaturesOfMethodsToDeclareAbstract,
-											int expectedSeverity) throws Exception{
-												
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			PushDownRefactoring ref= createRefactoringPrepareForInputCheck(selectedMethodNames, selectedMethodSignatures, selectedFieldNames, namesOfMethodsToPullUp, signaturesOfMethodsToPullUp, namesOfFieldsToPullUp, namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, cu);
-			RefactoringStatus checkInputResult= ref.checkInput(new NullProgressMonitor());
-			assertEquals("precondition was expected to fail", expectedSeverity, checkInputResult.getSeverity());	
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-
-	private void addRequiredMembersHelper(String[] fieldNames, String[] methodNames, String[][] methodSignatures, String[] expectedFieldNames, String[] expectedMethodNames, String[][] expectedMethodSignatures) throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType type= getType(cu, "A");
-			IField[] fields= getFields(type, fieldNames);
-			IMethod[] methods= getMethods(type, methodNames, methodSignatures);
-
-			IMember[] members= merge(methods, fields);
-			PushDownRefactoring ref= createRefactoring(members);
-//			assertTrue("preactivation", ref.checkPreactivation().isOK());
-			assertTrue("activation", ref.checkActivation(new NullProgressMonitor()).isOK());
-
-			ref.computeAdditionalRequiredMembersToPushDown(new NullProgressMonitor());
-			List required= getMembersToPushDown(ref);
-			ref.getMemberActionInfos();
-			IField[] expectedFields= getFields(type, expectedFieldNames);
-			IMethod[] expectedMethods= getMethods(type, expectedMethodNames, expectedMethodSignatures);
-			List expected= Arrays.asList(merge(expectedFields, expectedMethods));
-			assertEquals("incorrect size", expected.size(), required.size());
-			for (Iterator iter= expected.iterator(); iter.hasNext();) {
-				Object each= iter.next();
-				assertTrue ("required does not contain " + each, required.contains(each));
-			}
-			for (Iterator iter= required.iterator(); iter.hasNext();) {
-				Object each= iter.next();
-				assertTrue ("expected does not contain " + each, expected.contains(each));
-			}
-		} finally{
-			performDummySearch();
-			cu.delete(false, null);
-		}	
-	}
-	
-	private static List getMembersToPushDown(PushDownRefactoring ref){
-		MemberActionInfo[] infos= ref.getMemberActionInfos();
-		List result= new ArrayList(infos.length);
-		for (int i= 0; i < infos.length; i++) {
-			if (infos[i].isToBePushedDown())
-				result.add(infos[i].getMember());
-		}
-		return result;
-	}
-	
-	//--------------------------------------------------------
-	
-	public void test0() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test1() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test2() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test3() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test4() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test5() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test6() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test7() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test8() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test9() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test10() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test11() throws Exception{
-		String[] selectedMethodNames= {"m"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test12() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"f"};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {"f"};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test13() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"f"};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {"f"};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test14() throws Exception{
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test15() throws Exception{
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test16() throws Exception{
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test17() throws Exception{
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test18() throws Exception{
-		String[] selectedMethodNames= {"f", "m"};
-		String[][] selectedMethodSignatures= {new String[0], new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test19() throws Exception{
-		String[] selectedMethodNames= {"f", "m"};
-		String[][] selectedMethodSignatures= {new String[0], new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test20() throws Exception{
-		String[] selectedMethodNames= {"f", "m"};
-		String[][] selectedMethodSignatures= {new String[0], new String[0]};
-		String[] selectedFieldNames= {"i"};
-		String[] namesOfMethodsToPushDown= {"f"};
-		String[][] signaturesOfMethodsToPushDown= {new String[0]};
-		String[] namesOfFieldsToPushDown= {"i"};
-		String[] namesOfMethodsToDeclareAbstract= {"m"};
-		String[][] signaturesOfMethodsToDeclareAbstract= {new String[0]};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, 
-			   new String[]{"B"}, new String[]{"p"});
-	}
-
-	public void test21() throws Exception{
-		String[] selectedMethodNames= {"f", "m"};
-		String[][] selectedMethodSignatures= {new String[0], new String[0]};
-		String[] selectedFieldNames= {"i"};
-		String[] namesOfMethodsToPushDown= {"f", "m"};
-		String[][] signaturesOfMethodsToPushDown= {new String[0], new String[0]};
-		String[] namesOfFieldsToPushDown= {"i"};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, 
-			   new String[]{"B", "C"}, new String[]{"p", "p"});
-	}
-
-	public void test22() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"bar"};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= selectedFieldNames;
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-	
-	public void test23() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"bar"};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= selectedFieldNames;
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test24() throws Exception{
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"foo", "bar"};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= selectedFieldNames;
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test25() throws Exception{
-		String[] selectedMethodNames= {"foo"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test26() throws Exception{
-		String[] selectedMethodNames= {"bar"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test27() throws Exception{
-		String[] selectedMethodNames= {"bar"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-
-	public void test28() throws Exception{
-//		if (true){
-//			printTestDisabledMessage("37175");
-//			return;
-//		}
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"i", "j"};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {"i", "j"};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		helper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract, null, null);
-	}
-	
-	public void testFail0() throws Exception {
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failActivationHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.FATAL);
-	}
-
-	public void testFail1() throws Exception {
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failActivationHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.FATAL);
-	}
-
-	public void testFail2() throws Exception {
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail3() throws Exception {
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"i"};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= selectedFieldNames;
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail4() throws Exception {
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail5() throws Exception {
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail6() throws Exception {
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail7() throws Exception {
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail8() throws Exception {
-		String[] selectedMethodNames= {"f"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail9() throws Exception {
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"f"};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= selectedFieldNames;
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail10() throws Exception {
-		String[] selectedMethodNames= {"foo"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail11() throws Exception {
-		String[] selectedMethodNames= {"foo"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= selectedMethodNames;
-		String[][] signaturesOfMethodsToPushDown= selectedMethodSignatures;
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail12() throws Exception {
-		String[] selectedMethodNames= {};
-		String[][] selectedMethodSignatures= {};
-		String[] selectedFieldNames= {"bar"};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= selectedFieldNames;
-		String[] namesOfMethodsToDeclareAbstract= {};
-		String[][] signaturesOfMethodsToDeclareAbstract= {};
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-
-	public void testFail13() throws Exception {
-		String[] selectedMethodNames= {"foo"};
-		String[][] selectedMethodSignatures= {new String[0]};
-		String[] selectedFieldNames= {};
-		String[] namesOfMethodsToPushDown= {};
-		String[][] signaturesOfMethodsToPushDown= {};
-		String[] namesOfFieldsToPushDown= {};
-		String[] namesOfMethodsToDeclareAbstract= selectedMethodNames;
-		String[][] signaturesOfMethodsToDeclareAbstract= selectedMethodSignatures;
-		
-		failInputHelper(selectedMethodNames, selectedMethodSignatures, 
-			   selectedFieldNames,	
-			   namesOfMethodsToPushDown, signaturesOfMethodsToPushDown, 
-			   namesOfFieldsToPushDown, 
-			   namesOfMethodsToDeclareAbstract, signaturesOfMethodsToDeclareAbstract,
-			   RefactoringStatus.ERROR);
-	}
-	
-	public void testAddingRequiredMembers0() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers1() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers2() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers3() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"m", "f"};
-		String[][] expectedMethodSignatures= {new String[0], new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers4() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m", "f"};
-		String[][] methodSignatures= {new String[0], new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers5() throws Exception{
-		String[] fieldNames= {};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= {"f"};
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers6() throws Exception{
-		String[] fieldNames= {"f"};
-		String[] methodNames= {"m"};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= methodNames;
-		String[][] expectedMethodSignatures= methodSignatures;
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers7() throws Exception{
-		String[] fieldNames= {"f"};
-		String[] methodNames= {};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= fieldNames;
-		String[] expectedMethodNames= {"m"};
-		String[][] expectedMethodSignatures= {new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers8() throws Exception{
-		String[] fieldNames= {"f"};
-		String[] methodNames= {};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= {"f", "m"};
-		String[] expectedMethodNames= {};
-		String[][] expectedMethodSignatures= {new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testAddingRequiredMembers9() throws Exception{
-		String[] fieldNames= {"f"};
-		String[] methodNames= {};
-		String[][] methodSignatures= {new String[0]};
-		
-		String[] expectedFieldNames= {"f", "m"};
-		String[] expectedMethodNames= {};
-		String[][] expectedMethodSignatures= {new String[0]};
-		addRequiredMembersHelper(fieldNames, methodNames, methodSignatures, expectedFieldNames, expectedMethodNames, expectedMethodSignatures);
-	}
-
-	public void testEnablement0() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType typeA= cu.getType("A");
-		IMember[] members= {typeA};
-		assertTrue("should be enabled", PushDownRefactoring.isAvailable(members));
-	}
-
-	public void testEnablement1() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType typeA= cu.getType("A");
-		IMember[] members= {typeA};
-		assertTrue("should be disabled", ! PushDownRefactoring.isAvailable(members));
-	}
-
-	public void testEnablement2() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType typeB= cu.getType("Outer").getType("B");
-		IMember[] members= {typeB};
-		assertTrue("should be disabled", ! PushDownRefactoring.isAvailable(members));
-	}
-
-	public void testEnablement3() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType typeA= cu.getType("A");
-		IType typeB= cu.getType("B");
-		IMember[] members= {typeA, typeB};
-		assertTrue("should be disabled", ! PushDownRefactoring.isAvailable(members));
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RefactoringScannerTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RefactoringScannerTests.java
deleted file mode 100644
index 8bd972a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RefactoringScannerTests.java
+++ /dev/null
@@ -1,127 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.internal.corext.refactoring.rename.RefactoringScanner;
-
-public class RefactoringScannerTests extends RefactoringTest{
-
-	public RefactoringScannerTests(String name){
-		super(name);
-	}
-	
-	private RefactoringScanner fScanner;
-	private static Class clazz= RefactoringScannerTests.class;
-	
-	protected String getRefactoringPath() {
-		return "RefactoringScanner/";
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	protected void setUp() throws Exception {
-		//no need to call super.setUp();
-		fScanner= new RefactoringScanner();
-		fScanner.setPattern("TestPattern");
-	}
-
-	protected void tearDown() throws Exception {
-		//no need to call super.tearDown();
-	}
-
-	private void helper(String fileName, int expectedMatchCount, boolean analyzeComments, boolean analyzeJavaDoc, boolean analyzeString)	throws Exception{
-		String text= getFileContents(getRefactoringPath() + fileName);
-		fScanner.setAnalyzeComments(analyzeComments);
-		fScanner.setAnalyzeJavaDoc(analyzeJavaDoc);
-		fScanner.setAnalyzeStrings(analyzeString);
-		fScanner.scan(text);
-		assertEquals("results.length", expectedMatchCount, fScanner.getJavaDocResults().size() + fScanner.getCommentResults().size() + fScanner.getStringResults().size());		
-	}
-	
-	//-- tests
-	public void test0() throws Exception{
-		String text= "";
-		fScanner.scan(text);
-		assertEquals("results.length", 0, fScanner.getJavaDocResults().size() + fScanner.getCommentResults().size() + fScanner.getStringResults().size());		
-	}
-	
-	public void test1() throws Exception{
-		helper("A.java", 8, true, true, true);
-	}
-
-	public void test2() throws Exception{
-		helper("A.java", 4, false, true, true);
-	}
-
-	public void test3() throws Exception{
-		helper("A.java", 6, true, false, true);
-	}
-
-	public void test4() throws Exception{
-		helper("A.java", 6, true, true, false);
-	}
-	
-	public void test5() throws Exception{
-		helper("A.java", 2, false, false, true);
-	}
-
-	public void test6() throws Exception{
-		helper("A.java", 2, false, true, false);
-	}
-
-	public void test7() throws Exception{
-		helper("A.java", 4, true, false, false);
-	}
-
-	public void test8() throws Exception{
-		helper("A.java", 0, false, false, false);
-	}
-
-	//---
-	public void testWord1() throws Exception{
-		helper("B.java", 6, true, true, true);
-	}
-
-	public void testWord2() throws Exception{
-		helper("B.java", 3, false, true, true);
-	}
-
-	public void testWord3() throws Exception{
-		helper("B.java", 5, true, false, true);
-	}
-
-	public void testWord4() throws Exception{
-		helper("B.java", 4, true, true, false);
-	}
-	
-	public void testWord5() throws Exception{
-		helper("B.java", 2, false, false, true);
-	}
-
-	public void testWord6() throws Exception{
-		helper("B.java", 1, false, true, false);
-	}
-
-	public void testWord7() throws Exception{
-		helper("B.java", 3, true, false, false);
-	}
-
-	public void testWord8() throws Exception{
-		helper("B.java", 0, false, false, false);
-	}
-		
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RefactoringTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RefactoringTest.java
deleted file mode 100644
index 57c98b7..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RefactoringTest.java
+++ /dev/null
@@ -1,504 +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.jdt.ui.tests.refactoring;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.StringBufferInputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.ISourceManipulation;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.ITypeNameRequestor;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.util.JavaElementUtil;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.internal.corext.util.Strings;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.RefactoringTestPlugin;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-public abstract class RefactoringTest extends TestCase {
-
-	private IPackageFragmentRoot fRoot;
-	private IPackageFragment fPackageP;
-	
-	public boolean fIsVerbose= false;
-
-	public static final String TEST_PATH_PREFIX= "";
-
-	protected static final String TEST_INPUT_INFIX= "/in/";
-	protected static final String TEST_OUTPUT_INFIX= "/out/";
-	protected static final String CONTAINER= "src";
-	
-	public RefactoringTest(String name) {
-		super(name);
-	}
-
-	protected void setUp() throws Exception {
-		fRoot= MySetup.getDefaultSourceFolder();
-		fPackageP= MySetup.getPackageP();
-		
-		if (fIsVerbose){
-			System.out.println("\n---------------------------------------------");
-			System.out.println("\nTest:" + getClass() + "." + getName());
-		}	
-		Refactoring.getUndoManager().flush();
-	}
-
-	protected void performDummySearch() throws Exception {
-		performDummySearch(getPackageP());
-	}	
-
-	protected void tearDown() throws Exception {
-		refreshFromLocal();	
-		performDummySearch();
-			
-		if (getPackageP().exists()){		
-			tryDeletingAllJavaChildren(getPackageP());
-			tryDeletingAllNonJavaChildResources(getPackageP());
-		}	
-		
-		if (getRoot().exists()){
-			IJavaElement[] packages= getRoot().getChildren();
-			for (int i= 0; i < packages.length; i++){
-				try{
-					IPackageFragment pack= (IPackageFragment)packages[i];
-					if (! pack.equals(getPackageP()) && pack.exists() && ! pack.isReadOnly())
-						pack.delete(true, null);
-				}	catch (JavaModelException e){
-					//try to delete'em all
-					e.printStackTrace();
-				}	
-			}
-		}
-	}
-
-	private void refreshFromLocal() throws CoreException {
-		if (getRoot().exists())
-			getRoot().getResource().refreshLocal(IResource.DEPTH_INFINITE, null);	
-		else if (getPackageP().exists())//don't refresh package if root already refreshed
-			getPackageP().getResource().refreshLocal(IResource.DEPTH_INFINITE, null);
-	}
-
-	private static void tryDeletingAllNonJavaChildResources(IPackageFragment pack) throws JavaModelException {
-		Object[] nonJavaKids= pack.getNonJavaResources();
-		for (int i= 0; i < nonJavaKids.length; i++) {
-			if (nonJavaKids[i] instanceof IResource) {
-				IResource resource= (IResource)nonJavaKids[i];
-				try {
-					resource.delete(true, null);
-				} catch (CoreException e) {
-					//try to delete'em all
-					e.printStackTrace();
-				}
-			}
-		}
-	}
-
-	private static void tryDeletingAllJavaChildren(IPackageFragment pack) throws JavaModelException {
-		IJavaElement[] kids= pack.getChildren();
-		for (int i= 0; i < kids.length; i++){
-			if (kids[i] instanceof ISourceManipulation){
-				try{
-					if (kids[i].exists() && ! kids[i].isReadOnly())
-						((ISourceManipulation)kids[i]).delete(true, null);
-				}	catch (JavaModelException e){
-					//try to delete'em all
-					e.printStackTrace();
-				}
-			}	
-		}
-	}
-
-	protected IPackageFragmentRoot getRoot() {
-		return fRoot;
-	}
-
-	protected IPackageFragment getPackageP() {
-		return fPackageP;
-	}
-
-	protected final RefactoringStatus performRefactoring(Refactoring ref) throws Exception {
-		performDummySearch();
-		RefactoringStatus status= ref.checkPreconditions(new NullProgressMonitor());
-		if (!status.isOK())
-			return status;
-
-		IChange change= ref.createChange(new NullProgressMonitor());
-		performChange(change);
-		
-		// XXX: this should be done by someone else
-		Refactoring.getUndoManager().addUndo(ref.getName(), change.getUndoChange());
-
-		return null;
-	}
-	
-	protected final RefactoringStatus performRefactoringWithStatus(Refactoring ref) throws Exception {
-		RefactoringStatus status= ref.checkPreconditions(new NullProgressMonitor());
-		if (status.hasFatalError())
-			return status;
-
-		IChange change= ref.createChange(new NullProgressMonitor());
-		performChange(change);
-		
-		// XXX: this should be done by someone else
-		Refactoring.getUndoManager().addUndo(ref.getName(), change.getUndoChange());
-
-		return status;
-	}
-	
-	protected void performChange(final IChange change) throws Exception {
-		change.aboutToPerform(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		try {
-			JavaCore.run(new IWorkspaceRunnable() {
-		 		public void run(IProgressMonitor pm) throws CoreException {
-		 			change.perform(new ChangeContext(new TestExceptionHandler()), pm);
-		 		}
-		 	}, new NullProgressMonitor());
-		} finally {
-			change.performed();
-		}
-	}
-
-	/****************  helpers  ******************/
-	/**** mostly not general, just shortcuts *****/
-
-	protected IType getType(ICompilationUnit cu, String name) throws JavaModelException {
-		IType[] types= cu.getAllTypes();
-		for (int i= 0; i < types.length; i++)
-			if (JavaModelUtil.getTypeQualifiedName(types[i]).equals(name) ||
-			    types[i].getElementName().equals(name))
-				return types[i];
-		return null;
-	}
-	
-	/**
-	 * subclasses override to inform about the location of their test cases
-	 */
-	protected String getRefactoringPath() {
-		return "";
-	}
-
-	/**
-	 *  example "RenameType/"
-	 */
-	protected String getTestPath() {
-		return TEST_PATH_PREFIX + getRefactoringPath();
-	}
-
-	/**
-	 * @param cuName
-	 * @param infix
-	 * example "RenameTest/test0 + infix + cuName.java"
-	 */
-	protected String createTestFileName(String cuName, String infix) {
-		return getTestPath() + getName() + infix + cuName + ".java";
-	}
-	
-	protected String getInputTestFileName(String cuName) {
-		return createTestFileName(cuName, TEST_INPUT_INFIX);
-	}
-	
-	/**
-	 * @param subDirName example "p/" or "org/eclipse/jdt/"
-	 */
-	protected String getInputTestFileName(String cuName, String subDirName) {
-		return createTestFileName(cuName, TEST_INPUT_INFIX + subDirName);
-	}
-
-	protected String getOutputTestFileName(String cuName) {
-		return createTestFileName(cuName, TEST_OUTPUT_INFIX);
-	}
-	
-	/**
-	 * @param subDirName example "p/" or "org/eclipse/jdt/"
-	 */
-	protected String getOutputTestFileName(String cuName, String subDirName) {
-		return createTestFileName(cuName, TEST_OUTPUT_INFIX + subDirName);
-	}
-	
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, String cuName) throws Exception {
-		return createCUfromTestFile(pack, cuName, true);
-	}
-	
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, String cuName, String subDirName) throws Exception {
-		return createCUfromTestFile(pack, cuName, subDirName, true);
-	}
-	
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, String cuName, boolean input) throws Exception {
-		String contents= input 
-					? getFileContents(getInputTestFileName(cuName))
-					: getFileContents(getOutputTestFileName(cuName));
-		return createCU(pack, cuName + ".java", contents);
-	}
-	
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, String cuName, String subDirName, boolean input) throws Exception {
-		String contents= input 
-			? getFileContents(getInputTestFileName(cuName, subDirName))
-			: getFileContents(getOutputTestFileName(cuName, subDirName));
-		
-		return createCU(pack, cuName + ".java", contents);
-	}
-	
-	protected void printTestDisabledMessage(String explanation){
-		System.out.println("\n" +getClass().getName() + "::"+ getName() + " disabled (" + explanation + ")");
-	}
-	
-	//-----------------------
-	public static InputStream getStream(String content){
-		return new StringBufferInputStream(content);
-	}
-	
-	public static IPackageFragmentRoot getSourceFolder(IJavaProject javaProject, String name) throws JavaModelException{
-		IPackageFragmentRoot[] roots= javaProject.getPackageFragmentRoots();
-		for (int i= 0; i < roots.length; i++) {
-			if (! roots[i].isArchive() && roots[i].getElementName().equals(name))
-				return roots[i];
-		}
-		return null;
-	}
-	
-	public static String getFileContents(String fileName) throws IOException {
-		return getContents(getFileInputStream(fileName));
-	}
-
-	public static String getContents(IFile file) throws IOException, CoreException {
-		return getContents(file.getContents());
-	}
-	
-	public static ICompilationUnit createCU(IPackageFragment pack, String name, String contents) throws Exception {
-		if (pack.getCompilationUnit(name).exists())
-			return pack.getCompilationUnit(name);
-		ICompilationUnit cu= pack.createCompilationUnit(name, contents, true, null);
-		cu.save(null, true);
-		return cu;
-	}
-
-	public static String getContents(InputStream in) throws IOException {
-		BufferedReader br= new BufferedReader(new InputStreamReader(in));
-		
-		StringBuffer sb= new StringBuffer(300);
-		try {
-			int read= 0;
-			while ((read= br.read()) != -1)
-				sb.append((char) read);
-		} finally {
-			br.close();
-		}
-		return sb.toString();
-	}
-
-	public static InputStream getFileInputStream(String fileName) throws IOException {
-		return RefactoringTestPlugin.getDefault().getTestResourceStream(fileName);
-	}
-
-	public static String removeExtension(String fileName) {
-		return fileName.substring(0, fileName.lastIndexOf('.'));
-	}
-	
-	public static void performDummySearch(IJavaElement element) throws Exception{
-		new SearchEngine().searchAllTypeNames(
-			ResourcesPlugin.getWorkspace(),
-			null,
-			null,
-			IJavaSearchConstants.EXACT_MATCH,
-			IJavaSearchConstants.CASE_SENSITIVE,
-			IJavaSearchConstants.CLASS,
-			SearchEngine.createJavaSearchScope(new IJavaElement[]{element}),
-			new Requestor(),
-			IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
-			null);
-	}
-	
-	public static IMember[] merge(IMember[] a1, IMember[] a2, IMember[] a3){
-		return JavaElementUtil.merge(JavaElementUtil.merge(a1, a2), a3);
-	}
-
-	public static IMember[] merge(IMember[] a1, IMember[] a2){
-		return JavaElementUtil.merge(a1, a2);
-	}
-		
-	public static IField[] getFields(IType type, String[] names) throws JavaModelException{
-		if (names == null )
-			return new IField[0];
-		Set fields= new HashSet();
-		for (int i = 0; i < names.length; i++) {
-			IField field= type.getField(names[i]);
-			assertTrue("field " + field.getElementName() + " does not exist", field.exists());
-			fields.add(field);
-		}
-		return (IField[]) fields.toArray(new IField[fields.size()]);	
-	}
-
-	public static IType[] getMemberTypes(IType type, String[] names) throws JavaModelException{
-		if (names == null )
-			return new IType[0];
-		Set memberTypes= new HashSet();
-		for (int i = 0; i < names.length; i++) {
-			IType memberType= type.getType(names[i]);
-			assertTrue("member type " + memberType.getElementName() + " does not exist", memberType.exists());
-			memberTypes.add(memberType);
-		}
-		return (IType[]) memberTypes.toArray(new IType[memberTypes.size()]);	
-	}
-	
-	public static IMethod[] getMethods(IType type, String[] names, String[][] signatures) throws JavaModelException{
-		if (names == null || signatures == null)
-			return new IMethod[0];
-		List methods= new ArrayList(names.length);
-		for (int i = 0; i < names.length; i++) {
-			IMethod method= type.getMethod(names[i], signatures[i]);
-			assertTrue("method " + method.getElementName() + " does not exist", method.exists());
-			if (!methods.contains(method))
-				methods.add(method);
-		}
-		return (IMethod[]) methods.toArray(new IMethod[methods.size()]);	
-	}
-
-	public static IType[] findTypes(IType[] types, String[] namesOfTypesToPullUp) {
-		List found= new ArrayList(types.length);
-		for (int i= 0; i < types.length; i++) {
-			IType type= types[i];
-			for (int j= 0; j < namesOfTypesToPullUp.length; j++) {
-				String name= namesOfTypesToPullUp[j];
-				if (type.getElementName().equals(name))
-					found.add(type);					
-			}
-		}
-		return (IType[]) found.toArray(new IType[found.size()]);
-	}
-	
-	public static IField[] findFields(IField[] fields, String[] namesOfFieldsToPullUp) {
-		List found= new ArrayList(fields.length);
-		for (int i= 0; i < fields.length; i++) {
-			IField field= fields[i];
-			for (int j= 0; j < namesOfFieldsToPullUp.length; j++) {
-				String name= namesOfFieldsToPullUp[j];
-				if (field.getElementName().equals(name))
-					found.add(field);					
-			}
-		}
-		return (IField[]) found.toArray(new IField[found.size()]);
-	}
-
-	public static IMethod[] findMethods(IMethod[] selectedMethods, String[] namesOfMethods, String[][] signaturesOfMethods){
-		List found= new ArrayList(selectedMethods.length);
-		for (int i= 0; i < selectedMethods.length; i++) {
-			IMethod method= selectedMethods[i];
-			String[] paramTypes= method.getParameterTypes();
-			for (int j= 0; j < namesOfMethods.length; j++) {
-				String methodName= namesOfMethods[j];
-				if (! methodName.equals(method.getElementName()))
-					continue;
-				String[] methodSig= signaturesOfMethods[j];
-				if (! areSameSignatures(paramTypes, methodSig))
-					continue;
-				found.add(method);	
-			}
-		}
-		return (IMethod[]) found.toArray(new IMethod[found.size()]);
-	}
-	
-	private static boolean areSameSignatures(String[] s1, String[] s2){
-		if (s1.length != s2.length)
-			return false;
-		for (int i= 0; i < s1.length; i++) {
-			if (! s1[i].equals(s2[i]))
-				return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Line-based version of junit.framework.Assert.assertEquals(String, String)
-	 * without considering line delimiters.
-	 */
-	public static void assertEqualLines(String expected, String actual) {
-		assertEqualLines("", expected, actual);
-	}
-	
-	/**
-	 * Line-based version of junit.framework.Assert.assertEquals(String, String, String)
-	 * without considering line delimiters.
-	 */
-	public static void assertEqualLines(String message, String expected, String actual) {
-		String[] expectedLines= Strings.convertIntoLines(expected);
-		String[] actualLines= Strings.convertIntoLines(actual);
-
-		String expected2= (expectedLines == null ? null : Strings.concatenate(expectedLines, "\n"));
-		String actual2= (actualLines == null ? null : Strings.concatenate(actualLines, "\n"));
-		assertEquals(message, expected2, actual2);
-		
-//		StringBuffer diffs= new StringBuffer();
-//		for (int i= 0; i < Math.max(actualLines.length, expectedLines.length); i++) {
-//			String exp= i >= expectedLines.length ? "<no line>" : expectedLines[i];
-//			String act= i >= actualLines.length ? "<no line>" : actualLines[i];
-//			if (! exp.equals(act)) {
-//				diffs.append("\n* " + (i+1) + "* expected: <" + exp + ">"
-//				           + "\n_ " + (i+1) + "_ but was:  <" + act + ">");
-//			}
-//		}
-//		
-//		boolean hasDiffs= diffs.length() != 0;
-//		boolean hasDiffLineCount= expectedLines.length != actualLines.length;
-//		if (hasDiffs || hasDiffLineCount) {
-//			message= (message == null || message.length() == 0 ? "" : message + ": ");
-//			if (hasDiffLineCount) {
-//				fail(message + "different number of lines (" + actualLines.length +
-//					" not " + expectedLines.length + ")" + diffs);
-//			} else {
-//				fail(message + "differences in lines: " + diffs);
-//			}
-//		}
-	}
-	
-	private static class Requestor implements ITypeNameRequestor{
-		
-		public void acceptClass(char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) {
-		}
-
-		public void acceptInterface(char[] packageName, char[] simpleTypeName, char[][] enclosingTypeNames, String path) {
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameFieldTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameFieldTests.java
deleted file mode 100644
index f2ac330..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameFieldTests.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class RenameFieldTests {
-	
-	private static final Class clazz= RenameFieldTests.class;
-	
-	public static Test suite() {
-		TestSuite suite= new TestSuite(clazz.getName());
-		suite.addTest(RenameNonPrivateFieldTests.suite());
-		suite.addTest(RenamePrivateFieldTests.suite());
-		return suite;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameJavaProjectTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameJavaProjectTests.java
deleted file mode 100644
index 3faf844..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameJavaProjectTests.java
+++ /dev/null
@@ -1,100 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-public class RenameJavaProjectTests extends RefactoringTest {
-
-	private static final Class clazz= RenameJavaProjectTests.class;
-
-	public RenameJavaProjectTests(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	public void test0() throws Exception {
-		IJavaProject p1= null;
-		IJavaProject referencing1= null;
-		IJavaProject referencing2= null;
-		try {
-			String newProjectName= "newName";
-			p1= JavaProjectHelper.createJavaProject("p1", "bin");
-			referencing1= JavaProjectHelper.createJavaProject("p2", "bin");
-			referencing2= JavaProjectHelper.createJavaProject("p3", "bin");
-
-			JavaProjectHelper.addRTJar(referencing1);
-			JavaProjectHelper.addRequiredProject(referencing1, p1);
-			JavaProjectHelper.addSourceContainer(referencing1, "src");
-
-			JavaProjectHelper.addRTJar(referencing2);
-			JavaProjectHelper.addRequiredProject(referencing2, p1);
-			JavaProjectHelper.addSourceContainer(referencing2, "src");
-
-			JavaProjectHelper.addRTJar(p1);
-
-			RenameRefactoring ref= new RenameRefactoring(p1);
-			assertTrue(ref.isAvailable());
-			ref.setNewName(newProjectName);
-			RefactoringStatus result= performRefactoring(ref);
-			assertEquals("not expected to fail", null, result);
-			assertTrue("p1 is gone", !p1.exists());
-			
-			p1= referencing1.getJavaModel().getJavaProject("newName");
-			assertTrue("p1 exists", p1.exists());
-			
-			//check entries in  referencing1
-			IClasspathEntry[] entries= referencing1.getRawClasspath();
-			assertEquals("expected entries", 3, entries.length);
-			for (int i= 0; i < entries.length; i++) {
-				IClasspathEntry iClassPathEntry= entries[i];
-				if (i == 1) {
-					assertEquals("expected entry name", p1.getProject().getFullPath(), iClassPathEntry.getPath());
-					assertEquals("expected entry kind", IClasspathEntry.CPE_PROJECT, iClassPathEntry.getEntryKind());
-				}
-			}
-
-			//check entries in  referencing2
-			entries= referencing2.getRawClasspath();
-			assertEquals("expected entries", 3, entries.length);
-			for (int i= 0; i < entries.length; i++) {
-				IClasspathEntry iClassPathEntry= entries[i];
-				if (i == 1) {
-					assertEquals("expected entry name", p1.getProject().getFullPath(), iClassPathEntry.getPath());
-					assertEquals("expected entry kind", IClasspathEntry.CPE_PROJECT, iClassPathEntry.getEntryKind());
-				}
-			}
-
-		} finally {
-			performDummySearch();
-
-			JavaProjectHelper.removeSourceContainer(referencing1, "src");
-			JavaProjectHelper.removeSourceContainer(referencing2, "src");
-
-			if (p1 != null && p1.exists()) {
-				JavaProjectHelper.delete(p1);
-				JavaProjectHelper.delete(referencing1);
-				JavaProjectHelper.delete(referencing2);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameMethodInInterfaceTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameMethodInInterfaceTests.java
deleted file mode 100644
index 2255ed6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameMethodInInterfaceTests.java
+++ /dev/null
@@ -1,397 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.Signature;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameMethodProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-
-public class RenameMethodInInterfaceTests extends RefactoringTest {
-	
-	private static final Class clazz= RenameMethodInInterfaceTests.class;
-	private static final String REFACTORING_PATH= "RenameMethodInInterface/";
-
-	public RenameMethodInInterfaceTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	private void helper1_not_available(String methodName, String[] signatures) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType interfaceI= getType(cu, "I");
-		
-		RenameRefactoring ref= new RenameRefactoring(interfaceI.getMethod(methodName, signatures));
-		assertTrue(! ref.isAvailable());
-	}
-	private void helper1_0(String methodName, String newMethodName, String[] signatures) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType interfaceI= getType(cu, "I");
-		RenameRefactoring ref= new RenameRefactoring(interfaceI.getMethod(methodName, signatures));
-		ref.setNewName(newMethodName);
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	private void helper1() throws Exception{
-		helper1_0("m", "k", new String[0]);
-	}
-	
-	private void helper2_0(String methodName, String newMethodName, String[] signatures, boolean shouldPass, boolean updateReferences) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType interfaceI= getType(cu, "I");
-		RenameRefactoring ref= new RenameRefactoring(interfaceI.getMethod(methodName, signatures));
-		RenameMethodProcessor pro= (RenameMethodProcessor)ref.getProcessor();
-		pro.setUpdateReferences(updateReferences);
-		pro.setNewElementName(newMethodName);
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		if (!shouldPass){
-			assertTrue("incorrect renaming because of a java model bug", ! getFileContents(getOutputTestFileName("A")).equals(cu.getSource()));
-			return;
-		}
-		assertEqualLines("incorrect renaming", getFileContents(getOutputTestFileName("A")), cu.getSource());
-		
-		assertTrue("anythingToUndo", Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("! anythingToRedo", !Refactoring.getUndoManager().anythingToRedo());
-		//assertEquals("1 to undo", 1, Refactoring.getUndoManager().getRefactoringLog().size());
-		
-		Refactoring.getUndoManager().performUndo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid undo", getFileContents(getInputTestFileName("A")), cu.getSource());
-
-		assertTrue("! anythingToUndo", !Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("anythingToRedo", Refactoring.getUndoManager().anythingToRedo());
-		//assertEquals("1 to redo", 1, Refactoring.getUndoManager().getRedoStack().size());
-		
-		Refactoring.getUndoManager().performRedo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid redo", getFileContents(getOutputTestFileName("A")), cu.getSource());
-	}
-	
-	private void helper2(boolean updateReferences) throws Exception{
-		helper2_0("m", "k", new String[0], true, updateReferences);
-	}
-	
-	private void helper2() throws Exception{
-		helper2(true);
-	}
-	
-	/********tests************/
-	public void testFail0() throws Exception{
-		helper1();
-	}
-	public void testFail1() throws Exception{
-		helper1();
-	}
-	public void testFail3() throws Exception{
-		helper1();
-	}
-	public void testFail4() throws Exception{
-		helper1();
-	}
-	public void testFail5() throws Exception{
-		helper1();
-	}
-	public void testFail6() throws Exception{
-		helper1();
-	}
-	public void testFail7() throws Exception{
-		helper1();
-	}
-	public void testFail8() throws Exception{
-		helper1_0("m", "k", new String[]{Signature.SIG_INT});
-	}
-	public void testFail9() throws Exception{
-		helper1();
-	}
-	public void testFail10() throws Exception{
-		helper1();
-	}
-	public void testFail11() throws Exception{
-		helper1();
-	}
-	public void testFail12() throws Exception{
-		helper1();
-	}
-	public void testFail13() throws Exception{
-		helper1();
-	}
-	public void testFail14() throws Exception{
-		helper1();
-	}
-	public void testFail15() throws Exception{
-		helper1();
-	}
-	public void testFail16() throws Exception{
-		helper1();
-	}
-	public void testFail17() throws Exception{
-		helper1();
-	}
-	public void testFail18() throws Exception{
-		helper1();
-	}
-	public void testFail19() throws Exception{
-		helper1();
-	}
-	public void testFail20() throws Exception{
-		helper1();
-	}
-	public void testFail21() throws Exception{
-		helper1_0("m", "k", new String[]{"QString;"});
-	}
-	public void testFail22() throws Exception{
-		helper1_0("m", "k", new String[]{"QObject;"});
-	}
-	public void testFail23() throws Exception{
-		helper1_not_available("toString", new String[0]);
-	}
-	public void testFail24() throws Exception{
-		helper1();
-	}
-	public void testFail25() throws Exception{
-		helper1();
-	}
-	public void testFail26() throws Exception{
-		helper1();
-	}
-	public void testFail27() throws Exception{
-		helper1();
-	}
-	public void testFail28() throws Exception{
-		helper1();
-	}
-	public void testFail29() throws Exception{
-		helper1();
-	}
-	
-	public void testFail30() throws Exception{
-		helper1_not_available("toString", new String[0]);
-	}
-	
-	public void testFail31() throws Exception{
-		helper1_not_available("toString", new String[0]);
-	}
-	
-	public void testFail32() throws Exception{
-		helper1_0("m", "toString", new String[0]);
-	}
-	
-	public void testFail33() throws Exception{
-		helper1_0("m", "toString", new String[0]);
-	}
-	
-	public void testFail34() throws Exception{
-		helper1_0("m", "equals", new String[]{"QObject;"});
-	}
-	
-	public void testFail35() throws Exception{
-		helper1_0("m", "equals", new String[]{"Qjava.lang.Object;"});
-	}
-	
-	public void testFail36() throws Exception{
-		helper1_0("m", "getClass", new String[0]);
-	}
-	
-	public void testFail37() throws Exception{
-		helper1_0("m", "hashCode", new String[0]);
-	}
-
-	public void testFail38() throws Exception{
-		helper1_0("m", "notify", new String[0]);
-	}	
-
-	public void testFail39() throws Exception{
-		helper1_0("m", "notifyAll", new String[0]);
-	}	
-	
-	public void testFail40() throws Exception{
-		helper1_0("m", "wait", new String[]{Signature.SIG_LONG, Signature.SIG_INT});
-	}	
-
-	public void testFail41() throws Exception{
-		helper1_0("m", "wait", new String[]{Signature.SIG_LONG});
-	}	
-	
-	public void testFail42() throws Exception{
-		helper1_0("m", "wait", new String[0]);
-	}	
-	
-	public void testFail43() throws Exception{
-		helper1_0("m", "wait", new String[0]);
-	}	
-	
-	
-	public void test0() throws Exception{
-		helper2();
-	}
-	public void test1() throws Exception{
-		helper2();
-	}
-	public void test2() throws Exception{
-		helper2();
-	}
-	public void test3() throws Exception{
-		helper2();
-	}
-	public void test4() throws Exception{
-		helper2();
-	}
-	public void test5() throws Exception{
-		helper2();
-	}
-	public void test6() throws Exception{
-		helper2();
-	}
-	public void test7() throws Exception{
-		helper2();
-	}
-	public void test10() throws Exception{
-		helper2();
-	}
-	public void test11() throws Exception{
-		helper2();
-	}	
-	public void test12() throws Exception{
-		helper2();
-	}
-	
-	//test13 became testFail45
-	//public void test13() throws Exception{
-	//	helper2();
-	//}
-	public void test14() throws Exception{
-		helper2();
-	}
-	public void test15() throws Exception{
-		helper2();
-	}
-	public void test16() throws Exception{
-		helper2();
-	}
-	public void test17() throws Exception{
-		helper2();
-	}
-	public void test18() throws Exception{
-		helper2();
-	}
-	public void test19() throws Exception{
-		helper2();
-	}
-	public void test20() throws Exception{
-		helper2();
-	}
-	//anonymous inner class
-	public void test21() throws Exception{
-		printTestDisabledMessage("must fix - incorrect warnings");
-		//helper2_fail();
-	}
-	public void test22() throws Exception{
-		helper2();
-	}
-	
-	//test23 became testFail45
-	//public void test23() throws Exception{
-	//	helper2();
-	//}
-	
-	public void test24() throws Exception{
-		helper2();
-	}
-	public void test25() throws Exception{
-		helper2();
-	}
-	public void test26() throws Exception{
-		helper2();
-	}
-	public void test27() throws Exception{
-		helper2();
-	}
-	public void test28() throws Exception{
-		helper2();
-	}
-	public void test29() throws Exception{
-		helper2();
-	}
-	public void test30() throws Exception{
-		helper2();
-	}
-	//anonymous inner class
-	public void test31() throws Exception{
-		helper2();
-	}
-	//anonymous inner class
-	public void test32() throws Exception{
-		helper2();
-	}
-	public void test33() throws Exception{
-		helper2();
-	}
-	public void test34() throws Exception{
-		helper2();
-	}
-	public void test35() throws Exception{
-		helper2();
-	}
-	public void test36() throws Exception{
-		helper2();
-	}
-	public void test37() throws Exception{
-		helper2();
-	}
-	public void test38() throws Exception{
-		helper2();
-	}
-	public void test39() throws Exception{
-		helper2();
-	}
-	public void test40() throws Exception{
-		helper2();
-	}
-	public void test41() throws Exception{
-		helper2();
-	}
-	public void test42() throws Exception{
-		helper2();
-	}
-	public void test43() throws Exception{
-		helper2();
-	}
-	public void test44() throws Exception{
-		helper2();
-	}
-	public void test45() throws Exception{
-		helper2();
-	}
-	public void test46() throws Exception{
-		helper2(false);
-	}
-	public void test47() throws Exception{
-		helper2();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameMethodTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameMethodTests.java
deleted file mode 100644
index 8c2feeb..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameMethodTests.java
+++ /dev/null
@@ -1,27 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class RenameMethodTests {
-	private static final Class clazz= RenameMethodTests.class;
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite(clazz.getName());
-		suite.addTest(RenameVirtualMethodInClassTests.suite());
-		suite.addTest(RenameMethodInInterfaceTests.suite());
-		suite.addTest(RenamePrivateMethodTests.suite());	
-		suite.addTest(RenameStaticMethodTests.suite());
-		return suite;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameNonPrivateFieldTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameNonPrivateFieldTests.java
deleted file mode 100644
index 48bb821..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameNonPrivateFieldTests.java
+++ /dev/null
@@ -1,260 +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.jdt.ui.tests.refactoring;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-
-public class RenameNonPrivateFieldTests extends RefactoringTest{
-	
-	private static final Class clazz= RenameNonPrivateFieldTests.class;
-	private static final String REFACTORING_PATH= "RenameNonPrivateField/";
-
-	private Object fPrefixPref;
-	public RenameNonPrivateFieldTests(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		Hashtable options= JavaCore.getOptions();
-		fPrefixPref= options.get(JavaCore.CODEASSIST_FIELD_PREFIXES);
-		options.put(JavaCore.CODEASSIST_FIELD_PREFIXES, getPrefixes());
-		JavaCore.setOptions(options);
-	}
-	
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		Hashtable options= JavaCore.getOptions();
-		options.put(JavaCore.CODEASSIST_FIELD_PREFIXES, fPrefixPref);
-		JavaCore.setOptions(options);	
-	}
-	
-	private String getPrefixes(){
-		return "";
-	}
-	
-	private void helper1_0(String fieldName, String newFieldName) throws Exception{
-		IType classA= getType(createCUfromTestFile(getPackageP(), "A"), "A");
-		RenameRefactoring refactoring= new RenameRefactoring(classA.getField(fieldName));
-		RenameFieldProcessor processor= (RenameFieldProcessor)refactoring.getProcessor();
-		processor.setNewElementName(newFieldName);
-		RefactoringStatus result= performRefactoring(refactoring);
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	private void helper1() throws Exception{
-		helper1_0("f", "g");
-	}
-	
-	private void helper2(String fieldName, String newFieldName, boolean updateReferences) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-		RenameRefactoring refactoring= new RenameRefactoring(classA.getField(fieldName));
-		RenameFieldProcessor processor= (RenameFieldProcessor)refactoring.getProcessor();
-		processor.setNewElementName(newFieldName);
-		processor.setUpdateReferences(updateReferences);
-		RefactoringStatus result= performRefactoring(refactoring);
-		assertEquals("was supposed to pass", null, result);
-		assertEqualLines("invalid renaming", getFileContents(getOutputTestFileName("A")), cu.getSource());
-		
-		assertTrue("anythingToUndo", Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("! anythingToRedo", !Refactoring.getUndoManager().anythingToRedo());
-		
-		Refactoring.getUndoManager().performUndo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid undo", getFileContents(getInputTestFileName("A")), cu.getSource());
-
-		assertTrue("! anythingToUndo", !Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("anythingToRedo", Refactoring.getUndoManager().anythingToRedo());
-		
-		Refactoring.getUndoManager().performRedo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid redo", getFileContents(getOutputTestFileName("A")), cu.getSource());
-	}
-	
-	private void helper2(String fieldName, String newFieldName) throws Exception{
-		helper2(fieldName, newFieldName, true);
-	}
-	
-	private void helper2() throws Exception{
-		helper2(true);
-	}
-	
-	private void helper2(boolean updateReferences) throws Exception{
-		helper2("f", "g", updateReferences);
-	}
-
-	//--------- tests ----------	
-	public void testFail0() throws Exception{
-		helper1();
-	}
-	
-	public void testFail1() throws Exception{
-		helper1();
-	}
-	
-	public void testFail2() throws Exception{
-		helper1();
-	}
-	
-	public void testFail3() throws Exception{
-		helper1();
-	}
-	
-	public void testFail4() throws Exception{
-		helper1();
-	}
-	
-	public void testFail5() throws Exception{
-		helper1();
-	}	
-	
-	public void testFail6() throws Exception{
-		helper1();
-	}
-	
-	public void testFail7() throws Exception{
-		helper1();
-	}
-	
-	public void testFail8() throws Exception{
-		helper1();
-	}
-	
-	public void testFail9() throws Exception{
-		helper1();
-	}
-	
-	public void testFail10() throws Exception{
-		helper1();
-	}
-	
-	public void testFail11() throws Exception{
-		helper1();
-	}
-	
-	public void testFail12() throws Exception{
-		helper1();
-	}	
-	
-	public void testFail13() throws Exception{
-		//printTestDisabledMessage("1GKZ8J6: ITPJCORE:WIN2000 - search: missing field occurrecnces");
-		helper1();
-	}
-	
-	public void testFail14() throws Exception{
-		//printTestDisabledMessage("1GKZ8J6: ITPJCORE:WIN2000 - search: missing field occurrecnces");
-		helper1();
-	}
-	
-	// ------ 
-	public void test0() throws Exception{
-		helper2();
-	}
-	
-	public void test1() throws Exception{
-		helper2();
-	}
-	
-	public void test2() throws Exception{
-		helper2();
-	}
-	
-	public void test3() throws Exception{
-		helper2();
-	}
-	
-	public void test4() throws Exception{
-		helper2();
-		//printTestDisabledMessage("1GKZ8J6: ITPJCORE:WIN2000 - search: missing field occurrecnces");
-	}
-
-	public void test5() throws Exception{
-		helper2();
-	}
-	
-	public void test6() throws Exception{
-		//printTestDisabledMessage("1GKB9YH: ITPJCORE:WIN2000 - search for field refs - incorrect results");
-		helper2();
-	}
-
-	public void test7() throws Exception{
-		helper2();
-	}
-	
-	public void test8() throws Exception{
-		//printTestDisabledMessage("1GD79XM: ITPJCORE:WINNT - Search - search for field references - not all found");
-		helper2();
-	}
-	
-	public void test9() throws Exception{
-		helper2();
-	}
-	
-	public void test10() throws Exception{
-		helper2();
-	}
-	
-	public void test11() throws Exception{
-		helper2();
-	}
-	
-	public void test12() throws Exception{
-		//System.out.println("\nRenameNonPrivateField::" + name() + " disabled (1GIHUQP: ITPJCORE:WINNT - search for static field should be more accurate)");
-		helper2();
-	}
-	
-	public void test13() throws Exception{
-		//System.out.println("\nRenameNonPrivateField::" + name() + " disabled (1GIHUQP: ITPJCORE:WINNT - search for static field should be more accurate)");
-		helper2();
-	}
-	
-	public void test14() throws Exception{
-		helper2(false);
-	}
-	
-	public void test15() throws Exception{
-		helper2(false);
-	}
-
-	public void test16() throws Exception{
-//		printTestDisabledMessage("text for bug 20693");
-		helper2();
-	}
-	
-	public void testBug5821() throws Exception{
-		helper2("test", "test1");
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePackageTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePackageTests.java
deleted file mode 100644
index f0d01c6..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePackageTests.java
+++ /dev/null
@@ -1,279 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenamePackageProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.DebugUtils;
-
-
-public class RenamePackageTests extends RefactoringTest {
-	
-	private static final Class clazz= RenamePackageTests.class;
-	private static final String REFACTORING_PATH= "RenamePackage/";
-	
-	public RenamePackageTests(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	// -------------
-	private RenameRefactoring createRefactoring(IPackageFragment pack, String newName) throws CoreException {
-		RenameRefactoring result= new RenameRefactoring(pack);
-		result.setNewName(newName);
-		return result;
-	}
-
-	/* non java-doc
-	 * the 0th one is the one to rename
-	 */
-	private void helper1(String packageNames[], String[][] packageFiles, String newPackageName) throws Exception{
-		try{
-			IPackageFragment[] packages= new IPackageFragment[packageNames.length];
-			for (int i= 0; i < packageFiles.length; i++){
-				packages[i]= getRoot().createPackageFragment(packageNames[i], true, null);
-				for (int j= 0; j < packageFiles[i].length; j++){
-					createCUfromTestFile(packages[i], packageFiles[i][j], packageNames[i].replace('.', '/') + "/");
-					//DebugUtils.dump(cu.getElementName() + "\n" + cu.getSource());
-				}	
-			}
-			IPackageFragment thisPackage= packages[0];
-			Refactoring ref= createRefactoring(thisPackage, newPackageName);
-			performDummySearch();
-			RefactoringStatus result= performRefactoring(ref);
-			assertNotNull("precondition was supposed to fail", result);
-			if (fIsVerbose)
-				DebugUtils.dump("" + result);
-		} finally{		
-			performDummySearch();
-		
-			for (int i= 0; i < packageNames.length; i++){
-				IPackageFragment pack= getRoot().getPackageFragment(packageNames[i]);
-				if (pack.exists())
-					pack.delete(true, null);
-			}	
-		}	
-	}
-	
-	/* non java-doc
-	 * the 0th one is the one to rename
-	 */
-	private void helper1(String[] packageNames, String newPackageName) throws Exception{
-		try{
-			IPackageFragment[] packages= new IPackageFragment[packageNames.length];
-			for (int i= 0; i < packageNames.length; i++){
-				packages[i]= getRoot().createPackageFragment(packageNames[i], true, null);
-			}
-			IPackageFragment thisPackage= packages[0];
-			Refactoring ref= createRefactoring(thisPackage, newPackageName);
-			performDummySearch();
-			RefactoringStatus result= performRefactoring(ref);
-			assertNotNull("precondition was supposed to fail", result);
-			if (fIsVerbose)
-				DebugUtils.dump("" + result);
-		} finally{		
-			performDummySearch();	
-			
-			for (int i= 0; i < packageNames.length; i++){
-				IPackageFragment pack= getRoot().getPackageFragment(packageNames[i]);
-				if (pack.exists())
-					pack.delete(true, null);
-			}		
-		}	
-	}
-	
-	private void helper1() throws Exception{
-		helper1(new String[]{"r"}, new String[][]{{"A"}}, "p1");
-	}
-	
-	private void helper2(String[] packageNames, String[][] packageFileNames, String newPackageName, boolean updateReferences) throws Exception{
-		try{
-			IPackageFragment[] packages= new IPackageFragment[packageNames.length];
-			ICompilationUnit[][] cus= new ICompilationUnit[packageFileNames.length][packageFileNames[0].length];
-			for (int i= 0; i < packageNames.length; i++){
-				packages[i]= getRoot().createPackageFragment(packageNames[i], true, null);
-				for (int j= 0; j < packageFileNames[i].length; j++){
-					cus[i][j]= createCUfromTestFile(packages[i], packageFileNames[i][j], packageNames[i].replace('.', '/') + "/");
-				}
-			}
-			IPackageFragment thisPackage= packages[0];
-			RenameRefactoring ref= createRefactoring(thisPackage, newPackageName);
-			((RenamePackageProcessor)ref.getProcessor()).setUpdateReferences(updateReferences);
-			performDummySearch();
-			RefactoringStatus result= performRefactoring(ref);
-			assertEquals("preconditions were supposed to pass", null, result);
-			
-			//---
-			
-			assertTrue("package not renamed", ! getRoot().getPackageFragment(packageNames[0]).exists());
-			IPackageFragment newPackage= getRoot().getPackageFragment(newPackageName);
-			assertTrue("new package does not exist", newPackage.exists());
-			
-			for (int i= 0; i < packageFileNames.length; i++){
-				String packageName= (i == 0) 
-								? newPackageName.replace('.', '/') + "/"
-								: packageNames[i].replace('.', '/') + "/";
-				for (int j= 0; j < packageFileNames[i].length; j++){
-					String s1= getFileContents(getOutputTestFileName(packageFileNames[i][j], packageName));
-					ICompilationUnit cu= 
-						(i == 0) 
-							? newPackage.getCompilationUnit(packageFileNames[i][j] + ".java")
-							: cus[i][j];
-					//DebugUtils.dump("cu:" + cu.getElementName());		
-					String s2= cu.getSource();
-					
-					//DebugUtils.dump("expected:" + s1);
-					//DebugUtils.dump("was:" + s2);
-					assertEqualLines("invalid update in file " + cu.getElementName(), s1,	s2);
-				}
-			}
-		} finally{
-			performDummySearch();
-			getRoot().getPackageFragment(newPackageName).delete(true, null);
-			for (int i= 1; i < packageNames.length; i++){
-				getRoot().getPackageFragment(packageNames[i]).delete(true, null);
-			}	
-		}	
-	}
-	
-	private void helper2(String[] packageNames, String[][] packageFileNames, String newPackageName) throws Exception{
-		helper2(packageNames, packageFileNames, newPackageName, true);
-	}
-	
-	// ---------- tests -------------	
-	public void testFail0() throws Exception{
-		helper1(new String[]{"r"}, new String[][]{{"A"}}, "9");
-	}
-	
-	public void testFail1() throws Exception{
-		printTestDisabledMessage("needs revisiting");
-		//helper1(new String[]{"r.p1"}, new String[][]{{"A"}}, "r");
-	}
-	
-	public void testFail2() throws Exception{
-		helper1(new String[]{"r.p1", "fred"}, "fred");
-	}	
-	
-	public void testFail3() throws Exception{
-		helper1(new String[]{"r"}, new String[][]{{"A"}}, "fred");
-	}
-	
-	public void testFail4() throws Exception{
-		helper1();
-	}
-	
-	public void testFail5() throws Exception{
-		helper1();
-	}
-	
-	public void testFail6() throws Exception{
-		helper1();
-	}
-	
-	public void testFail7() throws Exception{
-		//printTestDisabledMessage("1GK90H4: ITPJCORE:WIN2000 - search: missing package reference");
-		printTestDisabledMessage("corner case - name obscuring");
-//		helper1(new String[]{"r", "p1"}, new String[][]{{"A"}, {"A"}}, "fred");
-	}
-	
-	public void testFail8() throws Exception{
-		printTestDisabledMessage("corner case - name obscuring");
-//		helper1(new String[]{"r", "p1"}, new String[][]{{"A"}, {"A"}}, "fred");
-	}
-	
-	//native method used r.A as a paramter
-	public void testFail9() throws Exception{
-		printTestDisabledMessage("corner case - qualified name used  as a paramter of a native method");
-		//helper1(new String[]{"r", "p1"}, new String[][]{{"A"}, {"A"}}, "fred");
-	}
-	
-	public void testFail10() throws Exception{
-		helper1(new String[]{"r.p1", "r"}, new String[][]{{"A"}, {"A"}}, "r");
-	}
-
-	public void testFail11() throws Exception{
-		helper1(new String[]{"q.p1", "q", "r.p1"}, new String[][]{{"A"}, {"A"}, {}}, "r.p1");
-	}
-	
-	//-------
-	public void test0() throws Exception{
-		helper2(new String[]{"r"}, new String[][]{{"A"}}, "p1");
-	}
-	
-	public void test1() throws Exception{
-		helper2(new String[]{"r"}, new String[][]{{"A"}}, "p1");
-	}
-	
-	public void test2() throws Exception{
-		helper2(new String[]{"r", "fred"}, new String[][]{{"A"}, {"A"}}, "p1");
-	}
-	
-	public void test3() throws Exception{
-		helper2(new String[]{"fred", "r.r"}, new String[][]{{"A"}, {"B"}}, "r");
-	}
-	
-	public void test4() throws Exception{
-		helper2(new String[]{"r.p1", "r"}, new String[][]{{"A"}, {"A"}}, "q");
-	}
-	
-	public void test5() throws Exception{
-		helper2(new String[]{"r"}, new String[][]{{"A"}}, "p1", false);
-	}
-	
-	public void testReadOnly() throws Exception{
-		printTestDisabledMessage("see bug#6054 (renaming a read-only package resets the read-only flag)");
-		if (true)
-			return;
-		
-		String[] packageNames= new String[]{"r"};
-		String[][] packageFileNames= new String[][]{{"A"}};
-		String newPackageName= "p1";
-		IPackageFragment[] packages= new IPackageFragment[packageNames.length];
-
-		ICompilationUnit[][] cus= new ICompilationUnit[packageFileNames.length][packageFileNames[0].length];
-		for (int i= 0; i < packageNames.length; i++){
-			packages[i]= getRoot().createPackageFragment(packageNames[i], true, null);
-			for (int j= 0; j < packageFileNames[i].length; j++){
-				cus[i][j]= createCUfromTestFile(packages[i], packageFileNames[i][j], packageNames[i].replace('.', '/') + "/");
-			}
-		}
-		IPackageFragment thisPackage= packages[0];
-		thisPackage.getCorrespondingResource().setReadOnly(true);
-		RenameRefactoring ref= createRefactoring(thisPackage, newPackageName);
-		performDummySearch();
-		RefactoringStatus result= performRefactoring(ref);
-		assertEquals("preconditions were supposed to pass", null, result);
-		
-		assertTrue("package not renamed", ! getRoot().getPackageFragment(packageNames[0]).exists());
-		IPackageFragment newPackage= getRoot().getPackageFragment(newPackageName);
-		assertTrue("new package does not exist", newPackage.exists());
-		assertTrue("new package should be read-only", newPackage.getCorrespondingResource().isReadOnly());
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameParametersTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameParametersTests.java
deleted file mode 100644
index b605bf0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameParametersTests.java
+++ /dev/null
@@ -1,362 +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.jdt.ui.tests.refactoring;
-
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-import org.eclipse.jdt.internal.corext.refactoring.ParameterInfo;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureRefactoring;
-
-public class RenameParametersTests extends RefactoringTest{
-	
-	private static final Class clazz= RenameParametersTests.class;
-	private static final String REFACTORING_PATH= "RenameParameters/";
-	
-	public RenameParametersTests(String name){
-		super(name);
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private String getSimpleTestFileName(boolean canRename, boolean input){
-		String fileName = "A_" + getName();
-		if (canRename)
-			fileName += input ? "_in": "_out";
-		return fileName + ".java"; 
-	}
-	
-	private String getTestFileName(boolean canRename, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += (canRename ? "canRename/": "cannotRename/");
-		return fileName + getSimpleTestFileName(canRename, input);
-	}
-	
-	//------------
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canRename, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(canRename, input), getFileContents(getTestFileName(canRename, input)));
-	}
-	
-	private void helper1(String[] newNames, String[] signature) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		IType classA= getType(cu, "A");
-		IMethod method= classA.getMethod("m", signature);
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(method, JavaPreferencesSettings.getCodeGenerationSettings());
-		//ref.setUpdateReferences(updateReferences);
-		//ref.setNewParameterNames(newNames);
-		//ref.setNewNames(createRenamings(method, newNames));
-		modifyInfos(ref.getParameterInfos(), newNames);
-		
-		RefactoringStatus result= performRefactoring(ref);
-		assertEquals("precondition was supposed to pass", null, result);
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		assertEquals("invalid renaming", getFileContents(getTestFileName(true, false)).length(), newcu.getSource().length());
-		assertEqualLines("invalid renaming", getFileContents(getTestFileName(true, false)), newcu.getSource());
-	}
-	
-	private void helper2(String[] newNames, String[] signature) throws Exception{
-		IType classA= getType(createCUfromTestFile(getPackageP(), false, false), "A");
-		//DebugUtils.dump("classA" + classA);
-		IMethod method= classA.getMethod("m", signature);
-		ChangeSignatureRefactoring ref= ChangeSignatureRefactoring.create(method, JavaPreferencesSettings.getCodeGenerationSettings());
-		modifyInfos(ref.getParameterInfos(), newNames);
-		
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);		
-	}
-
-	private void modifyInfos(List list, String[] newNames) {
-		int i= 0;
-		for (Iterator iter= list.iterator(); iter.hasNext(); i++) {
-			ParameterInfo info= (ParameterInfo) iter.next();
-			info.setNewName(newNames[i]);
-		}
-	}
-
-	
-	public void test0() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test1() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test2() throws Exception{
-		helper1(new String[]{"j", "k"}, new String[]{"I", "I"});
-	}
-	
-	public void test3() throws Exception{
-		helper1(new String[]{"j", "j1"}, new String[]{"I", "I"});
-	}
-	
-	public void test4() throws Exception{
-		helper1(new String[]{"k"}, new String[]{"QA;"});
-	}
-	
-	public void test5() throws Exception{
-		helper1(new String[]{"k"}, new String[]{"I"});
-	}
-	
-	public void test6() throws Exception{
-		helper1(new String[]{"k"}, new String[]{"I"});
-	}
-	
-	public void test7() throws Exception{
-		helper1(new String[]{"k"}, new String[]{"QA;"});
-	}
-	
-	public void test8() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test9() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test10() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test11() throws Exception{
-		printTestDisabledMessage("revisit in the context of anonymous types in type hierarchies");
-		// helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test12() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-
-	public void test13() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test14() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"QA;"});
-	}
-
-	public void test15() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}
-
-	public void test16() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-
-	public void test17() throws Exception{
-		helper1(new String[]{"j", "i", "k"}, new String[]{"I", "I", "I"});
-	}
-
-	public void test18() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"QObject;"});
-	}
-	
-	public void test19() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"QA;"});
-	}
-
-	public void test20() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"Qi;"});
-	}
-	
-	public void test21() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}	
-	
-	public void test22() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test23() throws Exception{
-		helper1(new String[]{"j", "i"}, new String[]{"I", "I"});
-	}	
-	
-	public void test24() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void test25() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}	
-	
-	public void test26() throws Exception{
-		printTestDisabledMessage("revisit in the context of anonymous types in type hierarchies");
-		//helper1(new String[]{"j"}, new String[]{"I"});
-	}
-
-//removed - see testFail21	
-//	public void test27() throws Exception{
-//		helper1(new String[]{"j"}, new String[]{"I"});
-//	}	
-	
-	public void test28() throws Exception{
-		helper1(new String[]{"j"}, new String[]{"[I"});
-	}		
-	
-	public void test29() throws Exception{
-		helper1(new String[]{"b"}, new String[]{"QA;"});
-	}
-
-	public void test30() throws Exception{
-		helper1(new String[]{"i", "k"}, new String[]{"I", "I"});
-	}	
-	
-	public void test31() throws Exception{
-		helper1(new String[]{"kk", "j"}, new String[]{"I", "I"});
-	}	
-	
-	public void test32() throws Exception{
-		printTestDisabledMessage("must do - constructor params");
-	}
-	
-	public void test33() throws Exception{
-		printTestDisabledMessage("revisit - removed the 'no ref update' option");
-//		helper1(new String[]{"b"}, new String[]{"QA;"}, false);
-	}
-	
-	public void test34() throws Exception{
-//		printTestDisabledMessage("regression test for bug#9001");
-		helper1(new String[]{"test2"}, new String[]{"Z"});
-	}
-	
-	public void test35() throws Exception{
-		printTestDisabledMessage("regression test for bug#6224");
-//		helper1(new String[]{"j"}, new String[]{"I"});
-	}	
-
-	public void test36() throws Exception{
-//		printTestDisabledMessage("regression test for bug#21163");
-		helper1(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	// -----
-	
-	public void testFail0() throws Exception{
-		printTestDisabledMessage("must fix - name collision with an instance var");
-//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail1() throws Exception{
-		helper2(new String[0], new String[0]);
-	}
-	
-	public void testFail2() throws Exception{
-		helper2(new String[]{"i", "i"}, new String[]{"I", "I"});
-	}
-	
-	public void testFail3() throws Exception{
-		helper2(new String[]{"i", "9"}, new String[]{"I", "I"});
-	}
-	
-	public void testFail4() throws Exception{
-		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail5() throws Exception{
-		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail6() throws Exception{
-		printTestDisabledMessage("must fix - name collision with an instance var");
-//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail7() throws Exception{
-		printTestDisabledMessage("waiting for better conflict detection story from DB");
-//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail8() throws Exception{
-		printTestDisabledMessage("waiting for better conflict detection story from DB");
-//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail9() throws Exception{
-		printTestDisabledMessage("waiting for better conflict detection story from DB");
-//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail10() throws Exception{
-		helper2(new String[]{"j", "j"}, new String[]{"I", "I"});
-	}
-	
-	public void testFail11() throws Exception{
-		helper2(new String[]{"j", "j"}, new String[]{"I", "I"});
-	}
-	
-	public void testFail12() throws Exception{
-		printTestDisabledMessage("waiting for better conflict detection story from DB");
-		//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail13() throws Exception{
-		printTestDisabledMessage("waiting for better conflict detection story from DB");
-//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail14() throws Exception{
-		printTestDisabledMessage("waiting for better conflict detection story from DB");
-//		helper2(new String[]{"j"}, new String[]{"QA;"});
-	}
-	
-	public void testFail15() throws Exception{
-		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail16() throws Exception{
-		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail17() throws Exception{
-		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail18() throws Exception{
-		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail19() throws Exception{
-		printTestDisabledMessage("waiting for better conflict detection story from DB");
-//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-
-	public void testFail20() throws Exception{
-		printTestDisabledMessage("waiting for better conflict detection story from DB");
-//		helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-	public void testFail21() throws Exception{
-		printTestDisabledMessage("Disabled since 1.4 compliance level doesn't produce error message");
-		// helper2(new String[]{"j"}, new String[]{"I"});
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePrivateFieldTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePrivateFieldTests.java
deleted file mode 100644
index 3de12ad..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePrivateFieldTests.java
+++ /dev/null
@@ -1,225 +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.jdt.ui.tests.refactoring;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-
-public class RenamePrivateFieldTests extends RefactoringTest {
-
-	private static final Class clazz= RenamePrivateFieldTests.class;
-	private static final String REFACTORING_PATH= "RenamePrivateField/";
-
-	private Object fPrefixPref;
-	public RenamePrivateFieldTests(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup( new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		Hashtable options= JavaCore.getOptions();
-		fPrefixPref= options.get(JavaCore.CODEASSIST_FIELD_PREFIXES);
-		options.put(JavaCore.CODEASSIST_FIELD_PREFIXES, getPrefixes());
-		JavaCore.setOptions(options);
-	}
-	
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		Hashtable options= JavaCore.getOptions();
-		options.put(JavaCore.CODEASSIST_FIELD_PREFIXES, fPrefixPref);
-		JavaCore.setOptions(options);	
-	}
-
-	private String getPrefixes(){
-		return "f";
-	}
-	
-	private void helper1_0(String fieldName, String newFieldName, String typeName,
-							boolean renameGetter, boolean renameSetter) throws Exception{
-		IType declaringType= getType(createCUfromTestFile(getPackageP(), "A"), typeName);
-		RenameRefactoring refactoring= new RenameRefactoring(declaringType.getField(fieldName));
-		RenameFieldProcessor processor= (RenameFieldProcessor)refactoring.getProcessor();
-		processor.setNewElementName(newFieldName);
-		processor.setRenameGetter(renameGetter);
-		processor.setRenameSetter(renameSetter);
-		RefactoringStatus result= performRefactoring(refactoring);
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	private void helper1_0(String fieldName, String newFieldName) throws Exception{
-		helper1_0(fieldName, newFieldName, "A", false, false);
-	}
-
-	private void helper1() throws Exception{
-		helper1_0("f", "g");
-	}
-	
-	//--
-		
-	private void helper2(String fieldName, String newFieldName, boolean updateReferences,  boolean updateJavaDoc, 
-											boolean updateComments, boolean updateStrings,
-											boolean renameGetter, boolean renameSetter,
-											boolean expectedGetterRenameEnabled, boolean expectedSetterRenameEnabled) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-		RenameRefactoring refactoring= new RenameRefactoring(classA.getField(fieldName));
-		RenameFieldProcessor processor= (RenameFieldProcessor)refactoring.getProcessor();
-		processor.setUpdateReferences(updateReferences);
-		processor.setUpdateJavaDoc(updateJavaDoc);
-		processor.setUpdateComments(updateComments);
-		processor.setUpdateStrings(updateStrings);
-		assertEquals("getter rename enabled", expectedGetterRenameEnabled, processor.canEnableGetterRenaming() == null);
-		assertEquals("setter rename enabled", expectedSetterRenameEnabled, processor.canEnableSetterRenaming() == null);
-		processor.setRenameGetter(renameGetter);
-		processor.setRenameSetter(renameSetter);
-		processor.setNewElementName(newFieldName);
-		
-		RefactoringStatus result= performRefactoring(refactoring);
-		assertEquals("was supposed to pass", null, result);
-		assertEqualLines("invalid renaming", getFileContents(getOutputTestFileName("A")), cu.getSource());
-		
-		assertTrue("anythingToUndo", Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("! anythingToRedo", !Refactoring.getUndoManager().anythingToRedo());
-		
-		Refactoring.getUndoManager().performUndo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid undo", getFileContents(getInputTestFileName("A")), cu.getSource());
-
-		assertTrue("! anythingToUndo", !Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("anythingToRedo", Refactoring.getUndoManager().anythingToRedo());
-		
-		Refactoring.getUndoManager().performRedo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid redo", getFileContents(getOutputTestFileName("A")), cu.getSource());
-	}
-
-	private void helper2(boolean updateReferences) throws Exception{
-		helper2("f", "g", updateReferences, false, false, false, false, false, false, false);
-	}
-	
-	private void helper2() throws Exception{
-		helper2(true);
-	}
-
-	//--------- tests ----------	
-	public void testFail0() throws Exception{
-		helper1();
-	}
-	
-	public void testFail1() throws Exception{
-		helper1();
-	}
-	
-	public void testFail2() throws Exception{
-		helper1();
-	}
-	
-	public void testFail3() throws Exception{
-		helper1();
-	}
-	
-	public void testFail4() throws Exception{
-		helper1();
-	}
-	
-	public void testFail5() throws Exception{
-		helper1();
-	}	
-	
-	public void testFail6() throws Exception{
-		helper1();
-	}
-	
-	public void testFail7() throws Exception{
-		helper1();
-	}
-	
-	public void testFail8() throws Exception{
-		helper1_0("gg", "f", "A", false, false);
-	}	
-
-	public void testFail9() throws Exception{
-		helper1_0("y", "e", "getE", true, true);
-	}	
-
-	public void testFail10() throws Exception{
-		helper1_0("y", "e", "setE", true, true);
-	}	
-	
-	// ------ 
-	public void test0() throws Exception{
-		helper2();
-	}
-	
-	public void test1() throws Exception{
-		helper2();
-	}
-
-	public void test2() throws Exception{
-		helper2(false);
-	}	
-	
-	public void test3() throws Exception{
-		helper2("f", "gg", true, true, true, true, false, false, false, false);
-	}	
-
-	public void test4() throws Exception{
-		helper2("fMe", "fYou", true, false, false, false, true, true, true, true);
-	}		
-	
-	public void test5() throws Exception{
-		//regression test for 9895
-		helper2("fMe", "fYou", true, false, false, false, true, false, true, false);
-	}		
-	
-	public void test6() throws Exception{
-		//regression test for 9895 - opposite case
-		helper2("fMe", "fYou", true, false, false, false, false, true, false, true);
-	}		
-
-	public void test7() throws Exception{
-		//regression test for 21292 
-		helper2("fBig", "fSmall", true, false, false, false, true, true, true, true);
-	}		
-	
-	public void test8() throws Exception{
-		//regression test for 26769
-		helper2("f", "g", true, false, false, false, true, false, true, false);
-	}
-
-	public void test9() throws Exception{
-		//regression test for 30906
-		helper2("fBig", "fSmall", true, false, false, false, true, true, true, true);
-	}		
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePrivateMethodTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePrivateMethodTests.java
deleted file mode 100644
index 5894793..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenamePrivateMethodTests.java
+++ /dev/null
@@ -1,197 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameMethodProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-
-public class RenamePrivateMethodTests extends RefactoringTest {
-	
-	private static final Class clazz= RenamePrivateMethodTests.class;
-	private static final String REFACTORING_PATH= "RenamePrivateMethod/";
-
-	public RenamePrivateMethodTests(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	private void helper1_0(String methodName, String newMethodName, String[] signatures) throws Exception{
-		IType classA= getType(createCUfromTestFile(getPackageP(), "A"), "A");
-		RenameRefactoring refactoring= new RenameRefactoring(classA.getMethod(methodName, signatures));
-		refactoring.setNewName(newMethodName);
-		RefactoringStatus result= performRefactoring(refactoring);
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	private void helper1() throws Exception{
-		helper1_0("m", "k", new String[0]);
-	}
-	
-	private void helper2_0(String methodName, String newMethodName, String[] signatures, boolean updateReferences) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-		RenameRefactoring refactoring= new RenameRefactoring(classA.getMethod(methodName, signatures));
-		RenameMethodProcessor processor= (RenameMethodProcessor)refactoring.getProcessor();
-		processor.setUpdateReferences(updateReferences);
-		processor.setNewElementName(newMethodName);
-		assertEquals("was supposed to pass", null, performRefactoring(refactoring));
-		assertEqualLines("invalid renaming", getFileContents(getOutputTestFileName("A")), cu.getSource());
-		
-		assertTrue("anythingToUndo", Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("! anythingToRedo", !Refactoring.getUndoManager().anythingToRedo());
-		//assertEquals("1 to undo", 1, Refactoring.getUndoManager().getRefactoringLog().size());
-		
-		Refactoring.getUndoManager().performUndo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid undo", getFileContents(getInputTestFileName("A")), cu.getSource());
-
-		assertTrue("! anythingToUndo", !Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("anythingToRedo", Refactoring.getUndoManager().anythingToRedo());
-		//assertEquals("1 to redo", 1, Refactoring.getUndoManager().getRedoStack().size());
-		
-		Refactoring.getUndoManager().performRedo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid redo", getFileContents(getOutputTestFileName("A")), cu.getSource());
-	}
-	
-	private void helper2_0(String methodName, String newMethodName, String[] signatures) throws Exception{
-		helper2_0(methodName, newMethodName, signatures, true);
-	}
-	
-	private void helper2(boolean updateReferences) throws Exception{
-		helper2_0("m", "k", new String[0], updateReferences);
-	}
-	
-	private void helper2() throws Exception{
-		helper2(true);
-	}
-
-	/******* tests ******************/
-	public void testFail0() throws Exception{
-		helper1();
-	}
-	
-	public void testFail1() throws Exception{
-		helper1();
-	}
-	
-	public void testFail2() throws Exception{
-		helper1();
-	}
-	
-	//testFail3 deleted
-	
-	//testFail4 deleted
-	
-	public void testFail5() throws Exception{
-		helper1();
-	}
-	
-	public void test0() throws Exception{
-		helper2();
-	}	
-	
-	public void test10() throws Exception{
-		helper2();
-	}	
-
-	public void test11() throws Exception{
-		helper2();
-	}	
-
-	public void test12() throws Exception{
-		helper2();
-	}	
-
-	public void test13() throws Exception{
-		helper2();
-	}	
-	
-	public void test14() throws Exception{
-		helper2();
-	}	
-
-	public void test15() throws Exception{
-		helper2_0("m", "k", new String[]{"I"});
-	}	
-
-	public void test16() throws Exception{
-		helper2_0("m", "fred", new String[]{"I"});
-	}	
-
-	public void test17() throws Exception{
-		helper2_0("m", "kk", new String[]{"I"});
-	}	
-
-	public void test18() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuC= createCUfromTestFile(getPackageP(), "C");
-		
-		IType classB= getType(cu, "B");
-		RenameRefactoring refactoring= new RenameRefactoring(classB.getMethod("m", new String[]{"I"}));
-		refactoring.setNewName("kk");
-		
-		assertEquals("was supposed to pass", null, performRefactoring(refactoring));
-		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("A")), cu.getSource());
-		assertEqualLines("invalid renaming C", getFileContents(getOutputTestFileName("C")), cuC.getSource());
-		
-	}
-
-	public void test2() throws Exception{
-		helper2_0("m", "fred", new String[0]);
-	}	
-
-	public void test20() throws Exception{
-		helper2_0("m", "fred", new String[]{"I"});
-	}	
-
-	public void test23() throws Exception{
-		helper2_0("m", "k", new String[0]);
-	}			
-
-	public void test24() throws Exception{
-		helper2_0("m", "k", new String[]{"QString;"});
-	}	
-	
-	public void test25() throws Exception{
-		helper2_0("m", "k", new String[]{"[QString;"});
-	}
-	
-	public void test26() throws Exception{
-		helper2_0("m", "k", new String[0]);
-	}
-	
-	public void test27() throws Exception{
-		helper2_0("m", "k", new String[0], false);
-	}
-
-	public void testAnon0() throws Exception{
-		helper2();
-	}			
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameResourceChangeTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameResourceChangeTests.java
deleted file mode 100644
index 4a68bc2..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameResourceChangeTests.java
+++ /dev/null
@@ -1,186 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.changes.RenameResourceChange;
-
-public class RenameResourceChangeTests extends RefactoringTest {
-	
-	private static final Class clazz= RenameResourceChangeTests.class;
-	public RenameResourceChangeTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	public void testFile0() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getCorrespondingResource();	
-		String newName= "b.txt";
-		try{
-			
-			String oldName= "a.txt";
-			IFile file= folder.getFile(oldName);
-			assertTrue("should not exist", ! file.exists());
-			String content= "aaaaaaaaa";
-			file.create(getStream(content), true, new NullProgressMonitor());
-			assertTrue("should exist", file.exists());
-			
-			IChange change= new RenameResourceChange(file, newName);
-			performChange(change);
-			assertTrue("after: should exist", folder.getFile(newName).exists());
-			assertTrue("after: old should not exist", ! folder.getFile(oldName).exists());
-		} finally{	
-			performDummySearch();
-			folder.getFile(newName).delete(true, false, new NullProgressMonitor());
-		}	
-	}
-	
-	public void testFile1() throws Exception{
-		
-		IFolder folder= (IFolder)getPackageP().getCorrespondingResource();	
-		String newName= "b.txt";
-		try{
-			String oldName= "a.txt";
-			IFile file= folder.getFile(oldName);
-			assertTrue("should not exist", ! file.exists());
-			String content= "";
-			file.create(getStream(content), true, new NullProgressMonitor());
-			assertTrue("should exist", file.exists());
-			
-			
-			IChange change= new RenameResourceChange(file, newName);
-			performChange(change);
-			assertTrue("after: should exist", folder.getFile(newName).exists());
-			assertTrue("after: old should not exist", ! folder.getFile(oldName).exists());
-		} finally{	
-			performDummySearch();
-			folder.getFile(newName).delete(true, false, new NullProgressMonitor());
-		}	
-	}
-	
-	public void testFile2() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getCorrespondingResource();	
-		String oldName= "a.txt";
-		String newName= "b.txt";
-		try{ 
-			IFile file= folder.getFile(oldName);
-			assertTrue("should not exist", ! file.exists());
-			String content= "aaaaaaaaa";
-			file.create(getStream(content), true, new NullProgressMonitor());
-			assertTrue("should exist", file.exists());
-			
-			IChange change= new RenameResourceChange(file, newName);
-			performChange(change);
-			assertTrue("after: should exist", folder.getFile(newName).exists());
-			assertTrue("after: old should not exist", ! folder.getFile(oldName).exists());
-			//------
-			
-			assertTrue("should be undoable", change.isUndoable());	
-			IChange undoChange= change.getUndoChange();
-			performChange(undoChange);
-			assertTrue("after undo: should exist", folder.getFile(oldName).exists());
-			assertTrue("after undo: old should not exist", ! folder.getFile(newName).exists());
-		} finally{		
-			performDummySearch();
-			folder.getFile(oldName).delete(true, false, new NullProgressMonitor());
-		}	
-	}
-	
-	
-	public void testFolder0() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getCorrespondingResource();	
-		String newName= "b";
-		try{
-			String oldName= "a";
-			IFolder subFolder= folder.getFolder(oldName);
-			assertTrue("should not exist", ! subFolder.exists());
-			subFolder.create(true, true, null);
-			assertTrue("should exist", subFolder.exists());
-			
-			
-			IChange change= new RenameResourceChange(subFolder, newName);
-			performChange(change);
-			assertTrue("after: should exist", folder.getFolder(newName).exists());
-			assertTrue("after: old should not exist", ! folder.getFolder(oldName).exists());
-		} finally{	
-			performDummySearch();
-			folder.getFolder(newName).delete(true, false, new NullProgressMonitor());
-		}	
-	}
-	
-	public void testFolder1() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getCorrespondingResource();	
-		String newName= "b";
-		
-		try{
-			String oldName= "a";
-			IFolder subFolder= folder.getFolder(oldName);
-			assertTrue("should not exist", ! subFolder.exists());
-			subFolder.create(true, true, null);
-			IFile file1= subFolder.getFile("a.txt");
-			IFile file2= subFolder.getFile("b.txt");
-			file1.create(getStream("123"), true, null);
-			file2.create(getStream("123345"), true, null);
-			
-			assertTrue("should exist", subFolder.exists());
-			assertTrue("file1 should exist", file1.exists());
-			assertTrue("file2 should exist", file2.exists());
-			
-			IChange change= new RenameResourceChange(subFolder, newName);
-			performChange(change);
-			assertTrue("after: should exist", folder.getFolder(newName).exists());
-			assertTrue("after: old should not exist", ! folder.getFolder(oldName).exists());
-			assertEquals("after: child count", 2, folder.getFolder(newName).members().length);
-		} finally{	
-			performDummySearch();
-			folder.getFolder(newName).delete(true, false, new NullProgressMonitor());
-		}	
-	}	
-	
-	public void testFolder2() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getCorrespondingResource();	
-		String oldName= "a";
-		String newName= "b";
-		try{
-			IFolder subFolder= folder.getFolder(oldName);
-			assertTrue("should not exist", ! subFolder.exists());
-			subFolder.create(true, true, null);
-			assertTrue("should exist", subFolder.exists());
-			
-			
-			IChange change= new RenameResourceChange(subFolder, newName);
-			performChange(change);
-			assertTrue("after: should exist", folder.getFolder(newName).exists());
-			assertTrue("after: old should not exist", ! folder.getFolder(oldName).exists());
-		
-			//---
-			assertTrue("should be undoable", change.isUndoable());	
-			IChange undoChange= change.getUndoChange();
-			performChange(undoChange);
-			assertTrue("after undo: should exist", folder.getFolder(oldName).exists());
-			assertTrue("after undo: old should not exist", ! folder.getFolder(newName).exists());
-		} finally{		
-			performDummySearch();
-			folder.getFolder(oldName).delete(true, false, new NullProgressMonitor());
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameSourceFolderChangeTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameSourceFolderChangeTests.java
deleted file mode 100644
index 5d71a26..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameSourceFolderChangeTests.java
+++ /dev/null
@@ -1,93 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.internal.corext.refactoring.changes.RenameSourceFolderChange;
-
-
-public class RenameSourceFolderChangeTests extends RefactoringTest {
-	
-	private static final Class clazz= RenameSourceFolderChangeTests.class;
-
-	public RenameSourceFolderChangeTests(String name){
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	public void test0() throws Exception {
-		String oldName= "oldName";
-		String newName= "newName";
-		
-		try{
-			IJavaProject testProject= MySetup.getProject();
-			IPackageFragmentRoot oldRoot= JavaProjectHelper.addSourceContainer(MySetup.getProject(), oldName);
-			
-			assertTrue("old folder should exist here", oldRoot.exists());
-			
-			RenameSourceFolderChange change= new RenameSourceFolderChange(oldRoot, newName);
-			performChange(change);
-			
-			assertTrue("old folder should not exist", ! oldRoot.exists());
-			assertEquals("expected 3 pfr's", 3, testProject.getPackageFragmentRoots().length);
-			IPackageFragmentRoot[] newRoots= testProject.getPackageFragmentRoots();
-			for (int i= 0; i < newRoots.length; i++){
-				assertTrue("should exist " + i, newRoots[i].exists());
-			}
-		} finally{
-			JavaProjectHelper.removeSourceContainer(MySetup.getProject(), newName);
-		}	
-	}
-	
-	public void test1() throws Exception {
-		String oldName1= "oldName1";
-		String oldName2= "oldName2";
-		String newName1= "newName";
-		
-		try{
-			
-			IJavaProject testProject= MySetup.getProject();
-			IPackageFragmentRoot oldRoot1= JavaProjectHelper.addSourceContainer(MySetup.getProject(), oldName1);
-			IPackageFragmentRoot oldRoot2= JavaProjectHelper.addSourceContainer(MySetup.getProject(), oldName2);
-			
-			assertTrue("old folder should exist here", oldRoot1.exists());
-			assertTrue("old folder 2 should exist here", oldRoot2.exists());
-			
-			RenameSourceFolderChange change= new RenameSourceFolderChange(oldRoot1, newName1);
-			performChange(change);
-			
-			assertTrue("old folder should not exist", ! oldRoot1.exists());
-			assertEquals("expected 4 pfr's", 4, testProject.getPackageFragmentRoots().length);
-			IPackageFragmentRoot[] newRoots= testProject.getPackageFragmentRoots();
-			for (int i= 0; i < newRoots.length; i++){
-				//DebugUtils.dump(newRoots[i].getElementName());
-				assertTrue("should exist " + i, newRoots[i].exists());
-				if (i == 2)
-					assertEquals("3rd position should be:" + newName1, newName1, newRoots[i].getElementName());
-			} 
-		}finally{		
-			JavaProjectHelper.removeSourceContainer(MySetup.getProject(), newName1);
-			JavaProjectHelper.removeSourceContainer(MySetup.getProject(), oldName2);
-		}	
-	}
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameStaticMethodTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameStaticMethodTests.java
deleted file mode 100644
index b7bb515..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameStaticMethodTests.java
+++ /dev/null
@@ -1,216 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameMethodProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-public class RenameStaticMethodTests extends RefactoringTest {
-	private static final Class clazz= RenameStaticMethodTests.class;
-	private static final String REFACTORING_PATH= "RenameStaticMethod/";
-
-	public RenameStaticMethodTests(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	private void helper1_0(String methodName, String newMethodName, String[] signatures) throws Exception{
-			IType classA= getType(createCUfromTestFile(getPackageP(), "A"), "A");
-		try{
-			RenameRefactoring refactoring= new RenameRefactoring(classA.getMethod(methodName, signatures));
-			RenameMethodProcessor processor= (RenameMethodProcessor)refactoring.getProcessor();
-			processor.setNewElementName(newMethodName);
-			RefactoringStatus result= performRefactoring(refactoring);
-			assertNotNull("precondition was supposed to fail", result);
-		} finally{
-			performDummySearch();
-			classA.getCompilationUnit().delete(true, null);
-		}	
-	}
-	
-	private void helper1() throws Exception{
-		helper1_0("m", "k", new String[0]);
-	}
-	
-	private void helper2_0(String methodName, String newMethodName, String[] signatures, boolean updateReferences) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		try{
-			IType classA= getType(cu, "A");
-			RenameRefactoring refactoring= new RenameRefactoring(classA.getMethod(methodName, signatures));
-			RenameMethodProcessor processor= (RenameMethodProcessor)refactoring.getProcessor();
-			processor.setUpdateReferences(updateReferences);
-			processor.setNewElementName(newMethodName);
-			assertEquals("was supposed to pass", null, performRefactoring(refactoring));
-			assertEqualLines("invalid renaming", getFileContents(getOutputTestFileName("A")), cu.getSource());
-			
-			assertTrue("anythingToUndo", Refactoring.getUndoManager().anythingToUndo());
-			assertTrue("! anythingToRedo", !Refactoring.getUndoManager().anythingToRedo());
-			//assertEquals("1 to undo", 1, Refactoring.getUndoManager().getRefactoringLog().size());
-			
-			Refactoring.getUndoManager().performUndo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-			assertEqualLines("invalid undo", getFileContents(getInputTestFileName("A")), cu.getSource());
-	
-			assertTrue("! anythingToUndo", !Refactoring.getUndoManager().anythingToUndo());
-			assertTrue("anythingToRedo", Refactoring.getUndoManager().anythingToRedo());
-			//assertEquals("1 to redo", 1, Refactoring.getUndoManager().getRedoStack().size());
-			
-			Refactoring.getUndoManager().performRedo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-			assertEqualLines("invalid redo", getFileContents(getOutputTestFileName("A")), cu.getSource());
-		} finally{
-			performDummySearch();
-			cu.delete(true, null);
-		}
-	}
-	private void helper2_0(String methodName, String newMethodName, String[] signatures) throws Exception{
-		helper2_0(methodName, newMethodName, signatures, true);
-	}
-	
-	private void helper2(boolean updateReferences) throws Exception{
-		helper2_0("m", "k", new String[0], updateReferences);
-	}
-	
-	private void helper2() throws Exception{
-		helper2(true);
-	}
-
-	/********** tests *********/
-	public void testFail0() throws Exception{
-		helper1();
-	}
-	
-	public void testFail1() throws Exception{
-		helper1();
-	}
-	
-	public void testFail2() throws Exception{
-		helper1();
-	}
-	
-	//testFail3 deleted
-	
-	public void testFail4() throws Exception{
-		helper1();
-	}
-	
-	public void testFail5() throws Exception{
-		helper1();
-	}
-	
-	public void testFail6() throws Exception{
-		helper1();
-	}
-	
-	public void testFail7() throws Exception{
-		helper1();
-	}
-	
-	public void testFail8() throws Exception{
-		helper1();
-	}
-	
-	public void test0() throws Exception{
-		helper2();
-	}
-	
-	public void test1() throws Exception{
-		helper2();
-	}
-	
-	public void test2() throws Exception{
-		helper2();
-	}
-	
-	public void test3() throws Exception{
-		helper2();
-	}
-	
-	public void test4() throws Exception{
-		helper2();
-	}
-	
-	public void test5() throws Exception{
-		helper2();
-	}
-	
-	public void test6() throws Exception{
-		helper2();
-	}
-	
-	public void test7() throws Exception{
-		helper2_0("m", "k", new String[]{Signature.SIG_INT});
-	}
-	
-	public void test8() throws Exception{
-		helper2_0("m", "k", new String[]{Signature.SIG_INT});
-	}
-	
-	public void test9() throws Exception{
-		helper2_0("m", "k", new String[]{Signature.SIG_INT}, false);
-	}
-	
-	public void test10() throws Exception{
-//		printTestDisabledMessage("bug 40628");
-//		if (true)	return;
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(getPackageP(), "B");
-
-		IType classB= getType(cuB, "B");
-		RenameRefactoring refactoring= new RenameRefactoring(classB.getMethod("method", new String[0]));
-		RenameMethodProcessor processor= (RenameMethodProcessor)refactoring.getProcessor();
-		processor.setUpdateReferences(true);
-		processor.setNewElementName("newmethod");
-		assertEquals("was supposed to pass", null, performRefactoring(refactoring));
-		assertEqualLines("invalid renaming in A", getFileContents(getOutputTestFileName("A")), cuA.getSource());
-		assertEqualLines("invalid renaming in B", getFileContents(getOutputTestFileName("B")), cuB.getSource());
-	}
-
-	public void test11() throws Exception{
-//		printTestDisabledMessage("bug 40452");
-//		if (true)	return;
-		IPackageFragment packageA= getRoot().createPackageFragment("a", false, new NullProgressMonitor());
-		IPackageFragment packageB= getRoot().createPackageFragment("b", false, new NullProgressMonitor());
-		try {
-			ICompilationUnit cuA= createCUfromTestFile(packageA, "A");
-			ICompilationUnit cuB= createCUfromTestFile(packageB, "B");
-	
-			IType classA= getType(cuA, "A");
-			RenameRefactoring refactoring= new RenameRefactoring(classA.getMethod("method2", new String[0]));
-			RenameMethodProcessor processor= (RenameMethodProcessor)refactoring.getProcessor();
-			processor.setUpdateReferences(true);
-			processor.setNewElementName("fred");
-			assertEquals("was supposed to pass", null, performRefactoring(refactoring));
-			assertEqualLines("invalid renaming in A", getFileContents(getOutputTestFileName("A")), cuA.getSource());
-			assertEqualLines("invalid renaming in B", getFileContents(getOutputTestFileName("B")), cuB.getSource());
-		} finally{
-			packageA.delete(true, new NullProgressMonitor());
-			packageB.delete(true, new NullProgressMonitor());
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTempTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTempTests.java
deleted file mode 100644
index fc93c28..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTempTests.java
+++ /dev/null
@@ -1,499 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.internal.corext.SourceRange;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameTempRefactoring;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TextRangeUtil;
-
-public class RenameTempTests extends RefactoringTest{
-	
-	private static final Class clazz= RenameTempTests.class;
-	private static final String REFACTORING_PATH= "RenameTemp/";
-	
-	public RenameTempTests(String name){
-		super(name);
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	public static Test setUpTest(Test test) {
-		return new MySetup(test);
-	}
-	
-	private String getSimpleTestFileName(boolean canRename, boolean input){
-		String fileName = "A_" + getName();
-		if (canRename)
-			fileName += input ? "_in": "_out";
-		return fileName + ".java"; 
-	}
-	
-	private String getTestFileName(boolean canRename, boolean input){
-		String fileName= TEST_PATH_PREFIX + getRefactoringPath();
-		fileName += (canRename ? "canRename/": "cannotRename/");
-		return fileName + getSimpleTestFileName(canRename, input);
-	}
-		
-	//------------
-	protected ICompilationUnit createCUfromTestFile(IPackageFragment pack, boolean canRename, boolean input) throws Exception {
-		return createCU(pack, getSimpleTestFileName(canRename, input), getFileContents(getTestFileName(canRename, input)));
-	}
-	
-	private ISourceRange getSelection(ICompilationUnit cu) throws Exception{
-		String source= cu.getSource();
-		int offset= source.indexOf(AbstractSelectionTestCase.SQUARE_BRACKET_OPEN);
-		int end= source.indexOf(AbstractSelectionTestCase.SQUARE_BRACKET_CLOSE);
-		return new SourceRange(offset, end - offset);
-	}
-
-	private void helper1(String newName, boolean updateReferences, ISourceRange selection, ICompilationUnit cu) throws Exception{
-//		IType classA= getType(cu, "A");
-		RenameTempRefactoring ref= RenameTempRefactoring.create(cu, selection.getOffset(), selection.getLength());
-		ref.setUpdateReferences(updateReferences);
-		ref.setNewName(newName);
-		
-		RefactoringStatus result= performRefactoring(ref);
-		assertEquals("precondition was supposed to pass", null, result);
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		String newCuName= getSimpleTestFileName(true, true);
-		ICompilationUnit newcu= pack.getCompilationUnit(newCuName);
-		assertTrue(newCuName + " does not exist", newcu.exists());
-		assertEqualLines("incorrect renaming", getFileContents(getTestFileName(true, false)), newcu.getSource());
-	}
-	
-	private void helper1(String newName, boolean updateReferences) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		helper1(newName, updateReferences, getSelection(cu), cu);
-	}	
-	
-	private void helper1(String newName, boolean updateReferences, int startLine, int startColumn, int endLine, int endColumn) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), true, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		helper1(newName, updateReferences, selection, cu);
-	}	
-	
-	private void helper1(String newName) throws Exception{
-		helper1(newName, true);
-	}
-
-	private void helper2(String newName, boolean updateReferences) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);
-		ISourceRange selection= getSelection(cu);
-		failTestHelper(newName, updateReferences, cu, selection);
-	}
-
-	private void helper2(String newName, boolean updateReferences, int startLine, int startColumn, int endLine, int endColumn)  throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), false, true);
-		ISourceRange selection= TextRangeUtil.getSelection(cu, startLine, startColumn, endLine, endColumn);
-		failTestHelper(newName, updateReferences, cu, selection);
-	}
-
-	private void failTestHelper(String newName, boolean updateReferences, ICompilationUnit cu, ISourceRange selection) throws Exception {
-		RenameTempRefactoring ref= RenameTempRefactoring.create(cu, selection.getOffset(), selection.getLength());
-		ref.setUpdateReferences(updateReferences);
-		ref.setNewName(newName);
-		
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	private void helper2(String newName) throws Exception{
-		helper2(newName, true);
-	}
-	
-	public void test0() throws Exception{
-		helper1("j");
-	}
-	
-	public void test1() throws Exception{
-		helper1("j");
-	}
-	
-//	public void test2() throws Exception{
-//		Map renaming= new HashMap();
-//		renaming.put("x", "j");
-//		renaming.put("y", "k");
-//		helper1(renaming, new String[0]);
-//	}
-	
-	public void test3() throws Exception{
-		helper1("j1");
-	}
-
-	public void test4() throws Exception{
-		helper1("k");
-	}
-
-	public void test5() throws Exception{
-		helper1("k");
-	}
-
-	public void test6() throws Exception{
-		helper1("k");
-	}
-
-	public void test7() throws Exception{
-		helper1("k");
-	}
-//
-//	//8, 9, 10 removed
-//	
-//
-	public void test11() throws Exception{
-		helper1("j");
-	}
-
-	public void test12() throws Exception{
-		helper1("j");
-	}
-
-	public void test13() throws Exception{
-		helper1("j");
-	}
-
-	public void test14() throws Exception{
-		helper1("j");
-	}
-
-// disabled
-//	public void test15() throws Exception{
-//		Map renaming= new HashMap();
-//		renaming.put("i", "j");
-//		renaming.put("j", "i");
-//		helper1(renaming, new String[0]);
-//	}
-//
-	public void test16() throws Exception{
-		helper1("j");
-	}
-
-// disabled
-//	public void test17() throws Exception{
-//		Map renaming= new HashMap();
-//		renaming.put("i", "j");
-//		renaming.put("j", "i");
-//		helper1(renaming, new String[0]);
-//	}
-//
-	public void test18() throws Exception{
-		helper1("j");
-	}
-
-	public void test19() throws Exception{
-		helper1("j");
-	}
-
-	public void test20() throws Exception{
-		helper1("j");
-	}
-
-	public void test21() throws Exception{
-		helper1("j");
-	}
-	
-	public void test22() throws Exception{
-		helper1("j");
-	}
-
-//	disabled
-//	public void test23() throws Exception{
-//		Map renaming= new HashMap();
-//		renaming.put("i", "j");
-//		renaming.put("j", "i");
-//		helper1(renaming, new String[0]);
-//	}
-
-	public void test24() throws Exception{
-		helper1("j");
-	}
-
-	public void test25() throws Exception{
-		helper1("j");
-	}
-
-	public void test26() throws Exception{
-		helper1("j");
-	}
-
-//  deleted - incorrect. see testFail26
-//	public void test27() throws Exception{
-//		helper1("j");
-//	}
-
-	public void test28() throws Exception{
-		helper1("j");
-	}
-
-	public void test29() throws Exception{
-		helper1("b");
-	}
-
-	public void test30() throws Exception{
-		helper1("k");
-	}
-
-	public void test31() throws Exception{
-		helper1("kk");
-	}
-
-	public void test32() throws Exception{
-		helper1("j");
-	}
-
-	public void test33() throws Exception{
-		helper1("b", false);
-	}
-	
-	public void test34() throws Exception{
-		helper1("j");
-	}
-	
-	public void test35() throws Exception{
-//		printTestDisabledMessage("regression test for bug#9001");
-		helper1("test2");
-	}
-	
-	public void test36() throws Exception{
-//		printTestDisabledMessage("regression test for bug#7630");
-		helper1("j", true, 5, 13, 5, 14);
-	}
-
-	public void test37() throws Exception{
-//		printTestDisabledMessage("regression test for bug#7630");
-		helper1("j", true, 5, 16, 5, 17);
-	}
-	
-	public void test38() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#11453");
-		helper1("i", true, 7, 12, 7, 13);
-	}
-	
-	public void test39() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#11440");
-		helper1("j", true, 7, 16, 7, 18);
-	}
-	
-	public void test40() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#10660");
-		helper1("j", true, 3, 12, 3, 17);
-	}
-	
-	public void test41() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#10660");
-		helper1("j", true, 3, 13, 3, 18);
-	}
-
-	public void test42() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#10660");
-		helper1("j", true, 3, 25, 3, 26);
-	}
-
-	public void test43() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#10660");
-		helper1("j", true, 4, 19, 4, 24);
-	}
-	
-	public void test44() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#12200");
-		helper1("j", true, 6, 11, 6, 14);
-	}
-	
-	public void test45() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#12210");
-		helper1("j", true, 4, 14, 4, 14);
-	}
-
-	public void test46() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#12210");
-		helper1("j", true, 5, 18, 5, 18);
-	}
-	
-	public void test47() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#17922");
-		helper1("newname", true, 7, 13, 7, 17);
-	}
-
-	public void test48() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#22938");
-		helper1("newname", true, 4, 16, 4, 20);
-	}
-
-	public void test49() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#30923 ");
-		helper1("newname", true, 4, 16, 4, 20);
-	}
-	
-	public void test50() throws Exception{
-//		printTestDisabledMessage("regression test for Bug#30923 ");
-		helper1("newname", true, 4, 16, 4, 20);
-	}
-	
-	public void test51() throws Exception {
-//		printTestDisabledMessage("regression test for Bug#47822");
-		helper1("qwerty", true, 5, 19, 5, 20);
-	}
-	
-// -----
-	public void testFail0() throws Exception{
-		printTestDisabledMessage("fails - must revisit");
-//		helper2("j");
-	}
-	
-	public void testFail1() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail2() throws Exception{
-		helper2("i");
-	}
-	
-	public void testFail3() throws Exception{
-		helper2("9");
-	}
-
-	public void testFail4() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail5() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail6() throws Exception{
-		printTestDisabledMessage("fails - must revisit");
-//		helper2("j");
-	}
-
-	public void testFail7() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail8() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail9() throws Exception{
-		helper2("j");
-	}
-	
-	public void testFail10() throws Exception{
-		helper2("uu");
-	}
-
-// disabled - it's allowed now
-//	public void testFail11() throws Exception{
-//		helper2("uu");
-//	}
-	
-	public void testFail12() throws Exception{
-//		printTestDisabledMessage("http://dev.eclipse.org/bugs/show_bug.cgi?id=11638");
-		helper2("j");
-	}
-	
-	public void testFail13() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail14() throws Exception{
-		helper2("j");
-	}	
-
-	public void testFail15() throws Exception{
-		helper2("j");
-	}	
-
-	public void testFail16() throws Exception{
-		helper2("j");
-	}	
-	
-	public void testFail17() throws Exception{
-		helper2("j");
-	}	
-
-	public void testFail18() throws Exception{
-		helper2("j");
-	}	
-
-	public void testFail19() throws Exception{
-		helper2("j");
-	}	
-	
-	public void testFail20() throws Exception{
-		helper2("j");
-	}	
-
-// disabled - it's allowed now	
-//	public void testFail21() throws Exception{
-//		helper2("j");
-//	}
-
-	public void testFail22() throws Exception{
-		helper2("j");
-	}
-
-// disabled - it's allowed now
-//	public void testFail23() throws Exception{
-//		helper2("j");
-//	}
-	
-	public void testFail24() throws Exception{
-		printTestDisabledMessage("compile errors are ok now");
-		//helper2("j");
-	}
-	
-	public void testFail25() throws Exception{
-		helper2("j");
-	}
-	
-	public void testFail26() throws Exception{
-		printTestDisabledMessage("Test disable until it is clear how 1.4 treats this");
-		// helper2("j");
-	}
-	
-	public void testFail27() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail28() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail29() throws Exception{
-		helper2("j");
-	}
-
-	public void testFail30() throws Exception{
-//		printTestDisabledMessage("bug#19851");
-		helper2("j");
-	}
-	public void testFail31() throws Exception{
-		helper2("j", true, 3, 9, 3, 13);
-	}
-	
-	public void testFail32() throws Exception {
-//		printTestDisabledMessage("bug#47822");
-		helper2("j", true, 6, 19, 6, 20);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTests.java
deleted file mode 100644
index 5928984..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTests.java
+++ /dev/null
@@ -1,38 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-
-public class RenameTests {
-
-	private static final Class clazz= RenameTests.class;
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite(clazz.getName());
-
-		suite.addTest(RenameVirtualMethodInClassTests.suite());
-		suite.addTest(RenameMethodInInterfaceTests.suite());
-		suite.addTest(RenamePrivateMethodTests.suite());	
-		suite.addTest(RenameStaticMethodTests.suite());
-		suite.addTest(RenameParametersTests.suite());
-		suite.addTest(RenameTypeTests.suite());	
-		suite.addTest(RenamePackageTests.suite());
-		suite.addTest(RenamePrivateFieldTests.suite());
-		suite.addTest(RenameNonPrivateFieldTests.suite());
-		suite.addTest(RenameJavaProjectTests.suite());
-				
-		return suite;
-	}
-}
- 
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTypeTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTypeTests.java
deleted file mode 100644
index 64b8339..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameTypeTests.java
+++ /dev/null
@@ -1,1008 +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.jdt.ui.tests.refactoring;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStreamReader;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.boot.BootLoader;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameTypeProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.tagging.IQualifiedNameUpdating;
-import org.eclipse.jdt.ui.tests.refactoring.infra.DebugUtils;
-
-public class RenameTypeTests extends RefactoringTest {
-	
-	private static final Class clazz= RenameTypeTests.class;
-	private static final String REFACTORING_PATH= "RenameType/";
-	
-	public RenameTypeTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-		
-	/******* shortcuts **********/
-	
-	private IType getClassFromTestFile(IPackageFragment pack, String className) throws Exception{
-		return getType(createCUfromTestFile(pack, className), className);
-	}
-		
-	private RenameRefactoring createRefactoring(IType type, String newName) throws CoreException {
-		RenameRefactoring ref= new RenameRefactoring(type);
-		ref.setNewName(newName);
-		return ref;
-	}
-	
-	private void helper1_0(String className, String newName) throws Exception{
-		IType classA= getClassFromTestFile(getPackageP(), className);
-		Refactoring ref= createRefactoring(classA, newName);
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);
-		if (fIsVerbose)
-			DebugUtils.dump("result: " + result);
-	}
-	
-	private void helper1() throws Exception{
-		helper1_0("A", "B");
-	}
-		
-	private void helper2_0(String oldCuName, String oldName, String newName, String newCUName, boolean updateReferences, boolean updateJavaDoc, 
-											boolean updateComments, boolean updateStrings) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), oldCuName);
-		IType classA= getType(cu, oldName);
-		
-		IPackageFragment pack= (IPackageFragment)cu.getParent();
-		RenameRefactoring ref= createRefactoring(classA, newName);
-		RenameTypeProcessor processor= (RenameTypeProcessor)ref.getProcessor();
-		processor.setUpdateReferences(updateReferences);
-		processor.setUpdateJavaDoc(updateJavaDoc);
-		processor.setUpdateComments(updateComments);
-		processor.setUpdateStrings(updateStrings);
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		ICompilationUnit newcu= pack.getCompilationUnit(newCUName + ".java");
-		assertTrue("cu " + newcu.getElementName()+ " does not exist", newcu.exists());
-		assertEqualLines("invalid renaming", getFileContents(getOutputTestFileName(newCUName)), newcu.getSource());	
-	}
-	
-	private void helper2_0(String oldName, String newName, String newCUName, boolean updateReferences) throws Exception{
-		helper2_0(oldName, oldName, newName, newCUName, updateReferences, false, false, false);
-	}
-	
-	private void helper2(String oldName, String newName, boolean updateReferences) throws Exception{
-		helper2_0(oldName, newName, newName, updateReferences);
-	}
-
-	private void helper2(String oldName, String newName) throws Exception{
-		helper2_0(oldName, newName, newName, true);
-	}
-				
-	/****** tests ***********/
-	
-	public void testIllegalInnerClass() throws Exception {
-		helper1();
-	}
-	
-	public void testIllegalTypeName1() throws Exception {
-		helper1_0("A", "X ");
-	}
-	
-	public void testIllegalTypeName2() throws Exception {
-		helper1_0("A", " X");
-	}
-	
-	public void testIllegalTypeName3() throws Exception {
-		helper1_0("A", "34");
-	}
-
-	public void testIllegalTypeName4() throws Exception {
-		helper1_0("A", "this");
-	}
-
-	public void testIllegalTypeName5() throws Exception {
-		helper1_0("A", "fred");
-	}
-	
-	public void testIllegalTypeName6() throws Exception {
-		helper1_0("A", "class");
-	}
-	
-	public void testIllegalTypeName7() throws Exception {
-		helper1_0("A", "A.B");
-	}
-
-	public void testIllegalTypeName8() throws Exception {
-		helper1_0("A", "A$B");
-	}
-	
-	public void testIllegalTypeName9() throws Exception {
-		if (BootLoader.getOS().equals(BootLoader.OS_WIN32))
-			helper1_0("A", "aux");
-	}
-
-	public void testNoOp() throws Exception {
-		helper1_0("A", "A");
-	}
-
-	public void testWrongArg1() throws Exception {
-		helper1_0("A", "");
-	}
-	
-	public void testFail0() throws Exception {
-		helper1();
-	}
-	
-	public void testFail1() throws Exception {
-		helper1();
-	}
-
-	public void testFail2() throws Exception {
-		helper1();
-	}
-	
-	public void testFail3() throws Exception {
-		helper1();
-	}
-	
-	public void testFail4() throws Exception {
-		IType classA= getClassFromTestFile(getPackageP(), "A");
-		getClassFromTestFile(getPackageP(), "B");
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-		
-	public void testFail5() throws Exception {
-		IType classA= getClassFromTestFile(getPackageP(), "A");
-		getClassFromTestFile(getPackageP(), "B");
-		getClassFromTestFile(getPackageP(), "C");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	public void testFail6() throws Exception {
-		IType classA= getClassFromTestFile(getPackageP(), "A");
-		getClassFromTestFile(getPackageP(), "B");
-		getClassFromTestFile(getPackageP(), "C");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	public void testFail7() throws Exception {
-		helper1();
-	}
-	
-	public void testFail8() throws Exception {
-		IType classA= getClassFromTestFile(getPackageP(), "A");
-		getClassFromTestFile(getPackageP(), "B");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	public void testFail9() throws Exception {
-		helper1();
-	}
-	
-	public void testFail10() throws Exception {
-		helper1();
-	}
-
-	public void testFail11() throws Exception {
-		helper1();
-	}
-
-	public void testFail12() throws Exception {
-		helper1();
-	}
-
-	public void testFail16() throws Exception {
-		helper1();
-	}
-
-	public void testFail17() throws Exception {
-		helper1();
-	}
-
-	public void testFail18() throws Exception {
-		helper1();
-	}
-
-	public void testFail19() throws Exception {
-		helper1();
-	}
-
-	public void testFail20() throws Exception {
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		IPackageFragment packageP2= getRoot().createPackageFragment("p2", true, null);
-
-		IType classA= getClassFromTestFile(packageP1, "A");
-		getClassFromTestFile(packageP2, "AA");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	public void testFail22() throws Exception {
-		IType classA= getClassFromTestFile(getPackageP(), "A");
-		getClassFromTestFile(getPackageP(), "B");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	public void testFail23() throws Exception {
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		IPackageFragment packageP2= getRoot().createPackageFragment("p2", true, null);
-		IPackageFragment packageP3= getRoot().createPackageFragment("p3", true, null);
-
-		IType classA= getClassFromTestFile(packageP1, "A");
-		getClassFromTestFile(packageP3, "B");
-		getClassFromTestFile(packageP2, "Bogus");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	public void testFail24() throws Exception {
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		IPackageFragment packageP2= getRoot().createPackageFragment("p2", true, null);
-
-		IType classA= getClassFromTestFile(packageP1, "A");
-		getClassFromTestFile(packageP2, "B");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	public void testFail25() throws Exception {
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		IPackageFragment packageP2= getRoot().createPackageFragment("p2", true, null);
-
-		IType classA= getClassFromTestFile(packageP1, "A");
-		getClassFromTestFile(packageP2, "B");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	public void testFail26() throws Exception {
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		IPackageFragment packageP2= getRoot().createPackageFragment("p2", true, null);
-
-		IType classA= getClassFromTestFile(packageP1, "A");
-		getClassFromTestFile(packageP2, "B");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	public void testFail27() throws Exception {
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		IPackageFragment packageP2= getRoot().createPackageFragment("p2", true, null);
-
-		IType classA= getClassFromTestFile(packageP1, "A");
-		getClassFromTestFile(packageP2, "B");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	public void testFail28() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail29() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail30() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail31() throws Exception {
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		IPackageFragment packageP2= getRoot().createPackageFragment("p2", true, null);
-		IPackageFragment packageP3= getRoot().createPackageFragment("p3", true, null);
-
-		IType classA= getClassFromTestFile(packageP1, "A");
-		getClassFromTestFile(packageP2, "B");
-		getClassFromTestFile(packageP3, "C");
-
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-
-	public void testFail32() throws Exception {
-		IType classA= getClassFromTestFile(getPackageP(), "A");
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		getClassFromTestFile(packageP1, "B");
-		
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	public void testFail33() throws Exception {
-		helper1();
-	}
-
-	public void testFail34() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail35() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail36() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-		
-	public void testFail37() throws Exception {
-		IType classA= getClassFromTestFile(getPackageP(), "A");
-		getClassFromTestFile(getPackageP(), "B");
-		
-		RefactoringStatus result= performRefactoring(createRefactoring(classA, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	public void testFail38() throws Exception {
-		helper1();
-	}
-	
-	public void testFail39() throws Exception {
-		helper1();
-	}
-	
-	public void testFail40() throws Exception {
-		helper1();
-	}
-	
-	public void testFail41() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail42() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-
-	public void testFail43() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-
-	public void testFail44() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail45() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail46() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail47() throws Exception {
-		printTestDisabledMessage("obscuring");
-//		helper1();
-	}
-	
-	public void testFail48() throws Exception {
-		helper1();
-	}
-	
-	public void testFail49() throws Exception {
-		helper1();
-	}
-	
-	public void testFail50() throws Exception {
-		helper1();
-	}
-
-	public void testFail51() throws Exception {
-		helper1();
-	}
-
-	public void testFail52() throws Exception {
-		helper1();
-	}
-	
-	public void testFail53() throws Exception {
-		helper1();
-	}
-	
-	public void testFail54() throws Exception {
-		helper1();
-	}
-	
-	public void testFail55() throws Exception {
-		helper1();
-	}
-	
-	public void testFail56() throws Exception {
-		helper1();
-	}
-	
-	public void testFail57() throws Exception {
-		helper1();
-	}
-	
-	public void testFail58() throws Exception {
-		helper1();
-	}
-
-	public void testFail59() throws Exception {
-		helper1();
-	}
-
-	public void testFail60() throws Exception {
-		helper1();
-	}
-	
-	public void testFail61() throws Exception {
-		helper1();
-	}
-	
-	public void testFail62() throws Exception {
-		helper1();
-	}
-	
-	public void testFail63() throws Exception {
-		helper1();
-	}
-	
-	public void testFail64() throws Exception {
-		helper1();
-	}
-	
-	public void testFail65() throws Exception {
-		helper1();
-	}
-	
-	public void testFail66() throws Exception {
-		helper1();
-	}
-
-	public void testFail67() throws Exception {
-		helper1();
-	}
-
-	public void testFail68() throws Exception {
-		helper1();
-	}
-	
-	public void testFail69() throws Exception {
-		helper1();
-	}
-	
-	public void testFail70() throws Exception {
-		helper1();
-	}
-	
-	public void testFail71() throws Exception {
-		helper1();
-	}
-	
-	public void testFail72() throws Exception {
-		helper1();
-	}
-	
-	public void testFail73() throws Exception {
-		helper1();
-	}
-	
-	public void testFail74() throws Exception {
-		helper1();
-	}
-	
-	public void testFail75() throws Exception {
-		helper1();
-	}
-	
-	public void testFail76() throws Exception {
-		helper1();
-	}
-
-	public void testFail77() throws Exception {
-		helper1();
-	}
-
-	public void testFail78() throws Exception {
-		helper1();
-	}
-	
-	public void testFail79() throws Exception {
-		helper1();
-	}
-
-	public void testFail80() throws Exception {
-		helper1();
-	}
-	
-	public void testFail81() throws Exception {
-		helper1();
-	}
-	
-	public void testFail82() throws Exception {
-		helper1();
-	}
-	
-	public void testFail83() throws Exception {
-		helper1_0("A", "Cloneable");
-	}
-	
-	public void testFail84() throws Exception {
-		helper1_0("A", "List");
-	}
-	
-	public void testFail85() throws Exception {
-		helper1();
-	}
-	
-	public void testFail86() throws Exception {
-		printTestDisabledMessage("native method with A as parameter (same CU)");
-//		helper1();
-	}
-
-	public void testFail87() throws Exception {
-		printTestDisabledMessage("native method with A as parameter (same CU)");
-//		helper1();
-	}
-	
-	public void testFail88() throws Exception {
-		helper1();
-	}
-	
-	public void testFail89() throws Exception {
-		helper1();
-	}
-	
-	public void testFail90() throws Exception {
-		helper1();
-	}
-	
-	public void testFail91() throws Exception {
-		helper1();
-	}
-
-	public void testFail92() throws Exception {
-//		printTestDisabledMessage("needs fixing - double nested local type named B");
-		helper1();
-	}
-
-	public void testFail93() throws Exception {
-//		printTestDisabledMessage("needs fixing - double nested local type named B");
-		helper1();
-	}
-	
-	public void testFail94() throws Exception {
-		helper1();
-	}
-	
-	public void testFail95() throws Exception {
-		helper1();
-	}
-
-	public void testFail00() throws Exception {
-		helper1();
-	}
-	
-	public void testFail01() throws Exception {
-		helper1_0("A", "B");
-	}
-
-	public void testFail02() throws Exception {
-		helper1();
-	}
-
-	public void testFail03() throws Exception {
-		helper1_0("A", "C");
-	}
-
-	public void testFail04() throws Exception {
-		helper1_0("A", "A");
-	}
-	
-	public void testFailRegression1GCRKMQ() throws Exception {
-		IPackageFragment myPackage= getRoot().createPackageFragment("", true, new NullProgressMonitor());
-		IType myClass= getClassFromTestFile(myPackage, "Blinky");
-		
-		RefactoringStatus result= performRefactoring(createRefactoring(myClass, "B"));
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	/******************/
-	
-	public void test0() throws Exception { 
-		helper2("A", "B");
-	}
-	
-	public void test1() throws Exception { 
-		helper2("A", "B");
-	}
-	
-	public void test10() throws Exception { 
-		helper2("A", "B");
-	}
-	
-	public void test12() throws Exception { 
-		helper2("A", "B");
-	}
-	
-	public void test13() throws Exception { 
-		helper2("A", "B");
-	}
-	
-	public void test14() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test15() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test16() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test17() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test18() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test19() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test2() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test20() throws Exception { 
-		//printTestDisabledMessage("failb because of bug#9479");
-		//if (true)
-		//	return;
-		IPackageFragment packageA= getRoot().createPackageFragment("A", true, null);
-		
-		ICompilationUnit cu= createCUfromTestFile(packageA, "A");
-		IType classA= getType(cu, "A");
-		
-		Refactoring ref= createRefactoring(classA, "B");
-		
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		
-		ICompilationUnit newcu= packageA.getCompilationUnit("B.java");
-		assertEqualLines("invalid renaming", getFileContents(getOutputTestFileName("B")), newcu.getSource());
-	}
-	
-	public void test21() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test22() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test23() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test24() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test25() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test26() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test27() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test28() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test29() throws Exception { 
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		createCUfromTestFile(packageP1, "C");
-		
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-				
-		Refactoring ref= createRefactoring(classA, "B");
-		
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		
-		ICompilationUnit newcu= getPackageP().getCompilationUnit("B.java");
-		ICompilationUnit newcuC= packageP1.getCompilationUnit("C.java");
-		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("B")), newcu.getSource());
-		assertEqualLines("invalid renaming C", getFileContents(getOutputTestFileName("C")), newcuC.getSource());		
-		
-	}
-	
-	public void test3() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test30() throws Exception { 
-		createCUfromTestFile(getPackageP(), "AA");
-		
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-				
-		Refactoring ref= createRefactoring(classA, "B");
-		
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		
-		ICompilationUnit newcu= getPackageP().getCompilationUnit("B.java");
-		ICompilationUnit newcuAA= getPackageP().getCompilationUnit("AA.java");
-		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("B")), newcu.getSource());
-		assertEqualLines("invalid renaming AA", getFileContents(getOutputTestFileName("AA")), newcuAA.getSource());		
-	}
-	public void test31() throws Exception {
-		createCUfromTestFile(getPackageP(), "AA");
-		
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-				
-		Refactoring ref= createRefactoring(classA, "B");
-		
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		
-		ICompilationUnit newcu= getPackageP().getCompilationUnit("B.java");
-		ICompilationUnit newcuAA= getPackageP().getCompilationUnit("AA.java");
-		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("B")), newcu.getSource());
-		assertEqualLines("invalid renaming AA", getFileContents(getOutputTestFileName("AA")), newcuAA.getSource());		
-	}
-	public void test32() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test33() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test34() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test35() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test36() throws Exception { 
-		helper2("A", "B");		
-	}
-
-	public void test37() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test38() throws Exception { 
-		helper2("A", "B");			
-	}
-
-	public void test39() throws Exception { 
-		helper2("A", "B");		
-	}
-		
-	public void test4() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test40() throws Exception { 
-		//printTestDisabledMessage("search engine bug");
-		helper2("A", "B");		
-	}
-	
-	public void test41() throws Exception { 
-		helper2("A", "B");		
-	}
-		
-	public void test42() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test43() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test44() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test45() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test46() throws Exception { 	
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		createCUfromTestFile(packageP1, "C");
-		
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-				
-		Refactoring ref= createRefactoring(classA, "B");
-		
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		
-		ICompilationUnit newcu= getPackageP().getCompilationUnit("B.java");
-		ICompilationUnit newcuC= packageP1.getCompilationUnit("C.java");
-		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("B")), newcu.getSource());
-		assertEqualLines("invalid renaming C", getFileContents(getOutputTestFileName("C")), newcuC.getSource());		
-	}
-	
-	public void test47() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test48() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test49() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test50() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test51() throws Exception { 
-		IPackageFragment packageP1= getRoot().createPackageFragment("p1", true, null);
-		createCUfromTestFile(packageP1, "C");
-		
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-				
-		Refactoring ref= createRefactoring(classA, "B");
-		
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		
-		ICompilationUnit newcu= getPackageP().getCompilationUnit("B.java");
-		ICompilationUnit newcuC= packageP1.getCompilationUnit("C.java");
-		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("B")), newcu.getSource());
-		assertEqualLines("invalid renaming C", getFileContents(getOutputTestFileName("C")), newcuC.getSource());		
-	}
-	
-	public void test52() throws Exception {
-		//printTestDisabledMessage("1GJY2XN: ITPJUI:WIN2000 - rename type: error when with reference");
-		helper2("A", "B");		
-	}
-
-	public void test53() throws Exception { 
-		helper2("A", "B", false);		
-	}
-	
-	public void test54() throws Exception { 
-		//printTestDisabledMessage("waiting for: 1GKAQJS: ITPJCORE:WIN2000 - search: incorrect results for nested types");
-		helper2_0("A", "X", "XYZ", "A", true, false, false, false);		
-	}
-	
-	public void test55() throws Exception { 
-		//printTestDisabledMessage("waiting for: 1GKAQJS: ITPJCORE:WIN2000 - search: incorrect results for nested types");
-		helper2_0("A", "X", "XYZ", "A", false, false, false, false);		
-	}
-	
-	public void test57() throws Exception {
-		helper2_0("A", "A", "B", "B", true, true, true, true);
-	}
-	
-	public void test58() throws Exception {
-		//printTestDisabledMessage("bug#16751");
-		helper2("A", "B");
-	}
-
-	public void test59() throws Exception {
-//		printTestDisabledMessage("bug#22938");
-		helper2("A", "B");
-	}
-
-	public void test60() throws Exception {
-//		printTestDisabledMessage("test for bug 24740");
-		helper2_0("A", "A", "B", "B", true, true, true, true);
-	}
-		
-	public void test5() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test6() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test7() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test8() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void test9() throws Exception { 
-		helper2("A", "B");		
-	}
-	
-	public void testQualifiedName1() throws Exception {
-		getRoot().createPackageFragment("p", true, null);
-		
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-		
-		String content= getFileContents(getTestPath() + "testQualifiedName1/in/build.xml");
-		IProject project= classA.getJavaProject().getProject();
-		IFile file= project.getFile("build.xml");
-		file.create(new ByteArrayInputStream(content.getBytes()), true, null);
-				
-		RenameRefactoring ref= createRefactoring(classA, "B");
-		
-		IQualifiedNameUpdating qr= (IQualifiedNameUpdating)ref.getProcessor();
-		qr.setUpdateQualifiedNames(true);
-		qr.setFilePatterns("*.xml");
-		
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		
-		ICompilationUnit newcu= getPackageP().getCompilationUnit("B.java");
-		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("B")), newcu.getSource());
-		InputStreamReader reader= new InputStreamReader(file.getContents(true));
-		StringBuffer newContent= new StringBuffer();
-		int ch;
-		try {
-			while((ch= reader.read()) != -1)
-				newContent.append((char)ch);
-		} finally {
-			if (reader != null)
-				reader.close();
-		}
-		String definedContent= getFileContents(getTestPath() + "testQualifiedName1/out/build.xml");
-		assertEqualLines("invalid updating build.xml", newContent.toString(), definedContent);
-		
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameVirtualMethodInClassTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameVirtualMethodInClassTests.java
deleted file mode 100644
index 4bfb11a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameVirtualMethodInClassTests.java
+++ /dev/null
@@ -1,410 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameMethodProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.rename.RenameRefactoring;
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-public class RenameVirtualMethodInClassTests extends RefactoringTest {
-	
-	private static final Class clazz= RenameVirtualMethodInClassTests.class;
-	private static final String REFACTORING_PATH= "RenameVirtualMethodInClass/";
-		
-	public RenameVirtualMethodInClassTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	protected String getRefactoringPath(){
-		return REFACTORING_PATH;
-	}
-
-	private void helper1_not_available(String methodName, String[] signatures) throws Exception{
-		IType classA= getType(createCUfromTestFile(getPackageP(), "A"), "A");
-		RenameRefactoring ref= new RenameRefactoring(classA.getMethod(methodName, signatures));
-		assertTrue(! ref.isAvailable());
-	}	
-	
-	private void helper1_0(String methodName, String newMethodName, String[] signatures) throws Exception{
-		IType classA= getType(createCUfromTestFile(getPackageP(), "A"), "A");
-		RenameRefactoring ref= new RenameRefactoring(classA.getMethod(methodName, signatures));
-		ref.setNewName(newMethodName);
-		RefactoringStatus result= performRefactoring(ref);
-		assertNotNull("precondition was supposed to fail", result);
-	}
-	
-	private void helper1() throws Exception{
-		helper1_0("m", "k", new String[0]);
-	}
-	
-	private void helper2_0(String methodName, String newMethodName, String[] signatures, boolean shouldPass, boolean updateReferences) throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		IType classA= getType(cu, "A");
-		RenameRefactoring ref= new RenameRefactoring(classA.getMethod(methodName, signatures));
-		RenameMethodProcessor pro=  (RenameMethodProcessor)ref.getProcessor();
-		pro.setUpdateReferences(updateReferences);
-		pro.setNewElementName(newMethodName);
-		
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		if (!shouldPass){
-			assertTrue("incorrect renaming because of java model", ! getFileContents(getOutputTestFileName("A")).equals(cu.getSource()));
-			return;
-		}
-		String expectedRenaming= getFileContents(getOutputTestFileName("A"));
-		String actuaRenaming= cu.getSource();
-		assertEqualLines("incorrect renaming", expectedRenaming, actuaRenaming);
-		
-		assertTrue("anythingToUndo", Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("! anythingToRedo", !Refactoring.getUndoManager().anythingToRedo());
-		//assertEquals("1 to undo", 1, Refactoring.getUndoManager().getRefactoringLog().size());
-		
-		Refactoring.getUndoManager().performUndo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid undo", getFileContents(getInputTestFileName("A")), cu.getSource());
-
-		assertTrue("! anythingToUndo", !Refactoring.getUndoManager().anythingToUndo());
-		assertTrue("anythingToRedo", Refactoring.getUndoManager().anythingToRedo());
-		//assertEquals("1 to redo", 1, Refactoring.getUndoManager().getRedoStack().size());
-		
-		Refactoring.getUndoManager().performRedo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-		assertEqualLines("invalid redo", getFileContents(getOutputTestFileName("A")), cu.getSource());
-	}
-	
-	private void helper2_0(String methodName, String newMethodName, String[] signatures, boolean shouldPass) throws Exception{
-		helper2_0(methodName, newMethodName, signatures, shouldPass, true);
-	}
-	
-	private void helper2_0(String methodName, String newMethodName, String[] signatures) throws Exception{
-		helper2_0(methodName, newMethodName, signatures, true);
-	}
-	
-	private void helper2(boolean updateReferences) throws Exception{
-		helper2_0("m", "k", new String[0], true, updateReferences);
-	}
-
-	private void helper2() throws Exception{
-		helper2(true);
-	}
-	
-	private void helper2_fail() throws Exception{
-		helper2_0("m", "k", new String[0], false);
-	}
-	
-/******************************************************************/	
-	public void testFail0() throws Exception{
-		helper1();
-	}
-	
-	public void testFail1() throws Exception{
-		helper1_not_available("toString", new String[0]);
-	}
-	
-	public void testFail2() throws Exception{
-		helper1();
-	}
-	
-	public void testFail3() throws Exception{
-		helper1();
-	}
-	
-	public void testFail4() throws Exception{
-		helper1();
-	}
-	
-	public void testFail5() throws Exception{
-		helper1();
-	}
-	
-	public void testFail6() throws Exception{
-		helper1();
-	}
-	
-	public void testFail7() throws Exception{
-		helper1();
-	}
-	
-	public void testFail8() throws Exception{
-		helper1();
-	}
-	
-	public void testFail9() throws Exception{
-		helper1_0("m", "k", new String[]{Signature.SIG_INT});
-	}
-	
-	public void testFail10() throws Exception{
-		helper1();
-	}
-	
-	public void testFail11() throws Exception{
-		helper1();
-	}
-
-	public void testFail12() throws Exception{
-		helper1();
-	}
-	
-	public void testFail13() throws Exception{
-		helper1();
-	}
-	
-	public void testFail14() throws Exception{
-		helper1_0("m", "k", new String[]{Signature.SIG_INT});
-	}
-	
-	public void testFail15() throws Exception{
-		helper1();
-	}
-	
-	public void testFail17() throws Exception{
-		helper1();
-	}
-	
-	public void testFail18() throws Exception{
-		helper1();
-	}
-	
-	public void testFail19() throws Exception{
-		helper1();
-	}
-	
-	public void testFail20() throws Exception{
-		helper1();
-	}
-	
-	public void testFail21() throws Exception{
-		helper1();
-	}
-	
-	public void testFail22() throws Exception{
-		helper1();
-	}
-	
-	public void testFail23() throws Exception{
-		helper1();
-	}
-	
-	public void testFail24() throws Exception{
-		helper1();
-	}
-	
-	public void testFail25() throws Exception{
-		helper1();
-	}
-	
-	public void testFail26() throws Exception{
-		helper1();
-	}
-	
-	public void testFail27() throws Exception{
-		helper1();
-	}
-	
-	public void testFail28() throws Exception{
-		helper1();
-	}
-	
-	public void testFail29() throws Exception{
-		helper1();
-	}
-		
-	public void testFail30() throws Exception{
-		helper1();
-	}
-	
-	public void testFail31() throws Exception{
-		helper1_0("m", "k", new String[]{"QString;"});
-	}
-	
-	public void testFail32() throws Exception{
-		helper1_0("m", "k", new String[]{"QObject;"});
-	}
-	
-	public void testFail33() throws Exception{
-		helper1_not_available("toString", new String[0]);
-	}
-	
-	public void testFail34() throws Exception{
-		helper1_0("m", "k", new String[]{"QString;"});
-	}
-	
-	public void testFail35() throws Exception{
-		printTestDisabledMessage("does not detect introduced compile error - method declared in enclosing and inheritance hierarchy");
-//		helper1();
-	}
-	
-	public void testFail36() throws Exception{
-		helper1();
-	}
-	
-	public void testFail37() throws Exception{
-		helper1();
-	}
-	
-	public void testFail38() throws Exception{
-		printTestDisabledMessage("must fix - nested type");
-		//helper1();
-	}
-	
-	public void test1() throws Exception{
-		helper2();
-	}	
-
-	public void test10() throws Exception{
-		helper2();
-	}	
-	
-	public void test11() throws Exception{
-		helper2();
-	}	
-
-	public void test12() throws Exception{
-		helper2();
-	}	
-
-	public void test13() throws Exception{
-		helper2();
-	}	
-	
-	public void test14() throws Exception{
-		helper2();
-	}
-	
-	public void test15() throws Exception{
-		helper2_0("m", "k", new String[]{Signature.SIG_INT});
-	}		
-	
-	public void test16() throws Exception{
-		helper2_0("m", "fred", new String[]{Signature.SIG_INT});
-	}		
-	
-	public void test17() throws Exception{
-		printTestDisabledMessage("overloading");
-		//helper2_0("m", "kk", new String[]{Signature.SIG_INT});
-	}		
-	
-	public void test18() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuC= createCUfromTestFile(getPackageP(), "C");
-		
-		IType classB= getType(cu, "B");
-		RenameRefactoring ref= new RenameRefactoring(classB.getMethod("m", new String[]{"I"}));
-		ref.setNewName("kk");
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-		assertEqualLines("invalid renaming A", getFileContents(getOutputTestFileName("A")), cu.getSource());
-		assertEqualLines("invalid renaming C", getFileContents(getOutputTestFileName("C")), cuC.getSource());
-		
-	}
-	
-	public void test19() throws Exception{
-		helper2_0("m", "fred", new String[0]);
-	}		
-	
-	public void test2() throws Exception{
-		helper2_0("m", "fred", new String[0]);
-	}		
-	
-	public void test20() throws Exception{
-		helper2_0("m", "fred", new String[]{Signature.SIG_INT});
-	}		
-	
-	public void test21() throws Exception{
-		helper2_0("m", "fred", new String[]{Signature.SIG_INT});
-	}
-	
-	public void test22() throws Exception{
-		helper2();
-	}		
-	
-	//anonymous inner class
-	public void test23() throws Exception{
-		helper2_fail();
-	}		
-	
-	public void test24() throws Exception{
-		helper2_0("m", "k", new String[]{"QString;"});
-	}		
-	
-	public void test25() throws Exception{
-		//printTestDisabledMessage("waiting for 1GIIBC3: ITPJCORE:WINNT - search for method references - missing matches");
-		helper2();
-	}		
-	
-	public void test26() throws Exception{
-		helper2();
-	}		
-	
-	public void test27() throws Exception{
-		helper2();
-	}		
-	
-	public void test28() throws Exception{
-		helper2();
-	}		
-	
-	public void test29() throws Exception{
-		helper2();
-	}		
-	
-	public void test30() throws Exception{
-		helper2();
-	}
-	
-	public void test31() throws Exception{
-		helper2();
-	}
-	
-	public void test32() throws Exception{
-		helper2(false);
-	}
-	
-	public void test33() throws Exception{
-		helper2();
-	}
-
-	public void test34() throws Exception{
-		printTestDisabledMessage("test for bug#18553");
-//		helper2_0("A", "foo", new String[0], true, true);
-	}
-
-	public void test35() throws Exception{
-		helper2_0("foo", "bar", new String[] {"QObject;"}, true);
-	}
-
-	public void test36() throws Exception{
-		helper2_0("foo", "bar", new String[] {"QString;"}, true);
-	}
-
-	public void test37() throws Exception{
-		helper2_0("foo", "bar", new String[] {"QA;"}, true);
-	}
-	
-	//anonymous inner class
-	public void testAnon0() throws Exception{
-		helper2();
-	}		
-	
-	public void testLocal0() throws Exception{
-		helper2();
-	}			
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTestSetup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTestSetup.java
deleted file mode 100644
index 506208d..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTestSetup.java
+++ /dev/null
@@ -1,81 +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.jdt.ui.tests.refactoring;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-
-public class SefTestSetup extends TestSetup {
-	
-	private IJavaProject fJavaProject;
-	private IPackageFragmentRoot fRoot;
-	private static final String CONTAINER= "src";
-
-	private IPackageFragment fBaseTypes;
-	private IPackageFragment fObjectTypes;
-	private IPackageFragment fInvalid;
-	
-	public SefTestSetup(Test test) {
-		super(test);
-	}	
-	
-	public IPackageFragmentRoot getRoot() {
-		return fRoot;
-	}
-		
-	protected void setUp() throws Exception {
-		super.setUp();
-		fJavaProject= JavaProjectHelper.createJavaProject("TestProject", "bin");
-		JavaProjectHelper.addRTJar(fJavaProject);
-		fRoot= JavaProjectHelper.addSourceContainer(fJavaProject, CONTAINER);
-		
-		Refactoring.getUndoManager().flush();
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceDescription description= workspace.getDescription();
-		description.setAutoBuilding(false);
-		workspace.setDescription(description);
-		
-		fBaseTypes= getRoot().createPackageFragment("base_in", true, null);
-		fObjectTypes= getRoot().createPackageFragment("object_in", true, null);
-		fInvalid= getRoot().createPackageFragment("invalid", true, null);
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		RefactoringTest.performDummySearch(fJavaProject);
-		JavaProjectHelper.delete(fJavaProject);		
-	}
-	
-	public IPackageFragment getBasePackage() {
-		return fBaseTypes;
-	}	
-
-	public IPackageFragment getObjectPackage() {
-		return fObjectTypes;
-	}	
-
-	public IPackageFragment getInvalidPackage() {
-		return fInvalid;
-	}	
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTests.java
deleted file mode 100644
index b0ddea1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SefTests.java
+++ /dev/null
@@ -1,235 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Preferences;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.sef.SelfEncapsulateFieldRefactoring;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-public class SefTests extends AbstractSelectionTestCase {
-
-	private static SefTestSetup fgTestSetup;
-	
-	public SefTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		fgTestSetup= new SefTestSetup(new TestSuite(SefTests.class));
-		return fgTestSetup;
-	}
-
-	protected IPackageFragmentRoot getRoot() {
-		return fgTestSetup.getRoot();
-	}
-	
-	protected String getResourceLocation() {
-		return "SefWorkSpace/SefTests/";
-	}
-	
-	protected String adaptName(String name) {
-		return Character.toUpperCase(name.charAt(0)) + name.substring(1) + ".java";
-	}	
-	
-	protected void performTest(IPackageFragment packageFragment, String id, String outputFolder, String fieldName) throws Exception {
-		IProgressMonitor pm= new NullProgressMonitor();
-		ICompilationUnit unit= createCU(packageFragment, id);
-		IField field= getField(unit, fieldName);
-		assertNotNull(field);
-		
-		Preferences preferences= JavaCore.getPlugin().getPluginPreferences();
-		preferences.setValue(JavaCore.CODEASSIST_FIELD_PREFIXES, "");
-		preferences.setValue(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, "");
-		preferences.setValue(JavaCore.CODEASSIST_FIELD_SUFFIXES, "");
-		preferences.setValue(JavaCore.CODEASSIST_STATIC_FIELD_SUFFIXES, "");
-
-		SelfEncapsulateFieldRefactoring refactoring= SelfEncapsulateFieldRefactoring.create(field);
-		RefactoringStatus status= refactoring.checkPreconditions(pm);
-		assertTrue(!status.hasFatalError());
-		IChange change= refactoring.createChange(pm);
-		assertNotNull(change);
-		ChangeContext context= new ChangeContext(new TestExceptionHandler());
-		change.aboutToPerform(context, new NullProgressMonitor());
-		change.perform(context, pm);
-		change.performed();
-		assertNotNull(change.getUndoChange());
-		String source= unit.getSource();
-		String out= getProofedContent(outputFolder, id);
-		compareSource(source, out);
-	}
-	
-	protected void performInvalidTest(IPackageFragment packageFragment, String id, String fieldName) throws Exception {
-		ICompilationUnit unit= createCU(packageFragment, id);
-		IField field= getField(unit, fieldName);
-		assertNotNull(field);
-
-		Preferences preferences= JavaCore.getPlugin().getPluginPreferences();
-		preferences.setValue(JavaCore.CODEASSIST_FIELD_PREFIXES, "");
-		preferences.setValue(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, "");
-		preferences.setValue(JavaCore.CODEASSIST_FIELD_SUFFIXES, "");
-		preferences.setValue(JavaCore.CODEASSIST_STATIC_FIELD_SUFFIXES, "");
-
-
-		SelfEncapsulateFieldRefactoring refactoring= SelfEncapsulateFieldRefactoring.create(field);
-		RefactoringStatus status= refactoring.checkPreconditions(new NullProgressMonitor());
-		assertTrue(status.hasError());
-	}	
-	
-	private static IField getField(ICompilationUnit unit, String fieldName) throws Exception {
-		IField result= null;
-		IType[] types= unit.getAllTypes();
-		for (int i= 0; i < types.length; i++) {
-			IType type= types[i];
-			result= type.getField(fieldName);
-			if (result != null && result.exists())
-				break;
-		}
-		return result;
-	}
-
-	private IPackageFragment getObjectPackage() throws JavaModelException {
-		return fgTestSetup.getObjectPackage();
- 	}
-	
-	private IPackageFragment getBasePackage() throws JavaModelException {
-		return fgTestSetup.getBasePackage();
- 	}
-	
-	private IPackageFragment getInvalidPackage() throws JavaModelException {
-		return fgTestSetup.getInvalidPackage();
-	}
-	
-	private void objectTest(String fieldName) throws Exception {
-		performTest(getObjectPackage(), getName(), "object_out", fieldName);
-	}
-	
-	private void baseTest(String fieldName) throws Exception {
-		performTest(getBasePackage(), getName(), "base_out", fieldName);
-	}
-	
-	private void invalidTest(String fieldName) throws Exception {
-		performInvalidTest(getInvalidPackage(), getName(), fieldName);
-	}
-	
-	//=====================================================================================
-	// Invalid
-	//=====================================================================================
-	
-	public void testPostfixExpression() throws Exception {
-		invalidTest("field");
-	}
-	
-	public void testInvalidOverwrite() throws Exception {
-		invalidTest("field");
-	}
-	
-	//=====================================================================================
-	// Primitiv Data Test
-	//=====================================================================================
-	
-	public void testPrefixInt() throws Exception {
-		baseTest("field");
-	}
-	
-	public void testPrefixBoolean() throws Exception {
-		baseTest("field");
-	}
-	
-	public void testPostfixInt() throws Exception {
-		baseTest("field");
-	}
-	
-	public void testThisExpression() throws Exception {
-		baseTest("field");
-	}
-	
-	public void testThisExpressionInner() throws Exception {
-		baseTest("field");
-	}
-	
-	public void testFinal() throws Exception {
-		baseTest("field");
-	}
-	
-	//=====================================================================================
-	// Basic Object Test
-	//=====================================================================================
-	
-	public void testSimpleRead() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testSimpleWrite() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testSimpleReadWrite() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testNestedRead() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testArrayRead() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testSetterInAssignment() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testSetterInExpression() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testSetterInInitialization() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testSetterAsReceiver() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testCompoundWrite() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testCompoundWrite2() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testCompoundWrite3() throws Exception {
-		objectTest("field");
-	}
-	
-	public void testFinalField() throws Exception {
-		objectTest("field");
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SurroundWithTestSetup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SurroundWithTestSetup.java
deleted file mode 100644
index a3c13de..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SurroundWithTestSetup.java
+++ /dev/null
@@ -1,71 +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.jdt.ui.tests.refactoring;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-import org.eclipse.jdt.internal.corext.template.CodeTemplates;
-
-public class SurroundWithTestSetup extends TestSetup {
-	
-	private IJavaProject fJavaProject;
-	private IPackageFragmentRoot fRoot;
-	private static final String CONTAINER= "src";
-
-	private IPackageFragment fTryCatchPackage;
-	
-	public SurroundWithTestSetup(Test test) {
-		super(test);
-	}	
-	
-	public IPackageFragmentRoot getRoot() {
-		return fRoot;
-	}
-		
-	protected void setUp() throws Exception {
-		super.setUp();
-		fJavaProject= JavaProjectHelper.createJavaProject("TestProject", "bin");
-		JavaProjectHelper.addRTJar(fJavaProject);
-		fRoot= JavaProjectHelper.addSourceContainer(fJavaProject, CONTAINER);
-		
-		Refactoring.getUndoManager().flush();
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceDescription description= workspace.getDescription();
-		description.setAutoBuilding(false);
-		workspace.setDescription(description);
-		
-		fTryCatchPackage= getRoot().createPackageFragment("trycatch_in", true, null);
-		CodeTemplates.getCodeTemplate(CodeTemplates.CATCHBLOCK).setPattern("");
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		RefactoringTest.performDummySearch(fJavaProject);
-		JavaProjectHelper.delete(fJavaProject);
-	}
-	
-	public IPackageFragment getTryCatchPackage() {
-		return fTryCatchPackage;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SurroundWithTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SurroundWithTests.java
deleted file mode 100644
index 12b1fb3..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/SurroundWithTests.java
+++ /dev/null
@@ -1,178 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.internal.corext.refactoring.surround.SurroundWithTryCatchRefactoring;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class SurroundWithTests extends AbstractSelectionTestCase {
-
-	private static SurroundWithTestSetup fgTestSetup;
-	
-	public SurroundWithTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		fgTestSetup= new SurroundWithTestSetup(new TestSuite(SurroundWithTests.class));
-		return fgTestSetup;
-	}
-
-	protected IPackageFragmentRoot getRoot() {
-		return fgTestSetup.getRoot();
-	}
-	
-	protected String getResourceLocation() {
-		return "SurroundWithWorkSpace/SurroundWithTests/";
-	}
-	
-	protected String adaptName(String name) {
-		return Character.toUpperCase(name.charAt(0)) + name.substring(1) + ".java";
-	}	
-
-	protected void performTest(IPackageFragment packageFragment, String name, String outputFolder, int mode) throws Exception {
-		ICompilationUnit unit= createCU(packageFragment, name);
-		SurroundWithTryCatchRefactoring refactoring= SurroundWithTryCatchRefactoring.create(unit, 
-			getTextSelection(unit.getSource()), JavaPreferencesSettings.getCodeGenerationSettings(), null);
-		refactoring.setSaveChanges(true);
-		String out= null;
-		if (mode == COMPARE_WITH_OUTPUT)
-			out= getProofedContent(outputFolder, name);
-		performTest(unit, refactoring, mode, out);
-	}
-	
-	protected void tryCatchInvalidTest() throws Exception {
-		performTest(fgTestSetup.getTryCatchPackage(), getName(), "trycatch_out", INVALID_SELECTION);
-	}	
-	
-	protected void tryCatchTest() throws Exception {
-		performTest(fgTestSetup.getTryCatchPackage(), getName(), "trycatch_out", COMPARE_WITH_OUTPUT);
-	}	
-	
-	public void testNoException() throws Exception {
-		tryCatchInvalidTest();
-	}
-	
-	public void testAlreadyCaught() throws Exception {
-		tryCatchInvalidTest();
-	}
-	
-	public void testInvalidParent1() throws Exception {
-		tryCatchInvalidTest();
-	}
-	
-	public void testInvalidParent2() throws Exception {
-		tryCatchInvalidTest();
-	}
-	
-	public void testThisConstructorCall() throws Exception {
-		tryCatchInvalidTest();
-	}
-	
-	public void testSuperConstructorCall() throws Exception {
-		tryCatchInvalidTest();
-	}
-	
-	public void testSimple() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testOneLine() throws Exception {
-		tryCatchTest();
-	}	
-	
-	public void testMultiLine() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testExceptionOrder()	throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testWrappedLocal1() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testWrappedLocal2() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testWrappedLocal3() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testWrappedLocal4() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testWrappedLocal5() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testWrappedLocal6() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testInitializerThrowsException() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testThrowInCatch() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testExpression() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testExpressionStatement() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testInitializer() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testSuperCall() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testRuntimeException1() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testNested() throws Exception {
-		tryCatchTest();
-	}
-	
-	public void testRuntimeException2() throws Exception {
-		tryCatchInvalidTest();
-	}	
-
-	public void testStaticField() throws Exception {
-		tryCatchInvalidTest();
-	}
-	
-	public void testDeclarationInitializer() throws Exception {
-		 tryCatchTest();
-	}
-	
-	public void testThenStatement() throws Exception {
-		 tryCatchTest();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/UndoManagerTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/UndoManagerTests.java
deleted file mode 100644
index 3b175ab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/UndoManagerTests.java
+++ /dev/null
@@ -1,137 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.ui.tests.refactoring.infra.TestExceptionHandler;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.Refactoring;
-
-public class UndoManagerTests extends RefactoringTest {
-	
-	private static final Class clazz= UndoManagerTests.class;
-	public UndoManagerTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private void checkState(boolean undo, boolean redo, int undoCount, int redoCount){
-		checkState(0, undo, redo, undoCount, redoCount);
-	}
-	
-	private void checkState(int iterationCount, boolean undo, boolean redo, int undoCount, int redoCount){
-		assertTrue(iterationCount + " undo", undo == Refactoring.getUndoManager().anythingToUndo());
-		assertTrue(iterationCount + " redo", redo == Refactoring.getUndoManager().anythingToRedo());
-		//assertEquals(iterationCount + "undo stack", undoCount, Refactoring.getUndoManager().getRefactoringLog().size());
-		//assertEquals(iterationCount + "redo stack", redoCount, Refactoring.getUndoManager().getRedoStack().size());
-	}
-	
-	private void performUndo() throws Exception {
-		Refactoring.getUndoManager().performUndo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-	}
-	
-	private void performRedo() throws Exception {
-		Refactoring.getUndoManager().performRedo(new ChangeContext(new TestExceptionHandler()), new NullProgressMonitor());
-	}
-	
-	public void test0() throws Exception{
-		checkState(false, false, 0, 0);
-	}
-	
-	public void test1() throws Exception{	
-		performRefactoring(new NullRefactoring());
-		checkState(true, false, 1, 0);
-	}
-	
-	public void test2() throws Exception{	
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		checkState(false, true, 0, 1);
-	}
-	
-	public void test3() throws Exception{	
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		performRedo();
-		checkState(true, false, 1, 0);
-	}
-	
-	public void test4() throws Exception{	
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		performRedo();
-		performUndo();
-		checkState(false, true, 0, 1);
-	}
-
-	public void test5() throws Exception{	
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		performRedo();
-		performRefactoring(new NullRefactoring());
-		checkState(true, false, 2, 0);
-	}
-	
-	public void test6() throws Exception{	
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		performRedo();
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		performUndo();
-		checkState(false, true, 0, 2);
-	}	
-	
-	public void test7() throws Exception{	
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		performRedo();
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		checkState(true, true, 1, 1);
-	}	
-	
-	public void test8() throws Exception{	
-		int limit= 10;
-		for (int i= 0; i < limit; i++){
-			checkState(i, i != 0, false, i, 0);			
-			performRefactoring(new NullRefactoring());
-		}
-		for (int i= 0; i < limit; i++){
-			checkState(i, i != limit, i != 0, limit - i, i);			
-			performUndo();
-		}
-		
-		for (int i= 0; i < limit; i++){
-			checkState(i, i != 0, i != limit, i, limit - i);			
-			performRedo();
-		}
-	}
-	
-
-	public void test9() throws Exception{	
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		performRedo();
-		performRefactoring(new NullRefactoring());
-		performUndo();
-		Refactoring.getUndoManager().flush();
-		checkState(false, false, 0, 0);
-	}		
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/UseSupertypeWherePossibleTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/UseSupertypeWherePossibleTests.java
deleted file mode 100644
index 430b2f1..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/UseSupertypeWherePossibleTests.java
+++ /dev/null
@@ -1,474 +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.jdt.ui.tests.refactoring;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.corext.refactoring.structure.UseSupertypeWherePossibleRefactoring;
-import org.eclipse.jdt.internal.corext.template.Template;
-import org.eclipse.jdt.internal.corext.template.Templates;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-public class UseSupertypeWherePossibleTests extends RefactoringTest {
-
-	private static final Class clazz= UseSupertypeWherePossibleTests.class;
-	private static final String REFACTORING_PATH= "UseSupertypeWherePossible/";
-	
-	public UseSupertypeWherePossibleTests(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		Template[] typecomments= Templates.getInstance().getTemplates("typecomment");
-		for (int i= 0; i < typecomments.length; i++) {
-			typecomments[i].setPattern("/** typecomment template*/");	
-		}
-		Template[] filecomments= Templates.getInstance().getTemplates("filecomment");
-		for (int i= 0; i < filecomments.length; i++) {
-			filecomments[i].setPattern("/** filecomment template */");	
-		}
-	}
-		
-	/******* shortcuts **********/
-	
-	private IType getClassFromTestFile(IPackageFragment pack, String className) throws Exception{
-		return getType(createCUfromTestFile(pack, className), className);
-	}
-
-	private void validatePassingTest(String className, String[] cuNames, String superTypeFullName, boolean updateInstanceOf) throws Exception {
-		IType clas= getClassFromTestFile(getPackageP(), className);
-				
-		UseSupertypeWherePossibleRefactoring ref= UseSupertypeWherePossibleRefactoring.create(clas, JavaPreferencesSettings.getCodeGenerationSettings());
-		ref.setUseSupertypeInInstanceOf(updateInstanceOf);
-			
-		ICompilationUnit[] cus= new ICompilationUnit[cuNames.length];
-		for (int i= 0; i < cuNames.length; i++) {
-			cus[i]= createCUfromTestFile(clas.getPackageFragment(), cuNames[i]);			
-		}
-		ref.setSuperTypeToUse(JavaModelUtil.findType(clas.getJavaProject(), superTypeFullName));
-		assertEquals("was supposed to pass", null, performRefactoring(ref));
-
-		for (int i= 0; i < cus.length; i++) {
-			String expected= getFileContents(getOutputTestFileName(cuNames[i]));
-			String actual= cus[i].getSource();
-			String message= "incorrect changes in " + cus[i].getElementName();
-			assertEqualLines(message, expected, actual);
-		}
-	}
-
-	private void validatePassingTest(String className, String[] cuNames, String superTypeFullName) throws Exception {
-		validatePassingTest(className, cuNames, superTypeFullName, false);
-	}
-
-	//---------------tests ----------------------
-	
-	public void testNew0() throws Exception{
-		validatePassingTest("A", new String[]{"A"}, "java.lang.Object");
-	}
-
-	public void testNew1() throws Exception{
-//		printTestDisabledMessage("bug 23597 ");
-		validatePassingTest("A", new String[]{"A"}, "java.lang.Object");
-	}
-
-	public void testNew2() throws Exception{
-		validatePassingTest("A", new String[]{"A"}, "java.lang.Object");
-	}
-
-	public void testNew3() throws Exception{
-		validatePassingTest("A", new String[]{"A"}, "java.lang.Object");
-	}
-
-	public void testNew4() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test"}, "java.lang.Object");
-	}
-
-	public void testNew5() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test"}, "java.lang.Object");
-	}
-
-	public void testNew6() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test"}, "java.lang.Object");
-	}
-
-	public void testNew7() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-	
-	public void testNew8() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-
-	public void testNew9() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test"}, "java.lang.Object");
-	}
-
-	public void testNew10() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-
-	public void testNew11() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-
-	public void testNew12() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-
-	public void testNew13() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-
-	public void testNew14() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-
-	public void testNew15() throws Exception{
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-
-	public void testNew16() throws Exception{
-//		printTestDisabledMessage("instanceof ");
-		validatePassingTest("A", new String[]{"A", "Test", "B"}, "p.B");
-	}
-
-	public void testNew17() throws Exception{
-		validatePassingTest("A", new String[]{"A"}, "p.C");
-	}
-
-	public void testNew18() throws Exception{
-		validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-	public void testNew19() throws Exception{
-		validatePassingTest("A", new String[]{"A"}, "p.I");
-	}
-
-	public void testNew20() throws Exception{
-//		printTestDisabledMessage("http://dev.eclipse.org/bugs/show_bug.cgi?id=23829");
-		validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-	public void testNew21() throws Exception{
-		validatePassingTest("A", new String[]{"A"}, "java.lang.Object");
-	}
-
-	public void testNew22() throws Exception{
-		validatePassingTest("A", new String[]{"A", "B", "Test"}, "p.B");
-	}
-
-	public void testNew23() throws Exception{
-		validatePassingTest("A", new String[]{"A", "B", "Test"}, "java.lang.Object");
-	}
-
-	public void testNew24() throws Exception{
-		validatePassingTest("A", new String[]{"A", "B"}, "java.lang.Object");
-	}
-
-	public void testNew25() throws Exception{
-		validatePassingTest("A", new String[]{"A", "B", "C"}, "java.lang.Object");
-	}
-
-	public void testNew26() throws Exception{
-		validatePassingTest("A", new String[]{"A", "B"}, "java.lang.Object");
-	}
-
-	public void testNew27() throws Exception{
-		validatePassingTest("A", new String[]{"A", "B"}, "p.B");
-	}
-
-	public void testNew28() throws Exception{
-		validatePassingTest("A", new String[]{"A", "B"}, "p.B");
-	}
-
-	public void testNew29() throws Exception{
-//		printTestDisabledMessage("bug 24278");
-		validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-	public void testNew30() throws Exception{
-//		printTestDisabledMessage("bug 24278");
-		validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-	public void testNew31() throws Exception{
-//		printTestDisabledMessage("bug 24278");
-		validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-	public void testNew32() throws Exception{
-//		printTestDisabledMessage();
-		validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-    public void testNew33() throws Exception{
-    //		printTestDisabledMessage("bug 26282");
-       validatePassingTest("A", new String[]{"A"}, "java.util.Vector");
-	}
-
-    public void testNew34() throws Exception{
-    //		printTestDisabledMessage("bug 26282");
-       validatePassingTest("A", new String[]{"A"}, "java.util.Vector");
-    }
-
-    public void testNew35() throws Exception{
-    //		printTestDisabledMessage("bug 26282");
-       validatePassingTest("A", new String[]{"A"}, "java.util.Vector");
-    }
-
-	public void testNew36() throws Exception{
-	//		printTestDisabledMessage("bug 26288");
-	   validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-	public void testNew37() throws Exception{
-	//		printTestDisabledMessage("bug 26288");
-	   validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-	public void testNew38() throws Exception{
-	//		printTestDisabledMessage("bug 40373");
-	   validatePassingTest("A", new String[]{"A"}, "p.B");
-	}
-
-	/* i had to rename tests 0-15 because of cvs problems*/
-	
-	
-	public void test0_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test1_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test2_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test3_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test4_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test5_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test6_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test7_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test8_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test9_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test10_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test11_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test12_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test13_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test14_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test15_() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test16() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test17() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test18() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test19() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test20() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test21() throws Exception{
-		//disable for exceptions
-//		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test22() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test23() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test24() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test25() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test26() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test27() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test28() throws Exception{
-//		printTestDisabledMessage("bug 22883");
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test29() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test30() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test31() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test32() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test33() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test34() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test35() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test36() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test37() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test38() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test39() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test40() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test41() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test42() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test43() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test44() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test45() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test46() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test47() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test48() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test49() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test50() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test51() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test52() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test53() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test54() throws Exception{
-		validatePassingTest("A", new String[]{"A", "A1", "I"}, "p.I");
-	}
-	public void test55() throws Exception{
-		validatePassingTest("A", new String[]{"A", "A1", "I"}, "p.I");
-	}
-	public void test56() throws Exception{
-		validatePassingTest("A", new String[]{"A", "A1", "I"}, "p.I");
-	}
-	public void test57() throws Exception{
-		validatePassingTest("A", new String[]{"A", "A1", "I"}, "p.I");
-	}
-	public void test58() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test59() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test60() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test61() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test62() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test63() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test64() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I", "Inter"}, "p.I");
-	}
-	public void test65() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test66() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test67() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-	public void test68() throws Exception{
-		validatePassingTest("A", new String[]{"A", "As", "I"}, "p.I");
-	}
-	public void test69() throws Exception{
-		validatePassingTest("A", new String[]{"A", "As", "I"}, "p.I");
-	}
-	public void test70() throws Exception{
-		validatePassingTest("A", new String[]{"A", "I"}, "p.I");
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/AllTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/AllTests.java
deleted file mode 100644
index 19c45a0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/AllTests.java
+++ /dev/null
@@ -1,24 +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.jdt.ui.tests.refactoring.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests {
-	
-	public static Test suite() {
-		TestSuite suite= new TestSuite(AllTests.class.getName());
-		suite.addTest(ExtensionPointTests.suite());
-		return suite;
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/ExtensionPointTestSetup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/ExtensionPointTestSetup.java
deleted file mode 100644
index 7994c83..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/ExtensionPointTestSetup.java
+++ /dev/null
@@ -1,58 +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.jdt.ui.tests.refactoring.extensions;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-public class ExtensionPointTestSetup extends TestSetup {
-	
-	private IJavaProject fJavaProject;
-	private IPackageFragmentRoot fRoot;
-	private static final String CONTAINER= "src";
-
-	public ExtensionPointTestSetup(Test test) {
-		super(test);
-	}	
-	
-	public IPackageFragmentRoot getRoot() {
-		return fRoot;
-	}
-		
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		fJavaProject= JavaProjectHelper.createJavaProject("TestProject", "bin");
-		JavaProjectHelper.addRTJar(fJavaProject);
-		fRoot= JavaProjectHelper.addSourceContainer(fJavaProject, CONTAINER);
-		
-		IWorkspace workspace= ResourcesPlugin.getWorkspace();
-		IWorkspaceDescription description= workspace.getDescription();
-		description.setAutoBuilding(false);
-		workspace.setDescription(description);
-		
-		getRoot().createPackageFragment("test", true, null);
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		JavaProjectHelper.delete(fJavaProject);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/ExtensionPointTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/ExtensionPointTests.java
deleted file mode 100644
index a8f4955..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/extensions/ExtensionPointTests.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003 International Business Machines Corp. and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v0.5 
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jdt.ui.tests.refactoring.extensions;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.internal.corext.SourceRange;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatusContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.JavaStatusContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.JavaStringStatusContext;
-
-import org.eclipse.jdt.internal.ui.refactoring.StatusContextViewerDescriptor;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-
-public class ExtensionPointTests extends TestCase {
-
-	public static Test suite() {
-		return new ExtensionPointTestSetup(new TestSuite(ExtensionPointTests.class));
-	}
-	
-	public void testJavaStringStatusContextViewer() throws Exception {
-		JavaStringStatusContext context= new JavaStringStatusContext("test", new SourceRange(0, 0));
-		StatusContextViewerDescriptor descriptor= StatusContextViewerDescriptor.get(context);
-		assertNotNull(descriptor);
-		assertNotNull(descriptor.createViewer());
-	}
-	
-	public void testJavaStatusContextViewer() throws Exception {
-		IPackageFragment pack= getTestPackage();
-		ICompilationUnit unit= pack.createCompilationUnit(
-			"A.java", 
-			"package test; class A { }",
-			true, null);
-		RefactoringStatusContext context= JavaStatusContext.create(unit);
-		StatusContextViewerDescriptor descriptor= StatusContextViewerDescriptor.get(context);
-		assertNotNull(descriptor);
-		assertNotNull(descriptor.createViewer());
-		JavaProjectHelper.performDummySearch();
-		unit.delete(true, new NullProgressMonitor());
-	}
-	
-	private IPackageFragment getTestPackage() {
-		IFolder folder= ResourcesPlugin.getWorkspace().getRoot().getFolder(
-			new Path("/TestProject/src/test"));
-		return (IPackageFragment)JavaCore.create(folder);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/AbstractCUTestCase.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/AbstractCUTestCase.java
deleted file mode 100644
index 79f2fb9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/AbstractCUTestCase.java
+++ /dev/null
@@ -1,100 +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.jdt.ui.tests.refactoring.infra;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-
-public abstract class AbstractCUTestCase extends TestCase {
-
-	public AbstractCUTestCase(String name) {
-		super(name);
-	}
-	
-	protected String getFileContents(InputStream in) throws IOException {
-		BufferedReader br= new BufferedReader(new InputStreamReader(in));
-		
-		StringBuffer sb= new StringBuffer();
-		try {
-			int read= 0;
-			while ((read= br.read()) != -1)
-				sb.append((char) read);
-		} finally {
-			br.close();
-		}
-		return sb.toString();
-	}
-	
-	protected ICompilationUnit createCU(IPackageFragment pack, String name, String contents) throws Exception {
-		ICompilationUnit cu= pack.createCompilationUnit(name, contents, true, null);
-		cu.save(null, true);
-		return cu;
-	}
-	
-	protected ICompilationUnit createCU(IPackageFragment pack, String name, InputStream contents) throws Exception {
-		return createCU(pack, name, getFileContents(contents));
-	}
-
-	//--- creating a compilation unit from a resource folder relative to a plugin ----------------------------------
-	
-	protected abstract InputStream getFileInputStream(String fileName) throws IOException;
-
-	protected String getResourceLocation() {
-		return "";
-	}
-
-	protected ICompilationUnit createCU(IPackageFragment pack, String name) throws Exception {
-		name= adaptName(name);
-		return createCU(pack, name, getFileInputStream(getFilePath(pack, name)));
-	}
-	
-	protected String adaptName(String name) {
-		return name + ".java";
-	}
-	
-	protected String getProofedContent(String folder, String name) throws Exception {
-		name= adaptName(name);
-		return getFileContents(getFileInputStream(getFilePath(folder, name)));
-	}
-	
-	private String getFilePath(String path, String name) {
-		return getResourceLocation() + path + "/" + name;
-	}
-	
-	private String getFilePath(IPackageFragment pack, String name) {
-		return getFilePath(pack.getElementName(), name);		
-	}
-	
-	//---- helper to compare two file without considering the package statement
-	
-	public static void compareSource(String refactored, String proofed) {
-		compareSource(refactored, proofed, true);
-	}
-	
-	public static void compareSource(String refactored, String proofed, boolean skipPackageDeclaration) {
-		int index= skipPackageDeclaration ? refactored.indexOf(';'): 0;
-		refactored= refactored.substring(index);
-		index= skipPackageDeclaration ? proofed.indexOf(';') : 0;
-		proofed= proofed.substring(index);
-		RefactoringTest.assertEqualLines(proofed, refactored);
-	}
-			
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/DebugUtils.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/DebugUtils.java
deleted file mode 100644
index 72d9b64..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/DebugUtils.java
+++ /dev/null
@@ -1,165 +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.jdt.ui.tests.refactoring.infra;
- 
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-
-/**
- * useful debug routines
- * no java doc
- * @deprecated not really
- */
-public final class DebugUtils {
-
-	private DebugUtils(){
-	}
-	
-	public static void dumpCharCharArray(String msg, char[][] o){
-		dump("DUMPING char[][]:" + msg); //$NON-NLS-1$
-		for (int i= 0; i < o.length; i++){
-			dump(new String(o[i]));
-		}
-	}
-	
-	public static void dumpArray(String msg, Object[] refs){
-		System.out.println("DUMPING array: "+  msg); //$NON-NLS-1$
-		if (refs == null){
-			System.out.println("null"); //$NON-NLS-1$
-			return;
-		}	
-		for (int i= 0; i < refs.length; i++)
-			System.out.println(refs[i].toString());
-	}
-	
-	public static void dumpCollectionCollection(String msg, Collection c){
-		for (Iterator iter= c.iterator(); iter.hasNext(); ){
-			dumpCollection("", (List)iter.next()); //$NON-NLS-1$
-		}
-	}
-	
-	public static void dumpCollection(String msg, Collection c){
-		System.out.println("DUMPING collection: "+  msg); //$NON-NLS-1$
-		if (c == null){
-			System.out.println("null"); //$NON-NLS-1$
-			return;
-		}	
-		for (Iterator iter= c.iterator(); iter.hasNext(); ){
-			System.out.println(iter.next().toString());
-		}
-	}
-	
-	public static void dumpIMethod(IMethod method){
-		try{
-			if (method == null){
-				System.out.println("DUMPING method: null"); //$NON-NLS-1$
-				return;
-			}
-			System.out.println("DUMPING method:" +  method.getElementName() + "\n " + method.getSignature() + "\n declared in " + JavaModelUtil.getFullyQualifiedName(method.getDeclaringType()) //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
-			+ "\nreturnType:" + method.getReturnType() ); //$NON-NLS-1$
-			dumpArray("paramTypes:", method.getParameterTypes()); //$NON-NLS-1$
-			dumpArray("exceptions:", method.getExceptionTypes()); //$NON-NLS-1$
-		}catch (JavaModelException e){
-			System.out.println("JavaModelException: "+ e.getMessage()); //$NON-NLS-1$
-		}
-	}
-	
-	public static void dumpIMethodList(String msg, List l){
-		System.out.println("DUMPING IMethodList: "+  msg); //$NON-NLS-1$
-		if (l == null){
-			System.out.println("null"); //$NON-NLS-1$
-			return;
-		}	
-		Iterator iter= l.iterator();
-		while(iter.hasNext()){
-			dumpIMethod((IMethod)iter.next());			
-		}
-	}
-	
-	public static void dumpIType(String msg, IType type){
-		System.out.println("DUMPING IType:"+ msg); //$NON-NLS-1$
-		System.out.println("exists:" + type.exists()); //$NON-NLS-1$
-		try{
-			System.out.println("correspondingResource:" + type.getCorrespondingResource()); //$NON-NLS-1$
-			System.out.println("underResource:" + type.getUnderlyingResource()); //$NON-NLS-1$
-			System.out.println("source:\n" + type.getSource()); //$NON-NLS-1$
-			
-			//System.out.println("cu.orig.under" + type.getCompilationUnit().getOriginalElement().getUnderlyingResource());
-			System.out.println("cu:" + type.getCompilationUnit().getSource());		 //$NON-NLS-1$
-		}catch (JavaModelException e){
-			System.out.println("JavaModelException: "+ e.getMessage()); //$NON-NLS-1$
-		}
-		
-	}
-
-	public static void dumpIResource(String msg, IResource res){
-		System.out.println("DUMPING IResource:"+ msg); //$NON-NLS-1$
-		System.out.println("name:" + res.getFullPath().toString()); //$NON-NLS-1$
-		System.out.println("exists" + res.exists()); //$NON-NLS-1$
-	}
-
-	public static void dump(Object o){
-		if (o == null)
-			dump("null");		 //$NON-NLS-1$
-		else
-			dump(o.toString());	
-	}
-	public static void dump(String msg){
-		System.out.println("DUMP:" + msg); //$NON-NLS-1$
-	}
-	
-	public static void dumpImports(ICompilationUnit cu) throws JavaModelException{
-		IImportDeclaration[] imports= cu.getImports();
-		if (imports == null)
-			return;
-		DebugUtils.dump("Compilation Unit: " + cu.getElementName());	 //$NON-NLS-1$
-		for (int k= 0; k < imports.length; k ++){
-			DebugUtils.dump("import " + imports[k].getElementName() + " on demand: " + imports[k].isOnDemand()); //$NON-NLS-2$ //$NON-NLS-1$
-		}
-	}
-	
-	public static void dumpImports(IPackageFragment pack) throws JavaModelException{
-		ICompilationUnit[] cus= pack.getCompilationUnits();
-		if (cus == null)
-			return;
-		//DebugUtils.dump("Package " + pack.getElementName());	
-		for (int j= 0; j < cus.length; j++){
-			dumpImports(cus[j]);
-		}
-	}
-	
-	public static void dumpImports(IJavaProject project) throws JavaModelException{
-		IPackageFragment[] packages= project.getPackageFragments();
-		if (packages == null)
-			return;
-		//DebugUtils.dump("Project " + project.getElementName());	
-		for (int i= 0; i < packages.length; i++){
-			dumpImports(packages[i]);
-		}	
-	}
-
-
-
-	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/MockClipboard.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/MockClipboard.java
deleted file mode 100644
index d33f7d8..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/MockClipboard.java
+++ /dev/null
@@ -1,69 +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.jdt.ui.tests.refactoring.infra;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.widgets.Display;
-
-
-//have to create this class because of bug 40095
-public class MockClipboard extends Clipboard{
-
-	private Map fContents; //Transfer -> Object
-	 
-	public MockClipboard(Display display) {
-		super(display);
-		fContents= new HashMap();
-	}
-
-	protected void checkSubclass() {
-		//do nothing
-	}
-	
-	public TransferData[] getAvailableTypes() {
-		Set result= new HashSet();
-		for (Iterator iter= fContents.keySet().iterator(); iter.hasNext();) {
-			Transfer transfer= (Transfer)iter.next();
-			result.addAll(Arrays.asList(transfer.getSupportedTypes()));
-		}
-		return (TransferData[]) result.toArray(new TransferData[result.size()]);
-	}
-	
-	public Object getContents(Transfer transfer) {
-		return fContents.get(transfer);		
-	}
-	
-	public void setContents(Object[] data, Transfer[] dataTypes) {
-		if (data == null || dataTypes == null || data.length != dataTypes.length) {
-			DND.error(SWT.ERROR_INVALID_ARGUMENT);
-		}
-		fContents.clear();
-		for (int i= 0; i < dataTypes.length; i++) {
-			fContents.put(dataTypes[i], data[i]);
-		}
-	}
-	
-	public void dispose() {
-		fContents.clear();
-		super.dispose();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/MockWorkbenchSite.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/MockWorkbenchSite.java
deleted file mode 100644
index 14a8be0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/MockWorkbenchSite.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.eclipse.jdt.ui.tests.refactoring.infra;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.PlatformObject;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.IWorkbenchWindow;
-
-import org.eclipse.jdt.internal.corext.Assert;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-
-public class MockWorkbenchSite extends PlatformObject implements IWorkbenchSite {
-	
-	private ISelectionProvider fProvider;
-	
-	public MockWorkbenchSite(ISelectionProvider provider){
-		setSelectionProvider(provider);
-	}
-	
-	public MockWorkbenchSite(Object[] elements){
-		this(new SimpleSelectionProvider(elements));
-	}
-	
-	public MockWorkbenchSite(List elements){
-		this(new SimpleSelectionProvider(elements));
-	}
-	
-	public IWorkbenchPage getPage() {
-		return null;
-	}
-
-	public ISelectionProvider getSelectionProvider() {
-		return fProvider;
-	}
-
-	public Shell getShell() {
-		return JavaPlugin.getActiveWorkbenchShell();
-	}
-
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return null;
-	}
-	
-	public void setSelectionProvider(ISelectionProvider provider) {
-		Assert.isNotNull(provider);
-		fProvider= provider;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/RefactoringTestPlugin.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/RefactoringTestPlugin.java
deleted file mode 100644
index eceedaf..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/RefactoringTestPlugin.java
+++ /dev/null
@@ -1,69 +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.jdt.ui.tests.refactoring.infra;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-
-
-public class RefactoringTestPlugin extends Plugin {
-	
-	private static RefactoringTestPlugin fgDefault;
-	
-	public RefactoringTestPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		fgDefault= this;
-	}
-	
-	public static RefactoringTestPlugin getDefault() {
-		return fgDefault;
-	}
-	
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-	
-	public static void enableAutobuild(boolean enable) throws CoreException {
-		// disable auto build
-		IWorkspace workspace= getWorkspace();
-		IWorkspaceDescription desc= workspace.getDescription();
-		desc.setAutoBuilding(enable);
-		workspace.setDescription(desc);
-	}
-	
-	public InputStream getTestResourceStream(String fileName) throws IOException {
-		IPath path= new Path("resources").append(fileName);
-		URL url= new URL(getDescriptor().getInstallURL(), path.toString());
-		return url.openStream();
-	}
-	
-	public File getFileInPlugin(IPath path) {
-		try {
-			URL installURL= new URL(getDescriptor().getInstallURL(), path.toString());
-			URL localURL= Platform.asLocalURL(installURL);
-			return new File(localURL.getFile());
-		} catch (IOException e) {
-			return null;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/SimpleSelectionProvider.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/SimpleSelectionProvider.java
deleted file mode 100644
index 354328a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/SimpleSelectionProvider.java
+++ /dev/null
@@ -1,47 +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.jdt.ui.tests.refactoring.infra;
-
-import java.util.Collection;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-import org.eclipse.jdt.internal.corext.Assert;
-
-public class SimpleSelectionProvider implements ISelectionProvider {
-	private ISelection fSelection;
-
-	public SimpleSelectionProvider(Collection collection) {
-		this(collection.toArray());
-	}
-	
-	public SimpleSelectionProvider(Object[] elements) {
-		Assert.isNotNull(elements);
-		fSelection= new StructuredSelection(elements);
-	}
-
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-	}
-
-	public ISelection getSelection() {
-		return fSelection;
-	}
-
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-	}
-
-	public void setSelection(ISelection selection) {
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/TestExceptionHandler.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/TestExceptionHandler.java
deleted file mode 100644
index d79362a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/TestExceptionHandler.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.ui.tests.refactoring.infra;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeAbortException;
-import org.eclipse.jdt.internal.corext.refactoring.base.ChangeContext;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChange;
-import org.eclipse.jdt.internal.corext.refactoring.base.IChangeExceptionHandler;
-
-public class TestExceptionHandler implements IChangeExceptionHandler {
-
-	public void handle(ChangeContext context, IChange change, Exception e) {
-		if (e instanceof RuntimeException)
-			throw (RuntimeException)e;
-			
-		throw new ChangeAbortException(e);	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/TextRangeUtil.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/TextRangeUtil.java
deleted file mode 100644
index 4c3b00e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/infra/TextRangeUtil.java
+++ /dev/null
@@ -1,56 +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.jdt.ui.tests.refactoring.infra;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.ISourceRange;
-
-import org.eclipse.jdt.internal.corext.SourceRange;
-import org.eclipse.jdt.internal.corext.textmanipulation.TextBuffer;
-
-public class TextRangeUtil {
-
-	//no instances
-	private TextRangeUtil(){}
-	
-	public static ISourceRange getSelection(ICompilationUnit cu, int startLine, int startColumn, int endLine, int endColumn) throws Exception{
-		int offset= getOffset(cu, startLine, startColumn);
-		int end= getOffset(cu, endLine, endColumn);
-		return new SourceRange(offset, end - offset);
-	}
-
-	public static int getOffset(ICompilationUnit cu, int line, int column) throws Exception{
-		TextBuffer tb= TextBuffer.create(cu.getSource());
-		int r= tb.getLineInformation(line - 1).getOffset();
-		
-		int lineTabCount= calculateTabCountInLine(tb.getLineContent(line - 1), column);		
-		r += (column - 1) - (lineTabCount * getTabWidth()) + lineTabCount;
-		return r ;
-	}
-	
-	private static final int getTabWidth(){
-		return 4;
-	}
-	
-	public static int calculateTabCountInLine(String lineSource, int lastCharOffset){
-		int acc= 0;
-		int charCount= 0;
-		for(int i= 0; charCount < lastCharOffset - 1; i++){
-			if ('\t' == lineSource.charAt(i)){
-				acc++;
-				charCount += getTabWidth();
-			}	else
-				charCount += 1;
-		}
-		return acc;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/AllTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/AllTests.java
deleted file mode 100644
index 283cbab..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/AllTests.java
+++ /dev/null
@@ -1,33 +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.jdt.ui.tests.reorg;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllTests {
-	
-	public static Test suite ( ) {
-		TestSuite suite= new TestSuite("All Reorg Tests");
-		suite.addTest(DeleteTest.suite());
-		suite.addTest(CopyToClipboardActionTest.suite());
-		suite.addTest(PasteActionTest.suite());
-		suite.addTest(CopyTest.suite());
-		suite.addTest(MoveTest.suite());
-		suite.addTest(MultiMoveTest.suite());
-		
-		//------old reorg tests
-		suite.addTest(CopyResourcesToClipboardActionTest.suite());
-		suite.addTest(PasteResourcesFromClipboardActionTest.suite());
-
-		return suite;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyResourcesToClipboardActionTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyResourcesToClipboardActionTest.java
deleted file mode 100644
index b93ae7e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyResourcesToClipboardActionTest.java
+++ /dev/null
@@ -1,202 +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.jdt.ui.tests.reorg;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.widgets.Display;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceManipulation;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.ui.actions.SelectionDispatchAction;
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-import org.eclipse.jdt.ui.tests.refactoring.infra.MockClipboard;
-import org.eclipse.jdt.ui.tests.refactoring.infra.MockWorkbenchSite;
-
-import org.eclipse.jdt.internal.ui.refactoring.reorg.CopyToClipboardAction;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.PasteAction;
-
-public class CopyResourcesToClipboardActionTest extends RefactoringTest{
-
-	private static final Class clazz= CopyResourcesToClipboardActionTest.class;
-
-	private ICompilationUnit fCuA;
-	private ICompilationUnit fCuB;	
-	private IPackageFragment fPackageQ;
-	private IPackageFragment fPackageQ_R;
-	private IPackageFragment fDefaultPackage;
-	private static final String CU_A_NAME= "A";
-	private static final String CU_B_NAME= "B";
-	private IFile faTxt;
-
-	private Clipboard fClipboard;
-	
-	public CopyResourcesToClipboardActionTest(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private IFile createFile(IFolder folder, String fileName) throws Exception {
-		IFile file= folder.getFile(fileName);
-		file.create(getStream("aa"), true, null);	
-		return file;
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		fClipboard= new MockClipboard(Display.getDefault());
-		fDefaultPackage= MySetup.getDefaultSourceFolder().createPackageFragment("", true, null);
-		
-		fCuA= createCU(getPackageP(), CU_A_NAME + ".java", "package p; class A{}");
-		
-		fPackageQ= MySetup.getDefaultSourceFolder().createPackageFragment("q", true, null);
-		fCuB= createCU(fPackageQ, CU_B_NAME + ".java", "package q; class B{}");
-		
-		fPackageQ_R= MySetup.getDefaultSourceFolder().createPackageFragment("q.r", true, null);
-		
-		faTxt= createFile((IFolder)getPackageP().getUnderlyingResource(), "a.txt");
-		
-		assertTrue("A.java does not exist", fCuA.exists());
-		assertTrue("B.java does not exist", fCuB.exists());
-		assertTrue("q does not exist", fPackageQ.exists());
-		assertTrue("q.r does not exist", fPackageQ_R.exists());
-		assertTrue(faTxt.exists());
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		performDummySearch();
-		fClipboard.dispose();
-		delete(fCuA);
-		delete(fCuB);
-		delete(fPackageQ_R);
-		delete(fPackageQ);
-		delete(faTxt);
-	}
-
-	private static void delete(ISourceManipulation element) {
-		try {
-			if (element != null && ((IJavaElement)element).exists())
-				element.delete(false, null);
-		} catch(JavaModelException e) {
-			//ignore, we must keep going
-		}		
-	}
-	private static void delete(IFile element) {
-		try {
-			element.delete(true, false, null);
-		} catch(CoreException e) {
-			//ignore, we must keep going
-		}
-	}
-
-	private void checkEnabled(Object[] elements) {
-		SelectionDispatchAction pasteAction= new PasteAction(new MockWorkbenchSite(elements), fClipboard);
-		SelectionDispatchAction copyAction= new CopyToClipboardAction(new MockWorkbenchSite(elements), fClipboard, pasteAction);
-		copyAction.update(copyAction.getSelection());
-		assertTrue("action should be enabled", copyAction.isEnabled());
-	}
-	
-	private void checkDisabled(Object[] elements) {
-		SelectionDispatchAction pasteAction= new PasteAction(new MockWorkbenchSite(elements), fClipboard);
-		SelectionDispatchAction copyAction= new CopyToClipboardAction(new MockWorkbenchSite(elements), fClipboard, pasteAction);
-		copyAction.update(copyAction.getSelection());
-		assertTrue("action should not be enabled", ! copyAction.isEnabled());
-	}
-	
-	public void testEnabled0() throws Exception{
-		checkEnabled(new Object[]{fCuA});
-	}
-
-	public void testEnabled1() throws Exception{
-		checkEnabled(new Object[]{getRoot().getJavaProject()});
-	}
-		
-	public void testEnabled2() throws Exception{
-		checkEnabled(new Object[]{getPackageP()});
-	}
-	
-	public void testEnabled3() throws Exception{
-		checkEnabled(new Object[]{getPackageP(), fPackageQ, fPackageQ_R});
-	}
-
-	public void testEnabled4() throws Exception{
-		checkEnabled(new Object[]{faTxt});
-	}
-
-	public void testEnabled5() throws Exception{
-		checkEnabled(new Object[]{getRoot()});
-	}
-
-	public void testDisabled0() throws Exception{
-		checkDisabled(new Object[]{});
-	}
-
-	public void testDisabled1() throws Exception{
-		checkDisabled(new Object[]{getRoot().getJavaProject(), fCuA});
-	}
-
-	public void testDisabled2() throws Exception{
-		checkDisabled(new Object[]{getRoot().getJavaProject(), fPackageQ});
-	}
-
-	public void testDisabled3() throws Exception{
-		checkDisabled(new Object[]{getRoot().getJavaProject(), faTxt});
-	}
-
-	public void testDisabled4() throws Exception{
-		checkDisabled(new Object[]{getPackageP(), fCuA});
-	}
-
-	public void testDisabled5() throws Exception{
-		checkDisabled(new Object[]{getRoot(), fCuA});
-	}
-
-	public void testDisabled6() throws Exception{
-		checkDisabled(new Object[]{getRoot(), fPackageQ});
-	}
-
-	public void testDisabled7() throws Exception{
-		checkDisabled(new Object[]{getRoot(), faTxt});
-	}
-
-	public void testDisabled8() throws Exception{
-		checkDisabled(new Object[]{getRoot(), getRoot().getJavaProject()});
-	}
-
-	public void testDisabled9() throws Exception{
-		checkDisabled(new Object[]{MySetup.getProject().getPackageFragmentRoots()});
-	}
-
-	public void testDisabled10() throws Exception{
-		checkDisabled(new Object[]{fCuA, fCuB});
-	}
-	
-	public void testDisabled11() throws Exception{
-		checkDisabled(new Object[]{fDefaultPackage});
-	}
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyTest.java
deleted file mode 100644
index d5762fc..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyTest.java
+++ /dev/null
@@ -1,2802 +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.jdt.ui.tests.reorg;
-
-import java.io.IOException;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IImportContainer;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IInitializer;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.CopyRefactoring;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.INewNameQueries;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.INewNameQuery;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgQueries;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.ReorgUtils;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-
-
-public class CopyTest extends RefactoringTest {
-
-	private static final Class clazz= CopyTest.class;
-	private static final String REFACTORING_PATH= "Copy/";
-
-	public CopyTest(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	private void verifyDisabled(IResource[] resources, IJavaElement[] javaElements) throws JavaModelException {
-		CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings();
-		assertTrue("copy should be disabled", ! CopyRefactoring.isAvailable(resources, javaElements, settings));
-		CopyRefactoring refactoring2= CopyRefactoring.create(resources, javaElements, settings);
-		assertTrue(refactoring2 == null);
-	}
-
-	private CopyRefactoring verifyEnabled(IResource[] resources, IJavaElement[] javaElements, INewNameQueries newNameQueries, IReorgQueries reorgQueries) throws JavaModelException {
-		CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings();
-		assertTrue("copy should be enabled", CopyRefactoring.isAvailable(resources, javaElements, settings));
-		CopyRefactoring refactoring2= CopyRefactoring.create(resources, javaElements, settings);
-		assertNotNull(refactoring2);
-		if (newNameQueries != null)
-			refactoring2.setNewNameQueries(newNameQueries);
-		if (reorgQueries != null)
-			refactoring2.setReorgQueries(reorgQueries);
-		return refactoring2;
-	}
-	
-	private IReorgQueries createReorgQueries(){
-		return new MockReorgQueries();
-	}
-	
-	private void verifyInvalidDestination(CopyRefactoring ref, Object destination) throws Exception {
-		RefactoringStatus status= null;
-		if (destination instanceof IResource)
-			status= ref.setDestination((IResource)destination);
-		else if (destination instanceof IJavaElement)
-			status= ref.setDestination((IJavaElement)destination);
-		else assertTrue(false);
-		
-		assertEquals("destination was expected to be not valid",  RefactoringStatus.FATAL, status.getSeverity());
-	}
-	
-	private void verifyValidDestination(CopyRefactoring ref, Object destination) throws Exception {
-		RefactoringStatus status= null;
-		if (destination instanceof IResource)
-			status= ref.setDestination((IResource)destination);
-		else if (destination instanceof IJavaElement)
-			status= ref.setDestination((IJavaElement)destination);
-		else assertTrue(false);
-		
-		assertEquals("destination was expected to be valid: " + status.getMessageMatchingSeverity(status.getSeverity()), RefactoringStatus.OK, status.getSeverity());
-	}
-
-	private void verifyCopyingOfSubCuElements(ICompilationUnit[] cus, Object destination, IJavaElement[] javaElements) throws JavaModelException, Exception, IOException {
-		CopyRefactoring ref= verifyEnabled(new IResource[0], javaElements, new MockNewNameQueries(), createReorgQueries());
-		verifyValidDestination(ref, destination);
-		RefactoringStatus status= performRefactoring(ref);
-		assertNull("failed precondition", status);
-		for (int i= 0; i < cus.length; i++) {
-			assertEqualLines("different source in " + cus[i].getElementName(), getFileContents(getOutputTestFileName(removeExtension(cus[i].getElementName()))), cus[i].getSource());
-		}
-	}
-
-	private static class MockNewNameQueries implements INewNameQueries{
-
-		private static final String NEW_PACKAGE_NAME= "unused.name";
-		private static final String NEW_PACKAGE_FRAGMENT_ROOT_NAME= "UnusedName";
-		private static final String NEW_FILE_NAME= "UnusedName.gif";
-		private static final String NEW_FOLDER_NAME= "UnusedName";
-		private static final String NEW_CU_NAME= "UnusedName";
-		
-		public INewNameQuery createNewCompilationUnitNameQuery(ICompilationUnit cu, String s) {
-			return createStaticQuery(NEW_CU_NAME);
-		}
-
-		public INewNameQuery createNewResourceNameQuery(IResource res, String s) {
-			if (res instanceof IFile)
-				return createStaticQuery(NEW_FILE_NAME);
-			else
-				return createStaticQuery(NEW_FOLDER_NAME);
-		}
-
-		public INewNameQuery createNewPackageNameQuery(IPackageFragment pack, String s) {
-			return createStaticQuery(NEW_PACKAGE_NAME);
-		}
-
-		public INewNameQuery createNullQuery() {
-			return createStaticQuery(null);
-		}
-
-		public INewNameQuery createStaticQuery(final String newName) {
-			return new INewNameQuery(){
-				public String getNewName() {
-					return newName;
-				}
-			};
-		}
-
-		public INewNameQuery createNewPackageFragmentRootNameQuery(IPackageFragmentRoot root, String initialSuggestedName) {
-			return createStaticQuery(NEW_PACKAGE_FRAGMENT_ROOT_NAME);
-		}
-	}
-	//---------------
-	
-	public void test_field_declared_in_multi_yes_type() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IField field= cu.getType("A").getField("bar");
-			IType type= cu.getType("A");
-			IJavaElement[] javaElements= { field };
-			Object destination= type;
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_fields_declared_in_multi_yes_type() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IField field1= cu.getType("A").getField("bar");
-			IField field2= cu.getType("A").getField("baz");
-			IType type= cu.getType("A");
-			IJavaElement[] javaElements= { field1, field2 };
-			Object destination= type;
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_fields_declared_in_multi_yes_type_1() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IField field1= cu.getType("A").getField("var11");
-			IField field2= cu.getType("A").getField("var2");
-			IField field3= cu.getType("A").getField("var3");
-			IType type= cu.getType("A");
-			IJavaElement[] javaElements= { field1, field2, field3};
-			Object destination= type;
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDisabled_empty() throws Exception {
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);
-	}
-	
-	public void testDisabled_null_element() throws Exception {
-		IJavaElement[] javaElements= {null};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_null_resource() throws Exception {
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {null};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_javaProject() throws Exception {
-		IJavaElement[] javaElements= {MySetup.getProject()};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_defaultPackage() throws Exception {
-		IPackageFragment defaultPackage= getRoot().getPackageFragment("");
-		assertTrue(defaultPackage.exists());
-		IJavaElement[] javaElements= {defaultPackage};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_project() throws Exception {
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {MySetup.getProject().getProject()};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_notExistingElement() throws Exception {
-		ICompilationUnit notExistingCu= getPackageP().getCompilationUnit("NotMe.java");
-		assertTrue(! notExistingCu.exists());
-		IJavaElement[] javaElements= {notExistingCu};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);		
-	}
-
-	public void testDisabled_notExistingResource() throws Exception {
-		IFolder folder= (IFolder)getPackageP().getResource();
-		IFile notExistingFile= folder.getFile("a.txt");
-		
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {notExistingFile};
-		verifyDisabled(resources, javaElements);
-	}
-	
-	public void testDisabled_noCommonParent0() throws Exception {
-		IJavaElement[] javaElements= {getPackageP(), getRoot()};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);		
-	}
-	
-	public void testDisabled_noCommonParent1() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-		try {
-			IType classA= cu.getType("A");
-			IMethod	methodFoo= classA.getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { classA, methodFoo };
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-
-//	public void testDisabled_noCommonParent2() throws Exception {
-//		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-//		try {
-//			IType classA= cu.getType("A");
-//			IJavaElement[] javaElements= { classA, cu};
-//			IResource[] resources= {};
-//			verifyDisabled(resources, javaElements);
-//		} finally {
-//			performDummySearch();
-//			cu.delete(true, new NullProgressMonitor());
-//		}		
-//	}
-
-	public void testDisabled_noCommonParent3() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= {cu, getPackageP()};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-
-	public void testDisabled_noCommonParent5() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= {cu, getRoot()};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-
-	public void testDisabled_noCommonParent6() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= {cu, getRoot()};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-
-	public void testDisabled_noCommonParent7() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{class Inner{}}", false, new NullProgressMonitor());
-		try {
-			IType classA= cu.getType("A");
-			IType classInner= classA.getType("Inner");
-			IJavaElement[] javaElements= { classA, classInner};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void testDisabled_noCommonParent8() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try {
-			IType classA= cu.getType("A");
-			IMethod	methodFoo= classA.getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { methodFoo, classA};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testEnabled_cu() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= { cu};
-			IResource[] resources= {};
-			verifyEnabled(resources, javaElements, null, createReorgQueries());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-	
-	public void testEnabled_package() throws Exception {
-		IJavaElement[] javaElements= { getPackageP()};
-		IResource[] resources= {};
-		verifyEnabled(resources, javaElements, null, createReorgQueries());
-	}	
-	
-	public void testEnabled_packageRoot() throws Exception {
-		IJavaElement[] javaElements= { getRoot()};
-		IResource[] resources= {};
-		verifyEnabled(resources, javaElements, null, createReorgQueries());
-	}	
-
-	public void testEnabled_file() throws Exception {
-		IFolder folder= (IFolder)getPackageP().getResource();
-		IFile file= folder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			verifyEnabled(resources, javaElements, null, createReorgQueries());			
-		} finally{
-			performDummySearch();
-			file.delete(true, false, null);
-		}
-	}	
-
-	public void testEnabled_folder() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getResource();
-		
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {folder};
-		verifyEnabled(resources, javaElements, null, createReorgQueries());			
-	}
-
-	public void testEnabled_fileFolder() throws Exception {
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file, folder};
-			verifyEnabled(resources, javaElements, null, createReorgQueries());			
-		} finally{
-			performDummySearch();
-			file.delete(true, false, null);
-			folder.delete(true, false, null);
-		}
-	}	
-
-	public void testEnabled_fileFolderCu() throws Exception {
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file, folder};
-			verifyEnabled(resources, javaElements, null, createReorgQueries());			
-		} finally{
-			performDummySearch();
-			file.delete(true, false, null);
-			folder.delete(true, false, null);
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void testDestination_package_no_1() throws Exception{
-		IJavaElement[] javaElements= { getPackageP()};
-		IResource[] resources= {};
-		CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-		verifyInvalidDestination(ref, MySetup.getProject());
-	}
-
-	public void testDestination_package_no_2() throws Exception{		
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		try {
-			IJavaElement[] javaElements= { getPackageP()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination=cu;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testDestination_package_no_3() throws Exception{		
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		try {
-			IJavaElement[] javaElements= { getPackageP()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= file;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testDestination_package_no_4() throws Exception{		
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		try {
-			IJavaElement[] javaElements= { getPackageP()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= folder;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testDestination_cu_no_1() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IProject closedProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		closedProject.create(null);
-		assertTrue(! closedProject.isOpen());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= closedProject;
-			verifyInvalidDestination(ref, destination);
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-			closedProject.delete(true, true, null);
-		}
-	}
-
-	public void testDestination_folder_no_0() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= folder;//same folder
-			verifyInvalidDestination(ref, destination);	
-		}finally{
-			performDummySearch();
-			folder.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_folder_no_1() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IFolder childFolder= folder.getFolder("folder");
-		childFolder.create(true, true, null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= childFolder;
-			verifyInvalidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			folder.delete(true, false, null);
-			childFolder.delete(true, false, null);
-		}
-	}
-	
-	public void testDestination_folder_no_2() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IFile childFile= folder.getFile("a.txt");
-		childFile.create(getStream("123"), true, null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= childFile;
-			verifyInvalidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			folder.delete(true, false, null);
-			childFile.delete(true, false, null);
-		}
-	}
-	
-	public void testDestination_folder_no_3() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		assertTrue(! simpleProject.isOpen());
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyInvalidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-			simpleProject.delete(true, true, new NullProgressMonitor());
-		}
-	}
-
-	
-	public void testDestination_root_no_0() throws Exception{
-		IJavaElement[] javaElements= {getRoot()};
-		IResource[] resources= {};
-		CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-		Object destination= getPackageP();
-		verifyInvalidDestination(ref, destination);			
-	}
-
-	public void testDestination_root_no_1() throws Exception{
-		ICompilationUnit cu= getPackageP().createCompilationUnit("B.java", "package p;class B{}", false, new NullProgressMonitor());
-		
-		try {
-			IJavaElement[] javaElements= { getRoot()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= cu;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}			
-	}
-
-	public void testDestination_root_no_2() throws Exception{
-		ICompilationUnit cu= getPackageP().createCompilationUnit("B.java", "package p;class B{}", false, new NullProgressMonitor());
-		
-		try {
-			IJavaElement[] javaElements= { getRoot()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			IType classB= cu.getType("B");
-			Object destination= classB;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}			
-	}
-	
-	public void testDestination_root_no_3() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		try {
-			IJavaElement[] javaElements= { getRoot()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= file;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-		}			
-	}
-
-	public void testDestination_root_no_4() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		try {
-			IJavaElement[] javaElements= { getRoot()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= folder;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_root_no_5() throws Exception{
-		IJavaElement[] javaElements= { getRoot()};
-		IResource[] resources= {};
-		CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-		Object destination= getRoot();
-		verifyInvalidDestination(ref, destination);
-	}
-	
-	public void testDestination_cu_yes_0() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-			Object destination= cu1;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_cu_yes_1() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_cu_yes_2() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IPackageFragment otherPackage= getRoot().createPackageFragment("otherPackage", true, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= otherPackage;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-			otherPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_cu_yes_3() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_cu_yes_4() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_cu_yes_5() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyValidDestination(ref, destination);
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-			simpleProject.delete(true, true, null);
-		}
-	}
-
-	public void testDestination_cu_yes_6() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= file;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-			file.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_cu_yes_7() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= folder;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-			folder.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_cu_yes_8() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		ICompilationUnit cu2= getPackageP().createCompilationUnit("B.java", "package p;class B{}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			IType classB= cu2.getType("B");
-			Object destination= classB;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-			cu2.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-
-	public void testDestination_file_yes_0() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= file;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-		}
-	}		
-
-	public void testDestination_file_yes_1() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		IFile otherFile= superFolder.getFile("b.txt");
-		otherFile.create(getStream("123"), true, null);
-		
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= otherFile;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-			otherFile.delete(true, new NullProgressMonitor());
-		}
-	}		
-
-	public void testDestination_file_yes_3() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= folder;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-			folder.delete(true, new NullProgressMonitor());
-		}
-	}		
-
-	public void testDestination_file_yes_4() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());			
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= cu1;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-			cu1.delete(true, new NullProgressMonitor());
-		}
-	}		
-	
-	public void testDestination_file_yes_5() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_file_yes_6() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-		}
-	}		
-
-	public void testDestination_file_yes_7() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-		}
-	}		
-
-	public void testDestination_file_yes_8() throws Exception{
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		IFile file= parentFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= parentFolder;
-			verifyValidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void testDestination_file_yes_9() throws Exception{
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		ICompilationUnit cu2= getPackageP().createCompilationUnit("B.java", "package p;class B{}", false, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			IType classB= cu2.getType("B");			
-			Object destination= classB;
-			verifyValidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());			
-			cu2.delete(true, new NullProgressMonitor());
-		}
-	}
-			
-	public void testDestination_folder_yes_0() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IFolder otherFolder= superFolder.getFolder("otherfolder");
-		otherFolder.create(true, true, null);
-		
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= otherFolder;
-			verifyValidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-			otherFolder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testDestination_folder_yes_1() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyValidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testDestination_folder_yes_2() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testDestination_folder_yes_3() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyValidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-		}
-	}
-	
-	public void testDestination_folder_yes_4() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IFolder otherFolder= superFolder.getFolder("otherfolder");
-		otherFolder.create(true, true, null);
-		IFile fileInAnotherFolder= otherFolder.getFile("f.tex");
-		fileInAnotherFolder.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= fileInAnotherFolder;
-			verifyValidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());	
-			otherFolder.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_folder_yes_5() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= cu;
-			verifyValidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_folder_yes_6() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyValidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-			simpleProject.delete(true, true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_package_yes_0() throws Exception{
-		IJavaElement[] javaElements= {getPackageP()};
-		IResource[] resources= {};
-		CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-		Object destination= getRoot();
-		verifyValidDestination(ref, destination);						
-	}
-
-	public void testDestination_package_yes_1() throws Exception{
-		IJavaElement[] javaElements= { getPackageP()};
-		IResource[] resources= {};
-		CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-		verifyValidDestination(ref, getPackageP());
-	}
-
-	public void testDestination_package_yes_2() throws Exception{		
-		IPackageFragment otherPackage= getRoot().createPackageFragment("other.pack", true, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= { getPackageP()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= otherPackage;
-			verifyValidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			otherPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_root_yes_0() throws Exception{
-		IJavaElement[] javaElements= {getRoot()};
-		IResource[] resources= {};
-		CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-		Object destination= getRoot().getJavaProject();
-		verifyValidDestination(ref, destination);
-	}
-	
-	public void testDestination_root_yes_1() throws Exception{
-		IJavaProject otherJavaProject= JavaProjectHelper.createJavaProject("other", "bin");
-		
-		try {
-			IJavaElement[] javaElements= { getRoot()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= otherJavaProject;
-			verifyValidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			JavaProjectHelper.delete(otherJavaProject);
-		}						
-	}
-	
-	public void testDestination_method_no_cu() throws Exception{
-		ICompilationUnit cu= null;
-		ICompilationUnit otherCu= getPackageP().createCompilationUnit("C.java", "package p;class C{}", false, new NullProgressMonitor());
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= otherCu;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			otherCu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_method_no_package() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_method_no_file() throws Exception{
-		ICompilationUnit cu= null;
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= file;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			file.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_method_no_folder() throws Exception{
-		ICompilationUnit cu= null;
-		IProject parentFolder= MySetup.getProject().getProject();
-		String folderName= "folder";
-		IFolder folder= parentFolder.getFolder(folderName);
-		folder.create(true, true, null);	
-
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= folder;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			folder.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_method_no_root() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_method_no_java_project() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_method_no_simple_project() throws Exception{
-		ICompilationUnit cu= null;
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			simpleProject.delete(true, true, null);	
-		}
-	}
-
-	public void testDestination_method_no_import_container() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "import java.util.*;package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			IImportContainer importContainer= cu.getImportContainer();
-			Object destination= importContainer;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_method_no_import_declaration() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "import java.util.*;package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			IImportDeclaration importDeclaration= cu.getImport("java.util.*");
-			Object destination= importDeclaration;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_method_no_package_declaration() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "import java.util.*;package p;class A{void foo(){}}", false, new NullProgressMonitor());
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= cu.getPackageDeclaration("p");
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_method_yes_itself() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			Object destination= method;
-
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-//	public void test_method_yes_cu_with_main_type() throws Exception{
-//		ICompilationUnit cu= null;
-//		ICompilationUnit otherCu= createCUfromTestFile(getPackageP(), "C");
-//		try {
-//			cu= createCUfromTestFile(getPackageP(), "A");
-//			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-//			IJavaElement[] javaElements= { method };
-//			Object destination= otherCu;
-//
-//			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu, otherCu}, destination, javaElements);
-//		} finally {
-//			performDummySearch();
-//			cu.delete(true, new NullProgressMonitor());
-//			otherCu.delete(true, new NullProgressMonitor());
-//		}
-//	}
-	public void test_method_yes_other_method() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IMethod otherMethod= cu.getType("A").getMethod("bar", new String[0]);
-			IJavaElement[] javaElements= { method };
-			Object destination= otherMethod;
-
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_method_yes_field() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IField field= cu.getType("A").getField("bar");
-			IJavaElement[] javaElements= { method };
-			Object destination= field;
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_method_yes_type() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			Object destination= cu.getType("A");
-
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void test_method_yes_initializer() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			Object destination= cu.getType("A").getInitializer(1);
-
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_field_yes_field() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IField field= cu.getType("A").getField("bar");
-			IField otherField= cu.getType("A").getField("baz");
-			IJavaElement[] javaElements= { field };
-			Object destination= otherField;
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_inner_type_yes_cu() throws Exception{
-		ICompilationUnit cu= null;
-		ICompilationUnit otherCu= createCUfromTestFile(getPackageP(), "C");
-
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IType type= cu.getType("A").getType("Inner");
-			IJavaElement[] javaElements= { type };
-			Object destination= otherCu;
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{otherCu, cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			otherCu.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void test_type_yes_package() throws Exception{
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{}", true, new NullProgressMonitor());
-		ICompilationUnit newCu= null;
-		try {
-			IType type= cu.getType("A");
-			IJavaElement[] javaElements= { type };
-			IResource[] resources=  {};
-			Object destination= getPackageP();
-			INewNameQueries queries= new MockNewNameQueries();
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-			verifyValidDestination(ref, destination);
-			assertTrue("source cu does not exist before copying", cu.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("source cu does not exist after copying", cu.exists());
-			newCu= getPackageP().getCompilationUnit(MockNewNameQueries.NEW_CU_NAME + ".java");
-			assertTrue("new cu does not exist after copying", newCu.exists());
-		} finally {
-			performDummySearch();
-			if (newCu != null && newCu.exists())
-				newCu.delete(true, new NullProgressMonitor());
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_type_yes_other_package() throws Exception{
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{}", true, new NullProgressMonitor());
-		IPackageFragment otherPackage= getRoot().createPackageFragment("other", true, new NullProgressMonitor());
-		ICompilationUnit newCu= null;
-		try {
-			IType type= cu.getType("A");
-			IJavaElement[] javaElements= { type };
-			IResource[] resources=  {};
-			Object destination= otherPackage;
-			
-			INewNameQueries queries= new MockNewNameQueries();
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-			verifyValidDestination(ref, destination);
-			assertTrue("source cu does not exist before copying", cu.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("source cu does not exist after copying", cu.exists());
-			newCu= otherPackage.getCompilationUnit(cu.getElementName());
-			assertTrue("new cu does not exist after copying", newCu.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			if (newCu != null && newCu.exists())
-				newCu.delete(true, new NullProgressMonitor());
-			otherPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_initializer_no_package() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "import java.util.*;package p;class A{void foo(){}{}}", false, new NullProgressMonitor());
-			IInitializer initializer= cu.getType("A").getInitializer(1);
-			IJavaElement[] javaElements= { initializer };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_initializer_yes_type() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IInitializer initializer= cu.getType("A").getInitializer(1);
-			IJavaElement[] javaElements= { initializer };
-			Object destination= cu.getType("A");
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_initializer_yes_method() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IInitializer initializer= cu.getType("A").getInitializer(1);
-			IJavaElement[] javaElements= { initializer };
-			Object destination= cu.getType("A").getMethod("foo", new String[0]);
-
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_import_container_no_package() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= getPackageP().createCompilationUnit("A.java", "import java.util.*;package p;class A{void foo(){}{}}", false, new NullProgressMonitor());
-			IImportContainer container= cu.getImportContainer();
-			IJavaElement[] javaElements= { container };
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, null, createReorgQueries());
-	
-			Object destination= getPackageP();
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_import_container_yes_type_in_different_cu() throws Exception{
-		ICompilationUnit cu= null;
-		ICompilationUnit otherCu= createCUfromTestFile(getPackageP(), "C");
-
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IImportContainer container= cu.getImportContainer();
-			IJavaElement[] javaElements= { container };
-			Object destination= otherCu.getType("C");
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu, otherCu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			otherCu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_import_container_yes_method_in_different_cu() throws Exception{
-		ICompilationUnit cu= null;
-		ICompilationUnit otherCu= createCUfromTestFile(getPackageP(), "C");
-
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IImportContainer container= cu.getImportContainer();
-			IJavaElement[] javaElements= { container };
-			Object destination= otherCu.getType("C").getMethod("foo", new String[0]);
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu, otherCu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			otherCu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void test_import_container_yes_cu() throws Exception{
-		ICompilationUnit cu= null;
-		ICompilationUnit otherCu= createCUfromTestFile(getPackageP(), "C");
-
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IImportContainer container= cu.getImportContainer();
-			IJavaElement[] javaElements= { container };
-			Object destination= otherCu;
-			verifyCopyingOfSubCuElements(new ICompilationUnit[]{cu, otherCu}, destination, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			otherCu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-
-	public void testCopy_File_to_Folder() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-		
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder destinationFolder= superFolder.getFolder("folder");
-		destinationFolder.create(true, true, null);
-		
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= destinationFolder;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= destinationFolder.getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			destinationFolder.delete(true, false, null);
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_File_to_Same_Folder() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-		
-		IFolder destinationFolder= parentFolder;
-		
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= destinationFolder;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= destinationFolder.getFile(MockNewNameQueries.NEW_FILE_NAME);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-	
-	public void testCopy_File_to_Itself() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-				
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= file;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= parentFolder.getFile(MockNewNameQueries.NEW_FILE_NAME);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_File_to_AnotherFile() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-
-		IFile otherFile= MySetup.getProject().getProject().getFile("b.txt");
-		otherFile.create(getStream("123"), true, null);
-				
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= otherFile;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= MySetup.getProject().getProject().getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			otherFile.delete(true, false, null);
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_File_to_Package() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-		
-		IPackageFragment otherPackage= getRoot().createPackageFragment("other.pack", true, new NullProgressMonitor());
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= otherPackage;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= ((IFolder)otherPackage.getResource()).getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			otherPackage.delete(true, new NullProgressMonitor());
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_File_to_DefaultPackage() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-		
-		IPackageFragment defaultPackage= getRoot().getPackageFragment("");
-		assertTrue(defaultPackage.exists());
-		assertTrue(defaultPackage.isDefaultPackage());
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= defaultPackage;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= ((IFolder)defaultPackage.getResource()).getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_File_to_SourceFolder() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-				
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= ((IFolder)getRoot().getResource()).getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_File_to_JavaProject() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-				
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= MySetup.getProject().getProject().getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_File_to_Cu() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-				
-		IFile newFile= null;
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= cu;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= parentFolder.getFile(MockNewNameQueries.NEW_FILE_NAME);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			cu.delete(true, new NullProgressMonitor());
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-	
-	public void testCopy_File_to_SimpleProject() throws Exception {
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		String fileName= "a.txt";
-		IFile file= parentFolder.getFile(fileName);
-		file.create(getStream("123"), true, null);
-				
-		IFile newFile= null;
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {};
-			IResource[] resources= { file };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", file.exists());
-			
-			newFile= simpleProject.getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			file.delete(true, false, null);
-			simpleProject.delete(true, new NullProgressMonitor());
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_Cu_to_Folder() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder destinationFolder= superFolder.getFolder("folder");
-		destinationFolder.create(true, true, null);
-		
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= { };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= destinationFolder;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source cu does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source cu does not exist after copying", cu.exists());
-			
-			newFile= destinationFolder.getFile(fileName);
-			assertTrue("new cu does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			destinationFolder.delete(true, false, null);
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_Cu_to_Same_Package() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		ICompilationUnit newCu= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= { };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-			
-			Object destination= getPackageP();
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source cu does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source cu does not exist after copying", cu.exists());
-			
-			newCu= getPackageP().getCompilationUnit(MockNewNameQueries.NEW_CU_NAME + ".java");
-			assertTrue("new cu does not exist after copying", newCu.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			if (newCu != null && newCu.exists()){
-				newCu.delete(true, new NullProgressMonitor());
-			}
-		}
-	}
-
-	public void test_type_yes_type() throws Exception{
-		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit otherCu= createCUfromTestFile(getPackageP(), "C");
-
-		ICompilationUnit newCu= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= { };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-			
-			Object destination= otherCu;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source cu does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source cu does not exist after copying", cu.exists());
-			
-			newCu= getPackageP().getCompilationUnit(MockNewNameQueries.NEW_CU_NAME + ".java");
-			assertTrue("new cu does not exist after copying", newCu.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			if (newCu != null && newCu.exists()){
-				newCu.delete(true, new NullProgressMonitor());
-			}
-			if (otherCu != null && otherCu.exists()){
-				otherCu.delete(true, new NullProgressMonitor());
-			}
-		}
-	}
-	
-	public void testCopy_Cu_to_Itself() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-				
-		ICompilationUnit newCu= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= { };
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= cu;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", cu.exists());
-			
-			newCu= getPackageP().getCompilationUnit(MockNewNameQueries.NEW_CU_NAME + ".java");
-			assertTrue("new file does not exist after copying", newCu.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			if (newCu != null && newCu.exists()){
-				newCu.delete(true, new NullProgressMonitor());
-			}
-		}
-	}
-
-	public void testCopy_Cu_to_OtherPackage() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		IPackageFragment otherPackage= getRoot().createPackageFragment("other.pack", true, new NullProgressMonitor());
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= otherPackage;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", cu.exists());
-			
-			ICompilationUnit newCu= otherPackage.getCompilationUnit(fileName);
-			assertTrue("new file does not exist after copying", newCu.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			otherPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_Cu_to_DefaultPackage() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		IPackageFragment defaultPackage= getRoot().getPackageFragment("");
-		assertTrue(defaultPackage.exists());
-		assertTrue(defaultPackage.isDefaultPackage());
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= defaultPackage;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", cu.exists());
-			
-			ICompilationUnit newCu= defaultPackage.getCompilationUnit(fileName);
-			assertTrue("new file does not exist after copying", newCu.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_Cu_to_SourceFolder() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		ICompilationUnit newCu= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", cu.exists());
-			
-			newCu= getRoot().getPackageFragment("").getCompilationUnit(fileName);
-			assertTrue("new file does not exist after copying", newCu.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_Cu_to_JavaProject() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", cu.exists());
-			
-			newFile= MySetup.getProject().getProject().getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			if (newFile != null)
-				newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_Cu_to_File_In_Package() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		IFolder parentFolder= (IFolder) getPackageP().getResource();
-		IFile file= parentFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		assertTrue(file.exists());
-
-		ICompilationUnit newCu= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= file;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", cu.exists());
-			
-			newCu= getPackageP().getCompilationUnit(MockNewNameQueries.NEW_CU_NAME + ".java");
-			assertTrue("new file does not exist after copying", newCu.exists());
-			
-			String expectedSource= "package p;class "+ MockNewNameQueries.NEW_CU_NAME +"{void foo(){}class Inner{}}";
-			assertEqualLines("source compare failed", expectedSource, newCu.getSource());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			file.delete(true, false, null);
-			if (newCu != null && newCu.exists()){
-				newCu.delete(true, new NullProgressMonitor());
-			}
-		}
-	}
-
-	public void testCopy_Cu_to_File_In_Resource_Folder() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		IProject parentFolder= MySetup.getProject().getProject();
-		IFile file= parentFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= file;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", cu.exists());
-			
-			newFile= MySetup.getProject().getProject().getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			file.delete(true, false, null);
-			newFile.delete(true, false, null);
-		}
-	}
-	
-	public void testCopy_Cu_to_SimpleProject() throws Exception {
-		String fileName= "A.java";
-		ICompilationUnit cu= getPackageP().createCompilationUnit(fileName, "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-
-		IFile newFile= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before copying", cu.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file does not exist after copying", cu.exists());
-			
-			newFile= simpleProject.getFile(fileName);
-			assertTrue("new file does not exist after copying", newFile.exists());
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			simpleProject.delete(true, false, null);
-			newFile.delete(true, false, null);
-		}
-	}
-
-	public void testCopy_Package_to_Its_Root() throws Exception {
-		IPackageFragment newPackage= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {getPackageP()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source package does not exist before copying", getPackageP().exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source package does not exist after copying", getPackageP().exists());
-			
-			newPackage= getRoot().getPackageFragment(MockNewNameQueries.NEW_PACKAGE_NAME);
-			assertTrue("new package does not exist after copying", newPackage.exists());
-		} finally {
-			performDummySearch();
-			newPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_Package_to_Itself() throws Exception {
-		IPackageFragment newPackage= null;
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {getPackageP()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source package does not exist before copying", getPackageP().exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source package does not exist after copying", getPackageP().exists());
-			
-			newPackage= getRoot().getPackageFragment(MockNewNameQueries.NEW_PACKAGE_NAME);
-			assertTrue("new package does not exist after copying", newPackage.exists());
-		} finally {
-			performDummySearch();
-			if (newPackage != null && newPackage.exists())
-				newPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_Package_to_Another_Root() throws Exception {
-		IPackageFragmentRoot otherRoot= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "otherRoot");
-		IPackageFragment newPackage= null;
-		String packageName= getPackageP().getElementName();
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {getPackageP()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= otherRoot;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source package does not exist before copying", getPackageP().exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source package does not exist after copying", getPackageP().exists());
-			
-			newPackage= otherRoot.getPackageFragment(packageName);
-			assertTrue("new package does not exist after copying", newPackage.exists());
-		} finally {
-			performDummySearch();
-			newPackage.delete(true, new NullProgressMonitor());
-			otherRoot.delete(0, 0, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_Package_to_JavaProject_That_Is_Root() throws Exception {
-		IJavaProject otherProject= JavaProjectHelper.createJavaProject("otherProject", null);
-		JavaProjectHelper.addSourceContainer(otherProject, null);
-		try {
-			INewNameQueries queries= new MockNewNameQueries();
-
-			IJavaElement[] javaElements= {getPackageP()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, queries, createReorgQueries());
-
-			Object destination= otherProject;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source package does not exist before copying", getPackageP().exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source package does not exist after copying", getPackageP().exists());
-			
-			IPackageFragment newPackage= null;
-			IPackageFragmentRoot[] roots= otherProject.getAllPackageFragmentRoots();
-			for (int i= 0; i < roots.length; i++) {
-				if (ReorgUtils.isSourceFolder(roots[i])){
-					newPackage= roots[i].getPackageFragment(getPackageP().getElementName());
-					assertTrue("new package does not exist after copying", newPackage.exists());					
-				}
-			}
-			assertNotNull(newPackage);
-		} finally {
-			performDummySearch();
-			JavaProjectHelper.delete(otherProject);
-		}
-	}
-	
-	public void testCopy_folder_to_other_folder() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-		String folderName= "folder";
-		IFolder folder= superFolder.getFolder(folderName);
-		folder.create(true, true, null);
-
-		IFolder otherFolder= superFolder.getFolder("otherfolder");
-		otherFolder.create(true, true, null);
-		
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			Object destination= otherFolder;
-			verifyValidDestination(ref, destination);	
-
-			assertTrue("source does not exist before copying", folder.exists());
-								
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source does not exist after copying", folder.exists());
-			assertTrue("copied folder does not exist after copying", otherFolder.getFolder(folderName).exists());
-			
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-			otherFolder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testCopy_folder_Java_project() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-		String folderName= "folder";
-		IFolder folder= superFolder.getFolder(folderName);
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyValidDestination(ref, destination);						
-
-			assertTrue("source does not exist before copying", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source does not exist after copying", folder.exists());
-			
-			assertTrue("copied folder does not exist after copying", MySetup.getProject().getProject().getFolder(folderName).exists());
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testCopy_folder_to_source_folder() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-		String folderName= "folder";
-		IFolder folder= superFolder.getFolder(folderName);
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);						
-
-			assertTrue("source does not exist before copying", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source does not exist after copying", folder.exists());
-			
-			assertTrue("copied folder does not exist after copying", ((IFolder)getRoot().getResource()).getFolder(folderName).exists());
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testCopy_folder_to_package() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-		String folderName= "folder";
-		IFolder folder= superFolder.getFolder(folderName);
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			IPackageFragment destination= getPackageP();
-			verifyValidDestination(ref, destination);						
-			assertTrue("source does not exist before copying", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source does not exist after copying", folder.exists());			
-			assertTrue("copied folder does not exist after copying", ((IFolder)destination.getResource()).getFolder(folderName).exists());
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-		}
-
-	}
-	public void testCopy_folder_to_file_in_another_folder() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-		String folderName= "folder";
-		IFolder folder= superFolder.getFolder(folderName);
-		folder.create(true, true, null);
-
-		IFolder otherFolder= superFolder.getFolder("otherfolder");
-		otherFolder.create(true, true, null);
-		IFile fileInAnotherFolder= otherFolder.getFile("f.tex");
-		fileInAnotherFolder.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			Object destination= fileInAnotherFolder;
-			verifyValidDestination(ref, destination);						
-			assertTrue("source does not exist before copying", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source does not exist after copying", folder.exists());			
-			assertTrue("copied folder does not exist after copying", otherFolder.getFolder(folderName).exists());
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());	
-			otherFolder.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_folder_to_cu() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-		String folderName= "folder";
-		IFolder folder= superFolder.getFolder(folderName);
-		folder.create(true, true, null);
-
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			Object destination= cu;
-			verifyValidDestination(ref, destination);						
-			assertTrue("source does not exist before copying", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source does not exist after copying", folder.exists());			
-			assertTrue("copied folder does not exist after copying", ((IFolder)getPackageP().getResource()).getFolder(folderName).exists());
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_folder_to_simple_project() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-		String folderName= "folder";
-		IFolder folder= superFolder.getFolder(folderName);
-		folder.create(true, true, null);
-
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyValidDestination(ref, destination);						
-			assertTrue("source does not exist before copying", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source does not exist after copying", folder.exists());			
-			assertTrue("copied folder does not exist after copying", simpleProject.getFolder(folderName).exists());
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-			simpleProject.delete(true, true, new NullProgressMonitor());
-		}
-	}
-
-	public void testCopy_root_to_same_Java_project() throws Exception {
-		IPackageFragmentRoot newRoot= null;
-		try {
-			IJavaElement[] javaElements= { getRoot()};
-			IResource[] resources= {			};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			Object destination= getRoot().getJavaProject();
-			verifyValidDestination(ref, destination);
-			assertTrue("source does not exist before copying", getRoot().exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-
-			assertTrue("source does not exist after copying", getRoot().exists());
-			String newName= MockNewNameQueries.NEW_PACKAGE_FRAGMENT_ROOT_NAME;
-			newRoot= getSourceFolder(MySetup.getProject(), newName);
-			assertNotNull("copied folder does not exist after copying", newRoot);
-			assertTrue("copied folder does not exist after copying", newRoot.exists());
-		} finally {
-			performDummySearch();
-			if (newRoot != null && newRoot.exists())
-				newRoot.delete(0, 0, new NullProgressMonitor());
-		}
-	}
-	
-	public void testCopy_root_to_other_Java_project() throws Exception {
-		IJavaProject otherJavaProject= JavaProjectHelper.createJavaProject("other", "bin");
-		try {
-			IJavaElement[] javaElements= { getRoot()};
-			IResource[] resources= {};
-			CopyRefactoring ref= verifyEnabled(resources, javaElements, new MockNewNameQueries(), createReorgQueries());
-
-			Object destination= otherJavaProject;
-			verifyValidDestination(ref, destination);
-			assertTrue("source does not exist before copying", getRoot().exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-
-			assertTrue("source does not exist after copying", getRoot().exists());
-			String newName= getRoot().getElementName();
-			IPackageFragmentRoot newRoot= getSourceFolder(otherJavaProject, newName);
-			assertNotNull("copied folder does not exist after copying", newRoot);
-			assertTrue("copied folder does not exist after copying", newRoot.exists());
-		} finally {
-			performDummySearch();
-			JavaProjectHelper.delete(otherJavaProject);
-		}						
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyToClipboardActionTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyToClipboardActionTest.java
deleted file mode 100644
index b1be752..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/CopyToClipboardActionTest.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/DeleteTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/DeleteTest.java
deleted file mode 100644
index 3c641b5..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/DeleteTest.java
+++ /dev/null
@@ -1,652 +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.jdt.ui.tests.reorg;
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.participants.DeleteRefactoring;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.JavaDeleteProcessor;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgQueries;
-
-
-public class DeleteTest extends RefactoringTest{
-
-	private static final Class clazz= DeleteTest.class;
-	private static final String REFACTORING_PATH= "Delete/";
-
-	public DeleteTest(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	private void verifyDisabled(Object[] elements) throws CoreException {
-		DeleteRefactoring ref= new DeleteRefactoring(elements);
-		assertTrue("delete should be disabled", !ref.isAvailable());
-	}
-
-	private void verifyEnabled(Object[] elements) throws CoreException {
-		DeleteRefactoring ref= new DeleteRefactoring(elements);
-		assertTrue("delete should be enabled", ref.isAvailable());
-	}
-
-	private IPackageFragmentRoot getArchiveRoot() throws JavaModelException, Exception {
-		IPackageFragmentRoot[] roots= MySetup.getProject().getPackageFragmentRoots();
-		IPackageFragmentRoot archive= null;
-		for (int i= 0; i < roots.length; i++) {
-			IPackageFragmentRoot root= roots[i];
-			if (root.isArchive() && root.isExternal())
-				archive= root;
-		}
-		return archive;
-	}
-
-	private ICompilationUnit fCuA;
-	private static final String CU_NAME= "A";
-
-	private void loadFileSetup() throws Exception{
-		fCuA= createCUfromTestFile(getPackageP(), CU_NAME);
-		assertTrue("A.java does not exist", fCuA.exists());
-	}
-	
-	private void checkDelete(IJavaElement[] elems, boolean deleteCu) throws JavaModelException, Exception {
-		ICompilationUnit newCuA= null;
-		try {
-			DeleteRefactoring refactoring= createRefactoring(elems);
-			assertNotNull(refactoring);
-			RefactoringStatus status= performRefactoring(refactoring);
-			assertEquals("precondition was supposed to pass", null, status);
-
-			newCuA= getPackageP().getCompilationUnit(CU_NAME + ".java");
-			assertTrue("A.java does not exist", newCuA.exists() == !deleteCu);
-			if (! deleteCu)
-				assertEqualLines("incorrect content of A.java", getFileContents(getOutputTestFileName(CU_NAME)), newCuA.getSource());
-		} finally {
-			performDummySearch();
-			if (newCuA != null && newCuA.exists())
-				newCuA.delete(true, null);	
-			if (fCuA != null && fCuA.exists()){
-				fCuA.delete(true, null);		
-				fCuA= null;
-			}
-		}	
-	}
-
-	//---- tests
-	
-	private IReorgQueries createReorgQueries() {
-		return new MockReorgQueries();
-	}
-
-	public void testDisabled_emptySelection() throws Exception{
-		verifyDisabled(new Object[] {});
-	}
-
-	public void testDisabled_projectAndNonProject() throws Exception{
-		IJavaElement[] javaElements= {MySetup.getProject(), getPackageP()};
-		verifyDisabled(javaElements);
-	}
-
-	public void testDisabled_nonExistingResource() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getResource();
-		IFile file= folder.getFile("a.txt");
-		
-		IResource[] resources= {file};
-		verifyDisabled(resources);			
-	}
-	
-	public void testDisabled_nonExistingJavaElement() throws Exception{
-		IJavaElement notExistingCu= getPackageP().getCompilationUnit("V.java");
-		
-		IJavaElement[] javaElements= {notExistingCu};
-		verifyDisabled(javaElements);			
-	}
-
-	public void testDisabled_nullResource() throws Exception{
-		Object[] elements= {MySetup.getProject(), null};
-		verifyDisabled(elements);
-	}
-	
-	public void testDisabled_nullJavaElement() throws Exception{
-		Object[] elements= {getPackageP(), null};
-		verifyDisabled(elements);
-	}
-
-	public void testDisabled_archiveElement() throws Exception{		
-		IPackageFragmentRoot archive= getArchiveRoot();
-		assertNotNull(archive);
-		
-		Object[] elements= archive.getChildren();
-		verifyDisabled(elements);
-	}
-
-	public void testDisabled_externalArchive() throws Exception{
-		IPackageFragmentRoot archive= getArchiveRoot();
-		assertNotNull(archive);
-		
-		Object[] elements= {archive};
-		verifyDisabled(elements);
-	}
-
-	public void testDisabled_archiveFromAnotherProject() throws Exception{
-		//TODO implement me
-	}
-
-	public void testDisabled_emptySuperPackage() throws Exception{
-		IPackageFragment superPackage= getRoot().createPackageFragment("superPackage", false, new NullProgressMonitor());
-		IPackageFragment subPackage= getRoot().createPackageFragment("superPackage.subPackage", false, new NullProgressMonitor());
-		try{
-			assertTrue(superPackage.exists());
-			assertTrue(subPackage.exists());
-			assertTrue(superPackage.hasSubpackages());
-		
-			Object[] elements= {superPackage};
-			verifyDisabled(elements);
-		} finally {
-			performDummySearch();
-			subPackage.delete(true, new NullProgressMonitor());
-			superPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDisabled_binaryMember() throws Exception{
-		//TODO implement me
-	}
-
-	public void testDisabled_javaProject() throws Exception{
-		Object[] elements= {MySetup.getProject()};
-		verifyDisabled(elements);
-	}
-
-	public void testEnabled_defaultPackage() throws Exception{
-//		printTestDisabledMessage("enable this case once 38450 is fixed");
-		
-		IPackageFragment defaultPackage= getRoot().getPackageFragment("");
-		ICompilationUnit cu= defaultPackage.createCompilationUnit("A.java", "", false, new NullProgressMonitor());
-		
-		try{
-			Object[] elements= {defaultPackage};
-			verifyEnabled(elements);		
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void testDisabled_simpleProject() throws Exception{
-		Object[] elements= {MySetup.getProject().getProject()};
-		verifyDisabled(elements);
-	}
-
-	public void testEnabled_cu() throws Exception{
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "", false, new NullProgressMonitor());
-		
-		try{		
-			Object[] elements= {cu};
-			verifyEnabled(elements);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}	
-
-	public void testEnabled_sourceReferences1() throws Exception{
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "", false, new NullProgressMonitor());
-		try{
-			IJavaElement importD= cu.createImport("java.lang.*", null, new NullProgressMonitor());
-			IJavaElement packageD= cu.createPackageDeclaration("p", new NullProgressMonitor());
-			IJavaElement type= cu.createType("class A{}", null, false, new NullProgressMonitor());
-			
-			Object[] elements= {packageD, importD, type};
-			verifyEnabled(elements);			
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void testEnabled_sourceReferences2() throws Exception{
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "", false, new NullProgressMonitor());
-		try{
-			IType type= cu.createType("class A{}", null, false, new NullProgressMonitor());
-			IJavaElement field= type.createField("int i;", null, false, new NullProgressMonitor());
-			IJavaElement method= type.createMethod("void f(){}", null, false, new NullProgressMonitor());
-			IJavaElement initializer= type.createInitializer("{ int k= 0;}", null, new NullProgressMonitor());
-			IJavaElement innerType= type.createType("class Inner{}", null, false,  new NullProgressMonitor());
-			
-			Object[] elements= {field, method, initializer, innerType};
-			verifyEnabled(elements);			
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}	
-
-	
-	public void testEnabled_file() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getResource();
-		IFile file= folder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		try{
-			Object[] elements= {file};
-			verifyEnabled(elements);			
-		} finally{
-			performDummySearch();
-			file.delete(true, false, null);
-		}
-	}	
-
-	public void testEnabled_folder() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getResource();
-		
-		Object[] elements= {folder};
-		verifyEnabled(elements);			
-	}	
-
-	public void testEnabled_readOnlyCu() throws Exception{
-		//TODO implement me
-	}	
-
-	public void testEnabled_readOnlyFile() throws Exception{
-		//TODO implement me
-	}	
-	
-	public void testEnabled_package() throws Exception{
-		Object[] elements= {getPackageP()};
-		verifyEnabled(elements);
-	}
-
-	public void testEnabled_sourceFolder() throws Exception{
-		Object[] elements= {getRoot()};
-		verifyEnabled(elements);
-	}	
-
-	public void testEnabled_linkedFile() throws Exception{
-		//TODO implement me
-	}	
-	
-	public void testEnabled_linkedFolder() throws Exception{
-		//TODO implement me
-	}	
-
-	public void testEnabled_linkedPackage() throws Exception{
-		//TODO implement me
-	}	
-
-	public void testEnabled_linkedSourceFolder() throws Exception{
-		//TODO implement me
-	}
-
-	public void testDeleteWithinCu0() throws Exception{
-//		printTestDisabledMessage("bug#15305 incorrect deletion of fields (multi-declaration case)");
-//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("i");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu1() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, true);
-	}
-	
-	public void testDeleteWithinCu2() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("i");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu3() throws Exception{
-//		printTestDisabledMessage("bug#15305 incorrect deletion of fields (multi-declaration case)");
-//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");		
-//		if (true)
-//			return;
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("i");
-		IJavaElement elem1= fCuA.getType("A").getField("j");
-		IJavaElement[] elems= new IJavaElement[]{elem0, elem1};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu4() throws Exception{
-//		printTestDisabledMessage("bug#15305 incorrect deletion of fields (multi-declaration case)");
-//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");		
-//		if (true)
-//			return;
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("i");
-		IJavaElement elem1= fCuA.getType("A").getField("k");
-		IJavaElement[] elems= new IJavaElement[]{elem0, elem1};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu5() throws Exception{
-//		printTestDisabledMessage("bug#15305 incorrect deletion of fields (multi-declaration case)");
-//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");		
-//		if (true)
-//			return;
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("j");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu6() throws Exception{
-//		printTestDisabledMessage("test for bug#8405 Delete field action broken for multiple declarations");		
-//		printTestDisabledMessage("test for bug#9382 IField::delete incorrect on multiple field declarations with initializers");		
-//		if (true)
-//			return;
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("j");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu7() throws Exception{
-		//exposes bug#9381 IPackageDeclaration is not ISourceManipulation 
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getPackageDeclaration("p");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-	
-	public void testDeleteWithinCu8() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getMethod("m", new String[0]);
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu9() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getInitializer(1);
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu10() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getInitializer(1);
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu11() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getImport("java.util.List");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu12() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getType("B");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-	
-	public void testDeleteWithinCu13() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getType("B");
-		IJavaElement elem1= fCuA.getType("A");
-		IJavaElement[] elems= new IJavaElement[]{elem0, elem1};
-
-		checkDelete(elems, true);
-	}
-
-	public void testDeleteWithinCu14() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getType("B");
-		IJavaElement elem1= fCuA.getType("A");
-		IJavaElement elem2= fCuA.getPackageDeclaration("p");
-		IJavaElement[] elems= new IJavaElement[]{elem0, elem1, elem2};
-
-		checkDelete(elems, true);
-	}
-
-	public void testDeleteWithinCu15() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("field");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu16() throws Exception{
-//		printTestDisabledMessage("test for bug#15412 deleting type removes too much from editor");		
-//		if (true)
-//			return;
-		
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("Test");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu17() throws Exception{
-//		printTestDisabledMessage("test for bug#15936 delete methods deletes too much (indent messing)");		
-//		if (true)
-//			return;
-		
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getMethod("f", new String[0]);
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu18() throws Exception{
-//		printTestDisabledMessage("test for bug#16314");		
-//		if (true)
-//			return;
-		
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getMethod("fs", new String[0]);
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-	
-	public void testDeleteWithinCu19() throws Exception{
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getImportContainer();
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu20() throws Exception{
-//		printTestDisabledMessage("regression test for bug 38480");
-		
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("fEmpty");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-
-	public void testDeleteWithinCu21() throws Exception{
-//		printTestDisabledMessage("regression test for bug 39195");
-		
-		loadFileSetup();
-		IJavaElement elem0= fCuA.getType("A").getField("var11");
-		IJavaElement[] elems= new IJavaElement[]{elem0};
-
-		checkDelete(elems, false);
-	}
-	
-	public void testDeleteFile() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getResource();
-		IFile file= folder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		assertTrue("file does not exist", file.exists());
-		Object[] elem= {file};
-		verifyEnabled(elem);			
-		performDummySearch();			
-		
-		DeleteRefactoring ref= createRefactoring(elem);
-		RefactoringStatus status= performRefactoring(ref);
-		assertEquals("expected to pass", null, status);
-		assertTrue("file not deleted", ! file.exists());
-	}
-
-	public void testDeleteFolder() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getResource();
-		IFolder subFolder= folder.getFolder("subFolder");
-		subFolder.create(true, true, null);
-
-		assertTrue("folder does not exist", subFolder.exists());
-		Object[] elements= {subFolder};
-		verifyEnabled(elements);			
-		performDummySearch();			
-
-		DeleteRefactoring ref= createRefactoring(elements);
-		RefactoringStatus status= performRefactoring(ref);
-		assertEquals("expected to pass", null, status);
-		assertTrue("folder not deleted", ! subFolder.exists());
-	}
-
-	public void testDeleteNestedFolders() throws Exception{
-		IFolder folder= (IFolder)getPackageP().getResource();
-		IFolder subFolder= folder.getFolder("subFolder");
-		subFolder.create(true, true, null);
-		IFolder subsubFolder= subFolder.getFolder("subSubFolder");
-		subsubFolder.create(true, true, null);
-
-		assertTrue("folder does not exist", subFolder.exists());
-		assertTrue("folder does not exist", subsubFolder.exists());
-		Object[] elements= {subFolder, subsubFolder};
-		verifyEnabled(elements);			
-		performDummySearch();			
-
-		DeleteRefactoring ref= createRefactoring(elements);
-		RefactoringStatus status= performRefactoring(ref);
-		assertEquals("expected to pass", null, status);
-		assertTrue("folder not deleted", ! subFolder.exists());
-		assertTrue("folder not deleted", ! subsubFolder.exists());
-	}
-	
-	public void testDeletePackage() throws Exception{
-		IPackageFragment newPackage= getRoot().createPackageFragment("newPackage", true, new NullProgressMonitor());
-		assertTrue("package not created", newPackage.exists());
-
-		Object[] elements= {newPackage};
-		verifyEnabled(elements);			
-		performDummySearch();			
-		
-		DeleteRefactoring ref= createRefactoring(elements);
-		RefactoringStatus status= performRefactoring(ref);
-		assertEquals("expected to pass", null, status);
-		assertTrue("package not deleted", ! newPackage.exists());
-	}
-
-	public void testDeleteCu() throws Exception{
-		ICompilationUnit newCU= getPackageP().createCompilationUnit("X.java", "package p; class X{}", true, new NullProgressMonitor());
-		assertTrue("cu not created", newCU.exists());
-
-		Object[] elements= {newCU};
-		verifyEnabled(elements);			
-		performDummySearch();			
-		
-		DeleteRefactoring ref= createRefactoring(elements);
-		RefactoringStatus status= performRefactoring(ref);
-		assertEquals("expected to pass", null, status);
-		assertTrue("cu not deleted", ! newCU.exists());
-	}
-	
-	public void testDeleteSourceFolder() throws Exception{
-		IPackageFragmentRoot fredRoot= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "fred");
-		assertTrue("not created", fredRoot.exists());
-
-		Object[] elements= {fredRoot};
-		verifyEnabled(elements);			
-		performDummySearch();			
-
-		DeleteRefactoring ref= createRefactoring(elements);
-		RefactoringStatus status= performRefactoring(ref);
-		assertEquals("expected to pass", null, status);
-		assertTrue("not deleted", ! fredRoot.exists());
-	}
-	
-	public void testDeleteInternalJAR() throws Exception{
-		File lib= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.MYLIB);
-		assertTrue("lib does not exist",  lib != null && lib.exists());
-		IPackageFragmentRoot internalJAR= JavaProjectHelper.addLibraryWithImport(MySetup.getProject(), new Path(lib.getPath()), null, null);
-
-		Object[] elements= {internalJAR};
-		verifyEnabled(elements);			
-		performDummySearch();			
-
-		DeleteRefactoring ref= createRefactoring(elements);
-		RefactoringStatus status= performRefactoring(ref);
-		assertEquals("expected to pass", null, status);
-		assertTrue("not deleted", ! internalJAR.exists());		
-	}
-	
-	public void testDeleteClassFile() throws Exception{
-		//TODO implement me - how do i get a handle to a class file?
-	}
-	
-	private DeleteRefactoring createRefactoring(Object[] elements) throws CoreException {
-		DeleteRefactoring result= new DeleteRefactoring(elements);
-		((JavaDeleteProcessor)result.getProcessor()).setQueries(createReorgQueries());
-		return result;		
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MockReorgQueries.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MockReorgQueries.java
deleted file mode 100644
index a891736..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MockReorgQueries.java
+++ /dev/null
@@ -1,49 +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.jdt.ui.tests.reorg;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.OperationCanceledException;
-
-import org.eclipse.jdt.internal.corext.refactoring.reorg.IConfirmQuery;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgQueries;
-
-
-class MockReorgQueries implements IReorgQueries{
-	private final List fQueriesRun= new ArrayList() ;	
-	public IConfirmQuery createYesNoQuery(String queryTitle, boolean allowCancel, int queryID) {
-		run(queryID);
-		return yesQuery;
-	}
-	public IConfirmQuery createYesYesToAllNoNoToAllQuery(String queryTitle, boolean allowCancel, int queryID) {
-		run(queryID);
-		return yesQuery;
-	}
-	private void run(int queryID) {
-		fQueriesRun.add(new Integer(queryID));
-	}
-
-	//List<Integer>
-	public List getRunQueryIDs(){
-		return fQueriesRun;
-	}
-	
-	private final IConfirmQuery yesQuery= new IConfirmQuery(){
-		public boolean confirm(String question) throws OperationCanceledException {
-			return true;
-		}
-		public boolean confirm(String question, Object[] elements) throws OperationCanceledException {
-			return true;
-		}
-	};
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MoveTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MoveTest.java
deleted file mode 100644
index 994c771..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MoveTest.java
+++ /dev/null
@@ -1,1573 +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.jdt.ui.tests.reorg;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IInitializer;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgQueries;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.MoveRefactoring;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-
-
-public class MoveTest extends RefactoringTest {
-
-	public MoveTest(String name) {
-		super(name);
-	}
-
-	private static final Class clazz= MoveTest.class;
-	private static final String REFACTORING_PATH= "Move/";
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	private IReorgQueries createReorgQueries(){
-		return new MockReorgQueries();
-	}
-
-	private void verifyDisabled(IResource[] resources, IJavaElement[] javaElements) throws JavaModelException {
-		CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings();
-		assertTrue("move should be disabled", ! MoveRefactoring.isAvailable(resources, javaElements, settings));
-		MoveRefactoring refactoring2= MoveRefactoring.create(resources, javaElements, settings);
-		assertTrue(refactoring2 == null);
-	}
-	
-	private MoveRefactoring verifyEnabled(IResource[] resources, IJavaElement[] javaElements, IReorgQueries reorgQueries) throws JavaModelException {
-		CodeGenerationSettings settings= JavaPreferencesSettings.getCodeGenerationSettings();
-		assertTrue("move should be enabled", MoveRefactoring.isAvailable(resources, javaElements, settings));
-		MoveRefactoring refactoring2= MoveRefactoring.create(resources, javaElements, settings);
-		if (reorgQueries != null)
-			refactoring2.setReorgQueries(reorgQueries);
-		assertNotNull(refactoring2);
-		return refactoring2;
-	}
-	
-	private void verifyValidDestination(MoveRefactoring ref, Object destination) throws Exception {
-		RefactoringStatus status= null;
-		if (destination instanceof IResource)
-			status= ref.setDestination((IResource)destination);
-		else if (destination instanceof IJavaElement)
-			status= ref.setDestination((IJavaElement)destination);
-		else assertTrue(false);
-		
-		assertEquals("destination was expected to be valid: " + status.getMessageMatchingSeverity(status.getSeverity()), RefactoringStatus.OK, status.getSeverity());
-	}
-
-	private void verifyInvalidDestination(MoveRefactoring ref, Object destination) throws Exception {
-		RefactoringStatus status= null;
-		if (destination instanceof IResource)
-			status= ref.setDestination((IResource)destination);
-		else if (destination instanceof IJavaElement)
-			status= ref.setDestination((IJavaElement)destination);
-		else assertTrue(false);
-		
-		assertEquals("destination was expected to be not valid",  RefactoringStatus.FATAL, status.getSeverity());
-	}
-
-
-	public void testDisabled_empty() throws Exception {
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);
-	}
-	
-	public void testDisabled_null_element() throws Exception {
-		IJavaElement[] javaElements= {null};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_null_resource() throws Exception {
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {null};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_javaProject() throws Exception {
-		IJavaElement[] javaElements= {MySetup.getProject()};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_defaultPackage() throws Exception {
-		IPackageFragment defaultPackage= getRoot().getPackageFragment("");
-		assertTrue(defaultPackage.exists());
-		IJavaElement[] javaElements= {defaultPackage};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_project() throws Exception {
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {MySetup.getProject().getProject()};
-		verifyDisabled(resources, javaElements);
-	}
-
-	public void testDisabled_notExistingElement() throws Exception {
-		ICompilationUnit notExistingCu= getPackageP().getCompilationUnit("NotMe.java");
-		assertTrue(! notExistingCu.exists());
-		IJavaElement[] javaElements= {notExistingCu};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);		
-	}
-
-	public void testDisabled_notExistingResource() throws Exception {
-		IFolder folder= (IFolder)getPackageP().getResource();
-		IFile notExistingFile= folder.getFile("a.txt");
-		
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {notExistingFile};
-		verifyDisabled(resources, javaElements);
-	}
-	
-	public void testDisabled_noCommonParent0() throws Exception {
-		IJavaElement[] javaElements= {getPackageP(), getRoot()};
-		IResource[] resources= {};
-		verifyDisabled(resources, javaElements);		
-	}
-	
-	public void testDisabled_noCommonParent1() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-		try {
-			IType classA= cu.getType("A");
-			IMethod	methodFoo= classA.getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { classA, methodFoo };
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-
-//	public void testDisabled_noCommonParent2() throws Exception {
-//		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-//		try {
-//			IType classA= cu.getType("A");
-//			IJavaElement[] javaElements= { classA, cu};
-//			IResource[] resources= {};
-//			verifyDisabled(resources, javaElements);
-//		} finally {
-//			performDummySearch();
-//			cu.delete(true, new NullProgressMonitor());
-//		}		
-//	}
-
-	public void testDisabled_noCommonParent3() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= {cu, getPackageP()};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-
-	public void testDisabled_noCommonParent5() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= {cu, getRoot()};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-
-	public void testDisabled_noCommonParent6() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}}", false, new NullProgressMonitor());
-		try {
-			IJavaElement[] javaElements= {cu, getRoot()};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}		
-	}
-
-	public void testDisabled_noCommonParent7() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{class Inner{}}", false, new NullProgressMonitor());
-		try {
-			IType classA= cu.getType("A");
-			IType classInner= classA.getType("Inner");
-			IJavaElement[] javaElements= { classA, classInner};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void testDisabled_noCommonParent8() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try {
-			IType classA= cu.getType("A");
-			IMethod	methodFoo= classA.getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { methodFoo, classA};
-			IResource[] resources= {};
-			verifyDisabled(resources, javaElements);
-		} finally {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_fileToItself() throws Exception {
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= file;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			file.delete(true, false, null);
-		}
-	}
-	
-	public void testDestination_no_fileToSiblingFile() throws Exception {
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFile file1= superFolder.getFile("a.txt");
-		file1.create(getStream("123"), true, null);
-		IFile file2= superFolder.getFile("b.txt");
-		file2.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file1};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= file2;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			file1.delete(true, false, null);
-			file2.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_no_folderToItsef() throws Exception {
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= folder;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			folder.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_no_cuToItsef() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= cu;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, null);
-		}
-	}
-
-	public void testDestination_no_cuToSiblingCu() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("B.java", "package p;class A{}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= cu1;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, null);
-			cu1.delete(true, null);
-		}
-	}
-
-	public void testDestination_no_cuToSiblingFile() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFile file1= superFolder.getFile("a.txt");
-		file1.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= file1;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, null);
-			file1.delete(true, null);
-		}
-	}
-	
-	public void testDestination_no_packageToItsef() throws Exception {
-		IJavaElement[] javaElements= {getPackageP()};
-		IResource[] resources= {};
-		MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-		Object destination= getPackageP();
-		verifyInvalidDestination(ref, destination);
-	}
-	
-	public void testDestination_no_sourceFolderToItsef() throws Exception {
-		IJavaElement[] javaElements= {getRoot()};
-		IResource[] resources= {};
-		MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-		Object destination= getRoot();
-		verifyInvalidDestination(ref, destination);
-	}
-	
-	public void testDestination_no_methodToItsef() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= method;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, null);
-		}
-	}
-
-	public void testDestination_no_fileToParentFolder() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		IFile file= folder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= folder;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			folder.delete(true, false, null);
-			file.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_no_fileToParentPackage() throws Exception {
-		IFolder superFolder= (IFolder)getPackageP().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			file.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_no_fileToParentSourceFolder() throws Exception {
-		IFolder superFolder= (IFolder)getRoot().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			file.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_no_folderToParentFolder() throws Exception {
-		IProject superFolder= MySetup.getProject().getProject();
-
-		IFolder parentFolder= superFolder.getFolder("folder");
-		parentFolder.create(true, true, null);
-		IFolder folder= parentFolder.getFolder("subfolder");
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {parentFolder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= parentFolder;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			parentFolder.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_no_cuToParentPackage() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {cu};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= cu.getParent();
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, null);
-		}
-	}
-	
-	public void testDestination_no_packageToParentSourceFolder() throws Exception {
-		IJavaElement[] javaElements= {getPackageP()};
-		IResource[] resources= {};
-		MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-		Object destination= getRoot();
-		verifyInvalidDestination(ref, destination);
-	}
-	
-	public void testDestination_no_sourceFolderToParentProject() throws Exception {
-		IJavaElement[] javaElements= {getRoot()};
-		IResource[] resources= {};
-		MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-		Object destination= getRoot().getParent();
-		verifyInvalidDestination(ref, destination);
-	}
-	
-	public void testDestination_no_methodToParentType() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= cu.getType("A");
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, null);
-		}
-	}
-
-	public void testDestination_yes_cuToMethod() throws Exception {
-		IPackageFragment pack1= getRoot().createPackageFragment("q", true, new NullProgressMonitor());
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("B.java", "package p;class B{}", false, new NullProgressMonitor());
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {cu1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= method;
-			verifyValidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			pack1.delete(true, new NullProgressMonitor());
-			cu1.delete(true, null);
-		}
-	}
-	
-	public void testDestination_no_packageToCu() throws Exception {
-		IPackageFragment pack1= getRoot().createPackageFragment("q", true, new NullProgressMonitor());
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {pack1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= cu;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			pack1.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_packageToFile() throws Exception {
-		IPackageFragment pack1= getRoot().createPackageFragment("q", true, new NullProgressMonitor());
-		IFolder superFolder= (IFolder)getRoot().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		try{
-			IJavaElement[] javaElements= {pack1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= file;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			pack1.delete(true, new NullProgressMonitor());
-			file.delete(true, false, null);	
-		}
-	}
-
-	public void testDestination_no_packageToFolder() throws Exception {
-		IPackageFragment pack1= getRoot().createPackageFragment("q", true, new NullProgressMonitor());
-		IFolder superFolder= (IFolder)getRoot().getResource();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {pack1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= folder;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			pack1.delete(true, new NullProgressMonitor());
-			folder.delete(true, false, null);	
-		}
-	}
-
-	public void testDestination_no_packageToSimpleProject() throws Exception {
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		
-		IPackageFragment pack1= getRoot().createPackageFragment("q", true, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {pack1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			pack1.delete(true, new NullProgressMonitor());
-			simpleProject.delete(true, true, null);	
-		}
-	}
-
-//	public void testDestination_no_packageToJavaProjectWithNoSourceFolders() throws Exception {
-//		IJavaProject otherProject= JavaProjectHelper.createJavaProject("otherProject", null);
-//		JavaProjectHelper.addSourceContainer(otherProject, null);
-//		IPackageFragment pack1= getRoot().createPackageFragment("q", true, new NullProgressMonitor());
-//		try{
-//			IJavaElement[] javaElements= {pack1};
-//			IResource[] resources= {};
-//			MoveRefactoring2 ref= verifyEnabled(resources, javaElements, createReorgQueries());
-//
-//			Object destination= otherProject;
-//			verifyInvalidDestination(ref, destination);
-//		} finally{
-//			performDummySearch();
-//			pack1.delete(true, new NullProgressMonitor());
-//			JavaProjectHelper.delete(otherProject);
-//		}
-//	}
-	
-	public void testDestination_no_packageToSiblingPackage() throws Exception {
-		IPackageFragment pack1= getRoot().createPackageFragment("q", true, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= {getPackageP()};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= pack1;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			pack1.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void testDestination_no_sourceFolderToCu() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "src2");
-		try{
-			IJavaElement[] javaElements= {sourceFolder};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= cu;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			sourceFolder.delete(0, 0, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_sourceFolderToPackage() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "src2");
-		try{
-			IJavaElement[] javaElements= {sourceFolder};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= getPackageP();
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			sourceFolder.delete(0, 0, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_sourceFolderToFile() throws Exception {
-		IFolder superFolder= (IFolder)getRoot().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "src2");
-		try{
-			IJavaElement[] javaElements= {sourceFolder};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= file;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			sourceFolder.delete(0, 0, new NullProgressMonitor());
-			file.delete(true, false, null);	
-		}
-	}
-
-	public void testDestination_no_sourceFolderToFolder() throws Exception {
-		IFolder superFolder= (IFolder)getRoot().getResource();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "src2");
-		try{
-			IJavaElement[] javaElements= {sourceFolder};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= folder;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			sourceFolder.delete(0, 0, new NullProgressMonitor());
-			folder.delete(true, false, null);	
-		}
-	}
-
-	public void testDestination_no_sourceFolderToSourceFolder() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "src2");
-		try{
-			IJavaElement[] javaElements= {sourceFolder};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= getRoot();
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			sourceFolder.delete(0, 0, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_sourceFolderToSimpleProject() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "src2");
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-
-		try{
-			IJavaElement[] javaElements= {sourceFolder};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= simpleProject;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			sourceFolder.delete(0, 0, new NullProgressMonitor());
-			simpleProject.delete(true, true, null);
-		}
-	}
-
-	public void testDestination_no_sourceFolderToJavaProjecteWithNoSourceFolder() throws Exception {
-		IJavaProject otherProject= JavaProjectHelper.createJavaProject("otherProject", null);
-		JavaProjectHelper.addSourceContainer(otherProject, null);
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "src2");
-		
-		try{
-			IJavaElement[] javaElements= {sourceFolder};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= otherProject;
-			verifyInvalidDestination(ref, destination);
-		}finally{
-			performDummySearch();
-			sourceFolder.delete(0, 0, new NullProgressMonitor());
-			JavaProjectHelper.delete(otherProject);
-		} 
-	}
-	
-	public void testDestination_no_methodToCu() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("B.java", "package p;class B{}", false, new NullProgressMonitor());
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= cu1;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			cu1.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_methodToFile() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IFolder superFolder= (IFolder)getRoot().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= file;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			file.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_no_methodToFolder() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IFolder superFolder= (IFolder)getRoot().getResource();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= folder;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			folder.delete(true, false, null);
-		}
-	}
-	
-	public void testDestination_no_methodToPackage() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= getPackageP();
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_methodToSourceFolder() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= getRoot();
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_methodToJavaProject() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= MySetup.getProject();
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_no_methodToSimpleProject() throws Exception {
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {method};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-	
-			Object destination= simpleProject;
-			verifyInvalidDestination(ref, destination);
-		} finally{
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-			simpleProject.delete(true, true, null);
-		}
-	}
-	
-	public void testDestination_no_cuToItself() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-			Object destination= cu1;
-			verifyInvalidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			cu1.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_cuToOtherPackage() throws Exception{
-		IPackageFragment otherPackage= getRoot().createPackageFragment("otherPackage", true, new NullProgressMonitor());
-		String oldSource= "package p;class A{void foo(){}class Inner{}}";
-		String newSource= "package otherPackage;class A{void foo(){}class Inner{}}";
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", oldSource, false, new NullProgressMonitor());
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= otherPackage;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before moving", cu1.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("source file exists after moving", ! cu1.exists());
-			ICompilationUnit newCu= otherPackage.getCompilationUnit(cu1.getElementName());
-			assertTrue("new file does not exist after moving", newCu.exists());
-			assertEqualLines("source differs", newSource, newCu.getSource());
-		}finally{
-			performDummySearch();
-			otherPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_cuToRoot() throws Exception{
-		String newSource= "class A{void foo(){}class Inner{}}";
-		String oldSource= "package p;class A{void foo(){}class Inner{}}";
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", oldSource, false, new NullProgressMonitor());
-		ICompilationUnit newCu= null;
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);			
-			
-			assertTrue("source file does not exist before moving", cu1.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("source file exists after moving", ! cu1.exists());
-			newCu= getRoot().getPackageFragment("").getCompilationUnit(cu1.getElementName());
-			assertTrue("new file does not exist after moving", newCu.exists());
-			assertEqualLines("source differs", newSource, newCu.getSource());
-
-		}finally{
-			performDummySearch();
-			newCu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_cuToProject() throws Exception{
-		String oldSource= "package p;class A{void foo(){}class Inner{}}";
-		String newSource= oldSource;
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", oldSource, false, new NullProgressMonitor());
-		IFile newFile= null;
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyValidDestination(ref, destination);			
-
-			assertTrue("source file does not exist before moving", cu1.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("source file exists after moving", ! cu1.exists());
-			newFile= MySetup.getProject().getProject().getFile(cu1.getElementName());
-			assertEqualLines("source differs", newSource, getContents(newFile));
-		}finally{
-			performDummySearch();
-			newFile.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_yes_cuToSimpleProject() throws Exception{
-		String oldSource= "package p;class A{void foo(){}class Inner{}}";
-		String newSource= oldSource;
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", oldSource, false, new NullProgressMonitor());
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		IFile newFile= null;
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyValidDestination(ref, destination);
-
-			assertTrue("source file does not exist before moving", cu1.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("source file exists after moving", ! cu1.exists());
-			newFile= simpleProject.getFile(cu1.getElementName());
-			assertEqualLines("source differs", newSource, getContents(newFile));
-		}finally{
-			performDummySearch();
-			simpleProject.delete(true, true, null);
-		}
-	}
-
-	public void testDestination_yes_cuToFileInDifferentPackage() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IPackageFragment otherPackage= getRoot().createPackageFragment("other", true, new NullProgressMonitor());
-		IFolder superFolder= (IFolder) otherPackage.getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		ICompilationUnit newCu= null;
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= file;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before", cu1.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file not moved", ! cu1.exists());
-			
-			newCu= otherPackage.getCompilationUnit(cu1.getElementName());
-			assertTrue("new file does not exist after", newCu.exists());
-
-			String expectedSource= "package other;class A{void foo(){}class Inner{}}";
-			assertEqualLines("source compare failed", expectedSource, newCu.getSource());
-		}finally{
-			performDummySearch();
-			otherPackage.delete(true, null);	
-			if (newCu != null && newCu.exists())
-				newCu.delete(true, new NullProgressMonitor());
-			file.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_yes_cuToFolder() throws Exception{
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		
-		IFile newFile= null;
-		try{
-			IJavaElement[] javaElements= { cu1};
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= folder;
-			verifyValidDestination(ref, destination);			
-
-			assertTrue("source file does not exist before", cu1.exists());
-			String expectedSource= cu1.getSource();
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file not moved", ! cu1.exists());
-			
-			newFile= folder.getFile(cu1.getElementName());
-			assertTrue("new file does not exist after", newFile.exists());
-
-			assertEqualLines("source compare failed", expectedSource, getContents(newFile));
-		}finally{
-			performDummySearch();
-			newFile.delete(true, false, null);
-			folder.delete(true, false, null);
-		}
-	}
-
-	public void testDestination_yes_fileToSiblingFolder() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IFile newFile= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= folder;
-			verifyValidDestination(ref, destination);			
-
-			assertTrue("source file does not exist before", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file not moved", ! file.exists());
-			
-			newFile= folder.getFile(file.getName());
-			assertTrue("new file does not exist after", newFile.exists());
-		}finally{
-			performDummySearch();
-			newFile.delete(true, new NullProgressMonitor());
-			folder.delete(true, new NullProgressMonitor());
-		}
-	}		
-
-	public void testDestination_yes_fileToCu() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		ICompilationUnit cu1= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());			
-		IFile newFile= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= cu1;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("source file does not exist before", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file not moved", ! file.exists());
-			
-			newFile= ((IFolder)cu1.getParent().getResource()).getFile(file.getName());
-			assertTrue("new file does not exist after", newFile.exists());
-		}finally{
-			performDummySearch();
-			newFile.delete(true, new NullProgressMonitor());
-			cu1.delete(true, new NullProgressMonitor());
-		}
-	}		
-	
-	public void testDestination_yes_fileToPackage() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		IFile newFile= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyValidDestination(ref, destination);			
-
-			assertTrue("source file does not exist before", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file not moved", ! file.exists());
-			
-			newFile= ((IFolder)getPackageP().getResource()).getFile(file.getName());
-			assertTrue("new file does not exist after", newFile.exists());
-		}finally{
-			performDummySearch();
-			newFile.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_fileToMethod() throws Exception {
-		IFolder superFolder= (IFolder)getRoot().getResource();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		IFile newFile= null;
-		try{
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= method;
-			verifyValidDestination(ref, destination);
-
-			assertTrue("source file does not exist before", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file not moved", ! file.exists());
-			
-			newFile= ((IFolder)getPackageP().getResource()).getFile(file.getName());
-			assertTrue("new file does not exist after", newFile.exists());
-		} finally{
-			performDummySearch();
-			file.delete(true, false, null);
-			cu.delete(true, null);
-		}
-	}
-
-	public void testDestination_yes_fileToRoot() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-
-		IFile newFile= null;	
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);			
-
-			assertTrue("source file does not exist before", file.exists());
-			
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			assertTrue("source file not moved", ! file.exists());
-			
-			newFile= ((IFolder)getRoot().getResource()).getFile(file.getName());
-			assertTrue("new file does not exist after", newFile.exists());
-		}finally{
-			performDummySearch();
-			newFile.delete(true, new NullProgressMonitor());
-		}
-	}		
-
-	public void testDestination_no_fileToParentProject() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFile file= superFolder.getFile("a.txt");
-		file.create(getStream("123"), true, null);
-		
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {file};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyInvalidDestination(ref, destination);			
-		}finally{
-			performDummySearch();
-			file.delete(true, new NullProgressMonitor());
-		}
-	}		
-
-	public void testDestination_yes_folderToSiblingFolder() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IFolder otherFolder= superFolder.getFolder("otherfolder");
-		otherFolder.create(true, true, null);
-		
-		IFolder newFolder= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= otherFolder;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("folder does not exist before", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("folder not moved", ! folder.exists());
-			newFolder= otherFolder.getFolder(folder.getName());
-			assertTrue("new folder does not exist after", newFolder.exists());		
-		} finally{
-			performDummySearch();
-			newFolder.delete(true, new NullProgressMonitor());			
-			otherFolder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testDestination_no_folderToParentProject() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= MySetup.getProject();
-			verifyInvalidDestination(ref, destination);						
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-		}
-	}
-
-	public void testDestination_yes_folderToSiblingRoot() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-		
-		IPackageFragment newPackage= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= getRoot();
-			verifyValidDestination(ref, destination);						
-			
-			assertTrue("folder does not exist before", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("folder not moved", ! folder.exists());
-			newPackage= getRoot().getPackageFragment(folder.getName());
-			assertTrue("new folder does not exist after", newPackage.exists());		
-		} finally{
-			performDummySearch();
-			newPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_folderToPackage() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IPackageFragment newPackage= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= getPackageP();
-			verifyValidDestination(ref, destination);						
-
-			assertTrue("folder does not exist before", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("folder not moved", ! folder.exists());
-			newPackage= getRoot().getPackageFragment(getPackageP().getElementName() + "." + folder.getName());
-			assertTrue("new package does not exist after", newPackage.exists());		
-		} finally{
-			performDummySearch();
-			if (newPackage != null && newPackage.exists())
-				newPackage.delete(true, new NullProgressMonitor());
-		}
-	}
-	
-	public void testDestination_yes_folderToFileInAnotherFolder() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IFolder otherFolder= superFolder.getFolder("otherfolder");
-		otherFolder.create(true, true, null);
-		IFile fileInAnotherFolder= otherFolder.getFile("f.tex");
-		fileInAnotherFolder.create(getStream("123"), true, null);
-
-		IFolder newFolder= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= fileInAnotherFolder;
-			verifyValidDestination(ref, destination);						
-			
-			assertTrue("folder does not exist before", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("folder not moved", ! folder.exists());
-			newFolder= otherFolder.getFolder(folder.getName());
-			assertTrue("new folder does not exist after", newFolder.exists());
-		} finally{
-			performDummySearch();
-//			folder.delete(true, new NullProgressMonitor());	
-			otherFolder.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_folderToCu() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		ICompilationUnit cu= getPackageP().createCompilationUnit("A.java", "package p;class A{void foo(){}class Inner{}}", false, new NullProgressMonitor());
-		
-		IPackageFragment newPackage= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= cu;
-			verifyValidDestination(ref, destination);						
-
-			assertTrue("folder does not exist before", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("folder not moved", ! folder.exists());
-			newPackage= getRoot().getPackageFragment(getPackageP().getElementName() + "." + folder.getName());
-			assertTrue("new package does not exist after", newPackage.exists());		
-		} finally{
-			performDummySearch();
-			if (newPackage != null && newPackage.exists())
-				newPackage.delete(true, new NullProgressMonitor());
-			cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_folderToSimpleProject() throws Exception{
-		IProject superFolder= MySetup.getProject().getProject();
-		IFolder folder= superFolder.getFolder("folder");
-		folder.create(true, true, null);
-
-		IProject simpleProject= ResourcesPlugin.getWorkspace().getRoot().getProject("mySImpleProject");
-		simpleProject.create(null);
-		simpleProject.open(null);
-		
-		IFolder newFolder= null;
-		try{
-			IJavaElement[] javaElements= {};
-			IResource[] resources= {folder};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= simpleProject;
-			verifyValidDestination(ref, destination);
-			
-			assertTrue("folder does not exist before", folder.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("folder not moved", ! folder.exists());
-			newFolder= simpleProject.getFolder(folder.getName());
-			assertTrue("new folder does not exist after", newFolder.exists());		
-		} finally{
-			performDummySearch();
-			folder.delete(true, new NullProgressMonitor());			
-			simpleProject.delete(true, true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_sourceFolderToOtherProject() throws Exception{
-		IJavaProject otherJavaProject= JavaProjectHelper.createJavaProject("other", "bin");
-		
-		IPackageFragmentRoot oldRoot= JavaProjectHelper.addSourceContainer(MySetup.getProject(), "newSrc");
-		IPackageFragmentRoot newRoot= null;
-		try {
-			IJavaElement[] javaElements= { oldRoot };
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-
-			Object destination= otherJavaProject;
-			verifyValidDestination(ref, destination);
-
-			assertTrue("folder does not exist before", oldRoot.exists());
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			assertTrue("folder not moved", ! oldRoot.exists());
-			newRoot= getSourceFolder(otherJavaProject, oldRoot.getElementName());
-			assertTrue("new folder does not exist after", newRoot.exists());		
-		} finally {
-			performDummySearch();
-			JavaProjectHelper.delete(otherJavaProject);
-		}
-	}
-
-	public void testDestination_no_methodToItself() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-			Object destination= method;
-			verifyInvalidDestination(ref, destination);
-		} finally {
-			performDummySearch();
-			if (cu != null)
-				cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_methodToOtherType() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IMethod method= cu.getType("A").getMethod("foo", new String[0]);
-			IJavaElement[] javaElements= { method };
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-			IType otherType= cu.getType("B");
-			Object destination= otherType;
-			verifyValidDestination(ref, destination);
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-
-			String expected= getFileContents(getOutputTestFileName(removeExtension(cu.getElementName())));
-			assertEqualLines("source differs", expected, cu.getSource());
-		} finally {
-			performDummySearch();
-			if (cu != null)
-				cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_fieldToOtherType() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IField field= cu.getType("A").getField("f");
-			IJavaElement[] javaElements= { field };
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-			IType otherType= cu.getType("B");
-			Object destination= otherType;
-			verifyValidDestination(ref, destination);
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			String expected= getFileContents(getOutputTestFileName(removeExtension(cu.getElementName())));
-			assertEqualLines("source differs", expected, cu.getSource());
-		} finally {
-			performDummySearch();
-			if (cu != null)
-				cu.delete(true, new NullProgressMonitor());
-		}
-	}
-
-	public void testDestination_yes_initializerToOtherType() throws Exception{
-		ICompilationUnit cu= null;
-		try {
-			cu= createCUfromTestFile(getPackageP(), "A");
-			IInitializer initializer= cu.getType("A").getInitializer(1);
-			IJavaElement[] javaElements= { initializer };
-			IResource[] resources= {};
-			MoveRefactoring ref= verifyEnabled(resources, javaElements, createReorgQueries());
-			IType otherType= cu.getType("B");
-			Object destination= otherType;
-			verifyValidDestination(ref, destination);
-			RefactoringStatus status= performRefactoring(ref);
-			assertEquals(null, status);
-			
-			String expected= getFileContents(getOutputTestFileName(removeExtension(cu.getElementName())));
-			assertEqualLines("source differs", expected, cu.getSource());
-		} finally {
-			performDummySearch();
-			if (cu != null)
-				cu.delete(true, new NullProgressMonitor());
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MultiMoveTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MultiMoveTest.java
deleted file mode 100644
index 033c42e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/MultiMoveTest.java
+++ /dev/null
@@ -1,261 +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.jdt.ui.tests.reorg;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.corext.refactoring.base.RefactoringStatus;
-import org.eclipse.jdt.internal.corext.refactoring.reorg.MoveRefactoring;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-;
-
-public class MultiMoveTest extends RefactoringTest {
-
-	private static final Class clazz= MultiMoveTest.class;
-	private static final String REFACTORING_PATH= "MultiMove/";
-
-	public MultiMoveTest(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	//---
-	private IPackageFragment createPackage(String name) throws Exception{
-		return getRoot().createPackageFragment(name, true, null);
-	}
-	
-	private ICompilationUnit createCu(IPackageFragment pack, String cuPath, String cuName) throws Exception{
-		return createCU(pack, cuName, getFileContents(getRefactoringPath() + cuPath));
-	}
-	
-	private void delete(IPackageFragment pack) throws Exception {
-		performDummySearch();
-		try {
-			if (pack != null && pack.exists())
-				pack.delete(true, null);
-		} catch(JavaModelException e) {
-			//ignore, we should keep going
-			e.printStackTrace();
-		}
-	}
-	
-	
-	//--------
-	public void test0() throws Exception{		
-		IPackageFragment packP1= null;
-		IPackageFragment packP2= null;
-		try {
-			final String p1Name= "p1";
-			final String inDir= "/in/";
-			final String outDir= "/out/";
-
-			packP1= createPackage(p1Name);
-			ICompilationUnit p1A= createCu(packP1, getName() + inDir + p1Name + "/A.java", "A.java");
-			ICompilationUnit p1B= createCu(packP1, getName() + inDir + p1Name + "/B.java", "B.java");
-
-			String p2Name= "p2";
-			packP2= createPackage(p2Name);
-			ICompilationUnit p2C= createCu(packP2, getName() + inDir + p2Name + "/C.java", "C.java");
-
-//			List elems= new ArrayList();
-//			elems.add(p1A);
-//			elems.add(p1B);
-			IResource[] resources= {};
-			IJavaElement[] javaElements= {p1A, p1B};
-			MoveRefactoring ref= MoveRefactoring.create(resources, javaElements, JavaPreferencesSettings.getCodeGenerationSettings());
-			ref.setReorgQueries(new MockReorgQueries());
-			ref.setDestination(packP2);
-			ref.setUpdateReferences(true);
-		    performDummySearch();
-			RefactoringStatus status= performRefactoring(ref);
-
-			//-- checks
-			assertEquals("status should be ok here", null, status);
-
-			assertEquals("p1 files", 0, packP1.getChildren().length);
-			assertEquals("p2 files", 3, packP2.getChildren().length);
-
-			String expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/A.java");
-			assertEqualLines("incorrect update of A", expectedSource, packP2.getCompilationUnit("A.java").getSource());
-
-			expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/B.java");
-			assertEqualLines("incorrect update of B", expectedSource, packP2.getCompilationUnit("B.java").getSource());
-
-			expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/C.java");
-			assertEqualLines("incorrect update of C", expectedSource, p2C.getSource());
-		} finally {
-			delete(packP1);
-			delete(packP2);		
-		}
-	}
-
-	
-	public void test1() throws Exception{		
-		IPackageFragment packP1= null;
-		IPackageFragment packP2= null;
-		try {
-			final String p1Name= "p1";
-			final String inDir= "/in/";
-			final String outDir= "/out/";
-
-			packP1= createPackage(p1Name);
-			ICompilationUnit p1A= createCu(packP1, getName() + inDir + p1Name + "/A.java", "A.java");
-			ICompilationUnit p1B= createCu(packP1, getName() + inDir + p1Name + "/B.java", "B.java");
-
-			String p2Name= "p2";
-			packP2= createPackage(p2Name);
-			ICompilationUnit p2C= createCu(packP2, getName() + inDir + p2Name + "/C.java", "C.java");
-
-//			List elems= new ArrayList();
-//			elems.add(p1A);
-//			elems.add(p3B);
-			IResource[] resources= {};
-			IJavaElement[] javaElements= {p1A, p1B};
-			MoveRefactoring ref= MoveRefactoring.create(resources, javaElements, JavaPreferencesSettings.getCodeGenerationSettings());
-			ref.setReorgQueries(new MockReorgQueries());
-			ref.setDestination(packP2);
-			ref.setUpdateReferences(true);
-		    performDummySearch();
-			RefactoringStatus status= performRefactoring(ref);
-
-			//-- checks
-			assertEquals("status should be ok here", null, status);
-
-			assertEquals("p1 files", 0, packP1.getChildren().length);
-			assertEquals("p2 files", 3, packP2.getChildren().length);
-
-			String expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/A.java");
-			assertEqualLines("incorrect update of A", expectedSource, packP2.getCompilationUnit("A.java").getSource());
-
-			expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/B.java");
-			assertEqualLines("incorrect update of B", expectedSource, packP2.getCompilationUnit("B.java").getSource());
-
-			expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/C.java");
-			assertEqualLines("incorrect update of C", expectedSource, p2C.getSource());
-		} finally {
-			delete(packP1);
-			delete(packP2);
-		}		
-	}
-	
-	public void test2() throws Exception{
-		IPackageFragment packP1= null;
-		IPackageFragment packP2= null;
-		try {
-			final String p1Name= "p1";
-			final String inDir= "/in/";
-			final String outDir= "/out/";
-
-			packP1= createPackage(p1Name);
-			ICompilationUnit p1A= createCu(packP1, getName() + inDir + p1Name + "/A.java", "A.java");
-			createCu(packP1, getName() + inDir + p1Name + "/B.java", "B.java");
-
-			String p2Name= "p2";
-			packP2= createPackage(p2Name);
-			ICompilationUnit p2C= createCu(packP2, getName() + inDir + p2Name + "/C.java", "C.java");
-
-//			List elems= new ArrayList();
-//			elems.add(p1A);
-			IResource[] resources= {};
-			IJavaElement[] javaElements= {p1A};
-			MoveRefactoring ref= MoveRefactoring.create(resources, javaElements, JavaPreferencesSettings.getCodeGenerationSettings());
-			ref.setReorgQueries(new MockReorgQueries());
-			ref.setDestination(packP2);
-			ref.setUpdateReferences(true);
-		    performDummySearch();
-			RefactoringStatus status= performRefactoring(ref);
-
-			//-- checks
-			assertEquals("status should be ok here", null, status);
-
-			assertEquals("p1 files", 1, packP1.getChildren().length);
-			assertEquals("p2 files", 2, packP2.getChildren().length);
-
-			String expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/A.java");
-			assertEqualLines("incorrect update of A", expectedSource, packP2.getCompilationUnit("A.java").getSource());
-
-			expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p1Name + "/B.java");
-			assertEqualLines("incorrect update of B", expectedSource, packP1.getCompilationUnit("B.java").getSource());
-
-			expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/C.java");
-			assertEqualLines("incorrect update of C", expectedSource, p2C.getSource());
-
-		} finally {
-			delete(packP1);
-			delete(packP2);	
-		}		
-	}
-
-	public void test3() throws Exception{		
-		IPackageFragment packP1= null;
-		IPackageFragment packP3= null;
-		IPackageFragment packP2= null;
-		try {
-			final String p1Name= "p1";
-			final String p3Name= "p3";
-			final String inDir= "/in/";
-			final String outDir= "/out/";
-
-			packP1= createPackage(p1Name);
-			packP3= createPackage(p3Name);
-			ICompilationUnit p1A= createCu(packP1, getName() + inDir + p1Name + "/Outer.java", "Outer.java");
-			createCu(packP3, getName() + inDir + p3Name + "/Test.java", "Test.java");
-
-			String p2Name= "p2";
-			packP2= createPackage(p2Name);
-
-//			List elems= new ArrayList();
-//			elems.add(p1A);
-			IResource[] resources= {};
-			IJavaElement[] javaElements= {p1A};
-			MoveRefactoring ref= MoveRefactoring.create(resources, javaElements, JavaPreferencesSettings.getCodeGenerationSettings());
-			ref.setReorgQueries(new MockReorgQueries());
-			ref.setDestination(packP2);
-			ref.setUpdateReferences(true);
-		    performDummySearch();
-			RefactoringStatus status= performRefactoring(ref);
-
-			//-- checks
-			assertEquals("status should be ok here", null, status);
-
-			assertEquals("p1 files", 0, packP1.getChildren().length);
-			assertEquals("p2 files", 1, packP2.getChildren().length);
-			assertEquals("p1 files", 1, packP3.getChildren().length);
-
-			String expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p2Name + "/Outer.java");
-			assertEqualLines("incorrect update of Outer", expectedSource, packP2.getCompilationUnit("Outer.java").getSource());
-
-			expectedSource= getFileContents(getRefactoringPath() + getName() + outDir + p3Name + "/Test.java");
-			assertEqualLines("incorrect update of Test", expectedSource, packP3.getCompilationUnit("Test.java").getSource());
-
-		} finally {
-			delete(packP1);
-			delete(packP2);
-			delete(packP3);		
-		}
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/PasteActionTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/PasteActionTest.java
deleted file mode 100644
index 2858804..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/PasteActionTest.java
+++ /dev/null
@@ -1,321 +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.jdt.ui.tests.reorg;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Display;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IImportContainer;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-import org.eclipse.jdt.ui.tests.refactoring.infra.MockClipboard;
-import org.eclipse.jdt.ui.tests.refactoring.infra.MockWorkbenchSite;
-
-import org.eclipse.jdt.internal.corext.refactoring.TypedSource;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.CopyToClipboardAction;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.PasteAction;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.TypedSourceTransfer;
-
-
-public class PasteActionTest extends RefactoringTest{
-
-	private Clipboard fClipboard;
-	private static final Class clazz= PasteActionTest.class;
-	private static final String REFACTORING_PATH= "Paste/";
-
-	public PasteActionTest(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-
-	protected String getRefactoringPath() {
-		return REFACTORING_PATH;
-	}
-
-	protected void setUp() throws Exception {
-		super.setUp();
-		fClipboard= new MockClipboard(Display.getDefault());
-	}
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		fClipboard.dispose();
-	}
-
-	private static Object[] merge(Object[] array1, Object[] array2) {
-		Set elements= new HashSet(array1.length + array2.length);
-		elements.addAll(Arrays.asList(array1));
-		elements.addAll(Arrays.asList(array2));
-		return elements.toArray();
-	}
-	
-	private void verifyDisabled(IResource[] copySelectedResources, IJavaElement[] copySelectedJavaElements, IResource[] pasteSelectedResources, IJavaElement[] pasteSelectedJavaElements) throws JavaModelException {
-		Object[] pasteSelection= merge(pasteSelectedResources, pasteSelectedJavaElements);
-		
-		PasteAction pasteAction= new PasteAction(new MockWorkbenchSite(pasteSelection), fClipboard);
-		CopyToClipboardAction copyToClipboardAction= new CopyToClipboardAction(new MockWorkbenchSite(merge(copySelectedResources, copySelectedJavaElements)), fClipboard, pasteAction);
-		copyToClipboardAction.setAutoRepeatOnFailure(true);
-		copyToClipboardAction.update(copyToClipboardAction.getSelection());
-		assertTrue("copy not enabled", copyToClipboardAction.isEnabled());
-		copyToClipboardAction.run();
-		
-		pasteAction.update(pasteAction.getSelection());
-		assertTrue("paste should be disabled", ! pasteAction.isEnabled());
-	}
-
-	private PasteAction verifyEnabled(IResource[] copySelectedResources, IJavaElement[] copySelectedJavaElements, IResource[] pasteSelectedResources, IJavaElement[] pasteSelectedJavaElements) throws JavaModelException {
-		PasteAction pasteAction= new PasteAction(new MockWorkbenchSite(merge(pasteSelectedResources, pasteSelectedJavaElements)), fClipboard);
-		CopyToClipboardAction copyToClipboardAction= new CopyToClipboardAction(new MockWorkbenchSite(merge(copySelectedResources, copySelectedJavaElements)), fClipboard, pasteAction);
-		copyToClipboardAction.setAutoRepeatOnFailure(true);
-		copyToClipboardAction.update(copyToClipboardAction.getSelection());
-		assertTrue("copy not enabled", copyToClipboardAction.isEnabled());
-		copyToClipboardAction.run();
-		
-		pasteAction.update(pasteAction.getSelection());
-		assertTrue("paste should be enabled", pasteAction.isEnabled());
-		return pasteAction;
-	}
-
-	public void testEnabled_javaProject() throws Exception {
-		IJavaElement[] javaElements= {MySetup.getProject()};
-		IResource[] resources= {};
-		verifyEnabled(resources, javaElements, new IResource[0], new IJavaElement[0]);
-	}
-
-	public void testEnabled_project() throws Exception {
-		IJavaElement[] javaElements= {};
-		IResource[] resources= {MySetup.getProject().getProject()};
-		verifyEnabled(resources, javaElements, new IResource[0], new IJavaElement[0]);
-	}
-
-	private void compareContents(String cuName) throws JavaModelException, IOException {
-		assertEqualLines(cuName, getFileContents(getOutputTestFileName(cuName)), getPackageP().getCompilationUnit(cuName + ".java").getSource());
-	}
-	
-	private void delete(ICompilationUnit cu) throws Exception {
-		try {
-			performDummySearch();
-			cu.delete(true, new NullProgressMonitor());
-		} catch (JavaModelException e) {
-			e.printStackTrace();
-			//ingore and keep going
-		}
-	}
-
-	public void test0() throws Exception{
-		if (true) {
-			printTestDisabledMessage("not implemented yet");
-			return;
-		}
-
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(getPackageP(), "B");
-		
-		try {
-			IType typeA= cuA.getType("A");
-			IType typeB= cuB.getType("B");
-	
-			assertTrue("A does not exist", typeA.exists());
-			assertTrue("B does not exist", typeB.exists());
-	
-			IJavaElement[] copyJavaElements= {typeA};
-			IResource[] copyResources= {};
-			IJavaElement[] pasteJavaElements= {typeB};
-			IResource[] pasteResources= {};
-			PasteAction paste= verifyEnabled(copyResources, copyJavaElements, pasteResources, pasteJavaElements);
-			paste.run((IStructuredSelection)paste.getSelection());
-			compareContents("A");
-			compareContents("B");
-		} finally{
-			delete(cuA);
-			delete(cuB);
-		}
-	}
-
-	public void test2() throws Exception{
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(getPackageP(), "B");
-		
-		try {
-			IField fieldY= cuA.getType("A").getField("y");
-			IType typeB= cuB.getType("B");
-	
-			assertTrue("y does not exist", fieldY.exists());
-			assertTrue("B does not exist", typeB.exists());
-	
-			IJavaElement[] copyJavaElements= {fieldY};
-			IResource[] copyResources= {};
-			IJavaElement[] pasteJavaElements= {typeB};
-			IResource[] pasteResources= {};
-			PasteAction paste= verifyEnabled(copyResources, copyJavaElements, pasteResources, pasteJavaElements);
-			paste.run((IStructuredSelection)paste.getSelection());
-			compareContents("A");
-			compareContents("B");
-		} finally{
-			delete(cuA);
-			delete(cuB);
-		}
-	}
-
-	public void test3() throws Exception{
-//		printTestDisabledMessage("test for bug#19007");
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		ICompilationUnit cuB= createCUfromTestFile(getPackageP(), "B");
-		
-		try {
-			IJavaElement elem0= cuA.getImport("java.lang.*");
-			IImportContainer importContainer= cuB.getImportContainer();
-	
-			assertTrue("y does not exist", elem0.exists());
-			assertTrue("B does not exist", importContainer.exists());
-	
-			IJavaElement[] copyJavaElements= {elem0};
-			IResource[] copyResources= {};
-			IJavaElement[] pasteJavaElements= {importContainer};
-			IResource[] pasteResources= {};
-			PasteAction paste= verifyEnabled(copyResources, copyJavaElements, pasteResources, pasteJavaElements);
-			paste.run((IStructuredSelection)paste.getSelection());
-			compareContents("A");
-			compareContents("B");
-		} finally{
-			delete(cuA);
-			delete(cuB);
-		}
-	}
-
-	public void test4() throws Exception{
-//		printTestDisabledMessage("test for bug 20151");
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		try {
-			IJavaElement elem0= cuA.getType("A").getMethod("f", new String[0]);
-			IMethod method= cuA.getType("A").getMethod("f1", new String[0]);
-	
-			assertTrue("y does not exist", elem0.exists());
-			assertTrue("B does not exist", method.exists());
-	
-			IJavaElement[] copyJavaElements= {elem0};
-			IResource[] copyResources= {};
-			IJavaElement[] pasteJavaElements= {method};
-			IResource[] pasteResources= {};
-			PasteAction paste= verifyEnabled(copyResources, copyJavaElements, pasteResources, pasteJavaElements);
-			paste.run((IStructuredSelection)paste.getSelection());
-			compareContents("A");
-		} finally{
-			delete(cuA);
-		}
-	}
-
-	private void setClipboardContents(TypedSource[] typedSources, int repeat) {
-		final int maxRepeat= 10;
-		try {
-			fClipboard.setContents(new Object[] {typedSources}, new Transfer[] {TypedSourceTransfer.getInstance()});
-		} catch (SWTError e) {
-			if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD || repeat >= maxRepeat)
-				throw e;
-			setClipboardContents(typedSources, repeat+1);
-		}
-	}
-	
-	private void copyAndPasteTypedSources(IJavaElement[] elemsForClipboard, IJavaElement[] pasteSelectedJavaElements, boolean pasteEnabled) throws CoreException {
-		setClipboardContents(TypedSource.createTypedSources(elemsForClipboard), 0);
-		PasteAction pasteAction= new PasteAction(new MockWorkbenchSite(pasteSelectedJavaElements), fClipboard);
-		pasteAction.update(pasteAction.getSelection());
-		assertEquals("action enablement", pasteEnabled, pasteAction.isEnabled());
-		if (pasteEnabled)
-			pasteAction.run((IStructuredSelection)pasteAction.getSelection());
-	}
-
-	public void testPastingTypedResources0() throws Exception {
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		try {
-			IJavaElement methodM= cuA.getType("A").getMethod("m", new String[0]);
-			IJavaElement[] elemsForClipboard= {methodM};
-			IJavaElement[] pasteSelectedJavaElements= {methodM};
-			boolean enabled= true;
-			copyAndPasteTypedSources(elemsForClipboard, pasteSelectedJavaElements, enabled);
-			compareContents("A");
-		} finally{
-			delete(cuA);
-		}
-	}
-
-	public void testPastingTypedResources1() throws Exception {
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		try {
-			IType typeA= cuA.getType("A");
-			IJavaElement fieldF= typeA.getField("f");
-			IJavaElement[] elemsForClipboard= {fieldF};
-			IJavaElement[] pasteSelectedJavaElements= {typeA};
-			boolean enabled= true;
-			copyAndPasteTypedSources(elemsForClipboard, pasteSelectedJavaElements, enabled);
-			compareContents("A");
-		} finally{
-			delete(cuA);
-		}
-	}
-
-	public void testPastingTypedResources2() throws Exception {
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		try {
-			IType typeA= cuA.getType("A");
-			IJavaElement fieldF= typeA.getField("f");
-			IJavaElement[] elemsForClipboard= {fieldF};
-			IJavaElement[] pasteSelectedJavaElements= {typeA};
-			boolean enabled= true;
-			copyAndPasteTypedSources(elemsForClipboard, pasteSelectedJavaElements, enabled);
-			compareContents("A");
-		} finally{
-			delete(cuA);
-		}
-	}
-
-	public void testPastingTypedResources3() throws Exception {
-		ICompilationUnit cuA= createCUfromTestFile(getPackageP(), "A");
-		try {
-			IType typeA= cuA.getType("A");
-			IJavaElement fieldF= typeA.getField("f");
-			IJavaElement fieldG= typeA.getField("g");
-			IJavaElement[] elemsForClipboard= {fieldF, fieldG};
-			IJavaElement[] pasteSelectedJavaElements= {typeA};
-			boolean enabled= true;
-			copyAndPasteTypedSources(elemsForClipboard, pasteSelectedJavaElements, enabled);
-			compareContents("A");
-		} finally{
-			delete(cuA);
-		}
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/PasteResourcesFromClipboardActionTest.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/PasteResourcesFromClipboardActionTest.java
deleted file mode 100644
index 0ecc1e9..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/reorg/PasteResourcesFromClipboardActionTest.java
+++ /dev/null
@@ -1,270 +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.jdt.ui.tests.reorg;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.swt.SWTError;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Display;
-
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.ISourceManipulation;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.ui.actions.SelectionDispatchAction;
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-import org.eclipse.jdt.ui.tests.refactoring.infra.MockClipboard;
-import org.eclipse.jdt.ui.tests.refactoring.infra.MockWorkbenchSite;
-
-import org.eclipse.jdt.internal.ui.refactoring.reorg.CopyToClipboardAction;
-import org.eclipse.jdt.internal.ui.refactoring.reorg.PasteAction;
-
-public class PasteResourcesFromClipboardActionTest extends RefactoringTest{
-
-	private static final Class clazz= PasteResourcesFromClipboardActionTest.class;
-
-	private ICompilationUnit fCuA;
-	private ICompilationUnit fCuB;
-	
-	private IPackageFragment fPackageQ;
-	private IPackageFragment fPackageQ_R;
-	private static final String CU_A_NAME= "A";
-	private static final String CU_B_NAME= "B";
-	private IFile faTxt;
-	private IJavaProject fSimpleProject;
-	private IJavaProject fAnotherProject;
-	
-	private Clipboard fClipboard;
-	
-	public PasteResourcesFromClipboardActionTest(String name) {
-		super(name);
-	}
-	
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private IFile createFile(IFolder folder, String fileName) throws Exception {
-		IFile file= folder.getFile(fileName);
-		file.create(getStream("aa"), true, null);	
-		return file;
-	}
-	
-	private static IJavaProject createProject(String name, String srcFolderName) throws Exception{
-		IJavaProject project= JavaProjectHelper.createJavaProject(name, "bin");
-		JavaProjectHelper.addRTJar(project);
-		if (srcFolderName != null)
-			JavaProjectHelper.addSourceContainer(project, srcFolderName);
-			
-		return project;	
-	}
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		fClipboard= new MockClipboard(Display.getDefault());
-		fCuA= createCU(getPackageP(), CU_A_NAME + ".java", "package p; class A{}");
-		fCuB= createCU(getPackageP(), CU_B_NAME + ".java", "package p; class B{}");
-		
-		fPackageQ= MySetup.getDefaultSourceFolder().createPackageFragment("q", true, null);
-		fPackageQ_R= MySetup.getDefaultSourceFolder().createPackageFragment("q.r", true, null);
-		
-		faTxt= createFile((IFolder)getPackageP().getUnderlyingResource(), "a.txt");
-		
-		int count= 0;
-		boolean success= false;
-		while (count < 10 && ! success){
-			success= clearClipboard();
-			count++;
-		}
-		if (! success)
-			return;
-		
-		fSimpleProject= createProject("SimpleProject", null);
-		fAnotherProject= createProject("AnotherProject", "src");
-		
-		assertTrue("A.java does not exist", fCuA.exists());
-		assertTrue("B.java does not exist", fCuB.exists());
-		assertTrue("q does not exist", fPackageQ.exists());
-		assertTrue("q.r does not exist", fPackageQ_R.exists());
-		assertTrue("a.txt does not exist", faTxt.exists());
-		assertTrue("project SP does not exist", fSimpleProject.exists());
-		assertTrue("project AP does not exist", fAnotherProject.exists());
-	}
-
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		fClipboard.dispose();
-		performDummySearch();
-		delete(fCuA);
-		delete(fCuB);
-		delete(fPackageQ_R);
-		delete(fPackageQ);
-		delete(faTxt);
-		delete(fSimpleProject);
-		delete(fAnotherProject);
-	}
-	
-	/**
-	 * @return true iff successful
-	 */
-	private boolean clearClipboard() {
-		try{
-			fClipboard.setContents(new Object[0], new Transfer[0]);
-			return true;
-		} catch (SWTError e){
-			if (e.code != DND.ERROR_CANNOT_SET_CLIPBOARD)
-				throw e;
-			return false;
-		}	
-	}
-
-	private static void delete(ISourceManipulation element) {
-		try {
-			if (element != null && ((IJavaElement)element).exists())
-				element.delete(false, null);
-		} catch(JavaModelException e) {
-			//ignore, we must keep going
-		}		
-	}
-	private static void delete(IFile element) {
-		try {
-			if (element != null && element.exists())
-				element.delete(true, false, null);
-		} catch(CoreException e) {
-			//ignore, we must keep going
-		}
-	}
-	
-	private static void delete(IJavaProject project){
-		try {
-			if (project != null && project.exists()){
-				project.setRawClasspath(new IClasspathEntry[0], project.getProject().getFullPath(), null);
-				project.getProject().delete(true, true, null);
-			}	
-		} catch(CoreException e) {
-			//ignore, we must keep going
-		}
-	}
-
-	private void doCopy(Object[] copySelection) {
-		if (copySelection == null)
-			return; 
-			
-		SelectionDispatchAction pasteAction= new PasteAction(new MockWorkbenchSite(copySelection), fClipboard);	
-		CopyToClipboardAction copyAction= new CopyToClipboardAction(new MockWorkbenchSite(copySelection), fClipboard, pasteAction);
-		copyAction.update(copyAction.getSelection());
-		copyAction.setAutoRepeatOnFailure(true);
-		assertTrue("copy not enabled", copyAction.isEnabled());
-		copyAction.run();
-	}
-
-	private void checkEnabled(Object[] copySelection, Object[] pasteSelection) {
-		doCopy(copySelection);		
-		SelectionDispatchAction pasteAction= new PasteAction(new MockWorkbenchSite(pasteSelection), fClipboard);
-		pasteAction.update(pasteAction.getSelection());
-		assertTrue("paste incorrectly disabled", pasteAction.isEnabled());
-	}
-	
-	private void checkDisabled(Object[] copySelection, Object[] pasteSelection) {
-		doCopy(copySelection);		
-		SelectionDispatchAction pasteAction= new PasteAction(new MockWorkbenchSite(pasteSelection), fClipboard);
-		pasteAction.update(pasteAction.getSelection());
-		assertTrue("paste incorrectly enabled", ! pasteAction.isEnabled());
-	}
-
-	//--- tests --------
-
-	public void testProject() throws Exception{
-//		System.out.println("PasteResourcesFromClipboardActionTest#testProject - disabled due to failure under Motif");
-//		if (true)
-//			return;
-		checkEnabled(new Object[]{MySetup.getProject()}, new Object[]{getPackageP()});
-		checkEnabled(new Object[]{MySetup.getProject()}, new Object[]{fPackageQ});
-		checkEnabled(new Object[]{MySetup.getProject()}, new Object[]{fSimpleProject});
-		checkEnabled(new Object[]{MySetup.getProject()}, new Object[]{fAnotherProject});
-		checkEnabled(new Object[]{MySetup.getProject()}, new Object[]{MySetup.getProject()});
-		checkEnabled(new Object[]{MySetup.getProject()}, new Object[]{getRoot()});
-		checkEnabled(new Object[]{MySetup.getProject()}, new Object[]{fCuA});
-		checkEnabled(new Object[]{MySetup.getProject()}, new Object[]{faTxt});
-	}
-	
-	public void testCu() throws Exception{
-		checkEnabled(new Object[]{fCuA}, new Object[]{getPackageP()});
-		checkEnabled(new Object[]{fCuA}, new Object[]{fPackageQ});
-		checkEnabled(new Object[]{fCuA}, new Object[]{fSimpleProject});
-		checkEnabled(new Object[]{fCuA}, new Object[]{fAnotherProject});
-		checkEnabled(new Object[]{fCuA}, new Object[]{MySetup.getProject()});
-		checkEnabled(new Object[]{fCuA}, new Object[]{getRoot()});
-		checkEnabled(new Object[]{fCuA}, new Object[]{fCuA});		
-		checkEnabled(new Object[]{fCuA}, new Object[]{faTxt});
-	}
-	
-	public void testFile() throws Exception{
-		checkEnabled(new Object[]{faTxt}, new Object[]{getPackageP()});
-		checkEnabled(new Object[]{faTxt}, new Object[]{fPackageQ});
-		checkEnabled(new Object[]{faTxt}, new Object[]{fSimpleProject});
-		checkEnabled(new Object[]{faTxt}, new Object[]{fAnotherProject});
-		checkEnabled(new Object[]{faTxt}, new Object[]{MySetup.getProject()});
-		checkEnabled(new Object[]{faTxt}, new Object[]{getRoot()});
-		checkEnabled(new Object[]{faTxt}, new Object[]{fCuA});
-		checkEnabled(new Object[]{faTxt}, new Object[]{faTxt});
-	}
-	
-	public void testPackage() throws Exception{
-//		System.out.println("PasteResourcesFromClipboardActionTest#testPackage - disabled due to failure under Motif");
-//		if (true)
-//			return;
-//		checkEnabled(new Object[]{getPackageP()}, new Object[]{fSimpleProject});
-		checkEnabled(new Object[]{getPackageP()}, new Object[]{getRoot()});
-		checkEnabled(new Object[]{getPackageP()}, new Object[]{getPackageP()});
-		checkEnabled(new Object[]{getPackageP()}, new Object[]{fPackageQ});
-		
-		checkDisabled(new Object[]{getPackageP()}, new Object[]{fAnotherProject});
-		checkDisabled(new Object[]{getPackageP()}, new Object[]{MySetup.getProject()});		
-		checkDisabled(new Object[]{getPackageP()}, new Object[]{fCuA});
-		checkDisabled(new Object[]{getPackageP()}, new Object[]{faTxt});
-	}
-	
-	public void testRoot() throws Exception {		
-//		System.out.println("PasteResourcesFromClipboardActionTest#testRoot - disabled due to failure under Motif");
-//		if (true)
-//			return;
-		checkEnabled(new Object[]{getRoot()}, new Object[]{fAnotherProject});
-		checkEnabled(new Object[]{getRoot()}, new Object[]{MySetup.getProject()});		
-		
-		checkDisabled(new Object[]{getRoot()}, new Object[]{getRoot()});
-//		checkDisabled(new Object[]{getRoot()}, new Object[]{fSimpleProject});
-		checkDisabled(new Object[]{getRoot()}, new Object[]{getPackageP()});
-		checkDisabled(new Object[]{getRoot()}, new Object[]{fPackageQ});
-		checkDisabled(new Object[]{getRoot()}, new Object[]{fCuA});
-		checkDisabled(new Object[]{getRoot()}, new Object[]{faTxt});
-	}
-	
-
-	public void testEnabled2() throws Exception{
-		checkEnabled(new Object[]{fCuA, fCuB}, new Object[]{getPackageP()});
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/typeconstraints/TypeConstraintTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/typeconstraints/TypeConstraintTests.java
deleted file mode 100644
index 299cb25..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/typeconstraints/TypeConstraintTests.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2002 International Business Machines Corp. and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v0.5 
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v05.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.jdt.ui.tests.typeconstraints;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-
-import org.eclipse.jdt.ui.tests.refactoring.MySetup;
-import org.eclipse.jdt.ui.tests.refactoring.RefactoringTest;
-
-import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ASTCreator;
-import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ConstraintCollector;
-import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.ITypeConstraint;
-
-public class TypeConstraintTests extends RefactoringTest {
-
-	private static final Class clazz= TypeConstraintTests.class;
-	private static final String PATH= "TypeConstraints/";
-
-	public TypeConstraintTests(String name) {
-		super(name);
-	}
-
-	protected String getRefactoringPath() {
-		return PATH;
-	}
-
-	public static Test suite() {
-		return new MySetup(new TestSuite(clazz));
-	}
-	
-	private String getSimpleTestFileName(){
-		return "A_" + getName() + ".java"; 
-	}
-	
-	private String getTestFileName(){
-		return TEST_PATH_PREFIX + getRefactoringPath() + getSimpleTestFileName();
-	}
-
-	private ICompilationUnit createCUfromTestFile(IPackageFragment pack) throws Exception {
-		return createCU(pack, getSimpleTestFileName(), getFileContents(getTestFileName()));
-	}
-
-	private CompilationUnit getCuNode() throws Exception {
-		ICompilationUnit cu= createCUfromTestFile(getPackageP());
-		return ASTCreator.createAST(cu, null);
-	}
-
-	private void numberHelper(int number) throws Exception {
-		CompilationUnit cuNode= getCuNode();
-		ConstraintCollector collector= new ConstraintCollector();
-		cuNode.accept(collector);
-		ITypeConstraint[] constraints= collector.getConstraints();
-		assertEquals(Arrays.asList(constraints).toString(), number, constraints.length);
-	}
-
-	public void testNumber0() throws Exception{
-		numberHelper(2);
-	}
-
-	public void testNumber1() throws Exception{
-		numberHelper(3);
-	}
-
-	public void testNumber2() throws Exception{
-		numberHelper(10);
-	}
-
-	private static List allToStrings(Object[] elements) {
-		String[] strings= new String[elements.length];
-		for (int i= 0; i < elements.length; i++) {
-			strings[i]= elements[i].toString();
-		}
-		return new ArrayList(Arrays.asList(strings));//want to be able to remove stuff from it
-	}
-	
-	private void testConstraints(String[] constraintStrings) throws Exception{
-		CompilationUnit cuNode= getCuNode();
-		ConstraintCollector collector= new ConstraintCollector();
-		cuNode.accept(collector);
-		ITypeConstraint[] constraints= collector.getConstraints();
-		
-		List externals= allToStrings(constraints);
-		assertEquals("length", constraintStrings.length, constraints.length);
-		for (int i= 0; i < constraintStrings.length; i++) {
-			assertTrue("missing constraint:" + constraintStrings[i], externals.remove(constraintStrings[i]));
-		}
-	}
-	
-	public void testConstraints0() throws Exception{
-		String[] strings= {"[null] <= [a0]", "[a0] <= [a1]", "[a0] =^= A", "[a1] =^= A", "Decl(A:f()) =^= p.A"};
-		testConstraints(strings);
-	}
-
-	public void testConstraints1() throws Exception{
-		String[] strings= {"[null] <= [a0]", "[a0] == [a1]", "[a0] =^= A", "[a1] =^= A", "Decl(A:a0) =^= p.A", "Decl(A:a1) =^= p.A"};
-		testConstraints(strings);
-	}
-
-	public void testConstraints2() throws Exception{
-		String[] strings= {"[null] <= [a0]", "[(A)a0] =^= A", "[(A)a0] <= [a1]", "[a0] <= [(A)a0] or [(A)a0] <= [a0]", "[a0] =^= A", "[a1] =^= A", "Decl(A:f()) =^= p.A"};
-		testConstraints(strings);
-	}
-
-	public void testConstraints3() throws Exception{
-		String[] strings= {"[null] <= [a]", "[null] <= [b]", "[a] == [b]", "[a] =^= A", "[b] =^= A", "Decl(A:f()) =^= p.A"};
-		testConstraints(strings);
-	}
-
-	public void testConstraints4() throws Exception{
-		String[] strings= {"[as0] =^= A[]", "[a0] <= A", "[{a0,}] <= [as0]", "Decl(A:f()) =^= p.A", "[null] <= [a0]", "[a0] =^= A"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints5() throws Exception{
-		String[] strings= {"[as0] =^= A[]", "Decl(A:f()) =^= p.A", "[a0] <= A", "[a0] =^= A", "[null] <= [a0]", "[new A[]={a0,}] <= [as0]"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints6() throws Exception{
-		String[] strings= {"Decl(A:f()) =^= p.A", "Decl(A:A(A)) =^= p.A", "[new A(a0)] =^= p.A", "[a0] <= [Parameter(0,A:A(A))]", "[a1] =^= A", "[a] =^= A", "[a0] =^= A", "[null] <= [a0]", "[new A(a0)] <= [a1]", "[Parameter(0,A:A(A))] =^= [a]"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints7() throws Exception{
-		String[] strings= {"Decl(A:A()) =^= p.A", "Decl(A:A(A)) =^= p.A", "[null] <= [Parameter(0,A:A(A))]", "[Parameter(0,A:A(A))] =^= [a]", "[a] =^= A"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints8() throws Exception{
-		String[] strings= {"Decl(A:x) =^= p.A", "Decl(A:f()) =^= p.A", "[aField.x] =^= java.lang.Object", "Decl(A:aField) =^= p.A", "[this] <= [aField.x]", "[aField] =^= A", "[x] =^= Object", "[this] =^= p.A", "[aField] <= Decl(A:x)"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints9() throws Exception{
-		String[] strings= {"Decl(A:f()) =^= p.A", "[a] =^= A", "[x] =^= boolean", "[a instanceof A] <= [x]", "[null] <= [a]", "[a] <= A or A <= [a]"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints10() throws Exception{
-		String[] strings= {"[null] <= [A:f1()]_returnType", "Decl(A:f1()) =^= p.A", "[A:f1()]_returnType =^= A[]"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints11() throws Exception{
-		String[] strings= {"[null] <= [A:f(A, Object)]_returnType", "[Parameter(1,B:f(A, Object))] =^= [a4]", 
-							"[B:f(A, Object)]_returnType =^= A", "Decl(B:f(A, Object)) < Decl(A:f(A, Object))",
-							"[Parameter(1,A:f(A, Object))] == [Parameter(1,B:f(A, Object))]", 
-							"[Parameter(0,A:f(A, Object))] == [Parameter(0,B:f(A, Object))]", 
-							"[A:f(A, Object)]_returnType == [B:f(A, Object)]_returnType", 
-							"[Parameter(0,B:f(A, Object))] =^= [a3]", 
-							"[Parameter(0,A:f(A, Object))] =^= [a0]", "Decl(A:f(A, Object)) =^= p.A", 
-							"[null] <= [B:f(A, Object)]_returnType", "[Parameter(1,A:f(A, Object))] =^= [a1]", 
-							"[A:f(A, Object)]_returnType =^= A", "Decl(B:f(A, Object)) =^= p.B",
-							"[a3] =^= A", "[a0] =^= A", "[a1] =^= Object", "[a4] =^= Object"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints12() throws Exception{
-		String[] strings= { "Decl(B:f(A, Object)) =^= p.B", "[Parameter(1,B:f(A, Object))] =^= [a4]", "[B:f(A, Object)]_returnType =^= A", "[null] <= [B:f(A, Object)]_returnType", "[A:f(A, Object)]_returnType =^= A", "[Parameter(1,A:f(A, Object))] =^= [a1]", "Decl(A:f(A, Object)) =^= p.A", "[Parameter(0,B:f(A, Object))] =^= [a3]", "[null] <= [A:f(A, Object)]_returnType", "[Parameter(0,A:f(A, Object))] =^= [a0]", "[a3] =^= A", "[a0] =^= A", "[a1] =^= Object", "[a4] =^= Object" };
-		testConstraints(strings);
-	}	
-
-	public void testConstraints13() throws Exception{
-		String[] strings= {"Decl(B:f(A, Object)) =^= p.B", "[Parameter(1,B:f(A, Object))] =^= [a4]", "[B:f(A, Object)]_returnType =^= A", "[null] <= [B:f(A, Object)]_returnType", "[A:f(A, Object)]_returnType =^= A", "[Parameter(1,A:f(A, Object))] =^= [a1]", "Decl(A:f(A, Object)) =^= p.A", "[Parameter(0,B:f(A, Object))] =^= [a3]", "[null] <= [A:f(A, Object)]_returnType", "[Parameter(0,A:f(A, Object))] =^= [a0]", "[a3] =^= A", "[a0] =^= A", "[a1] =^= Object", "[a4] =^= Object"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints14() throws Exception{
-		String[] strings= {"[A:f(A)]_returnType == [B:f(A)]_returnType", "[Parameter(0,A:f(A))] == [Parameter(0,B:f(A))]", "[B:f(A)]_returnType =^= A", "Decl(B:f(A)) < Decl(A:f(A))", "[A:f(A)]_returnType =^= A", "Decl(B:f(A)) < Decl(I:f(A))", "[null] <= [A:f(A)]_returnType", "[Parameter(0,A:f(A))] =^= [a0]", "[I:f(A)]_returnType =^= A", "Decl(A:f(A)) =^= p.A", "[ax] =^= B", "[Parameter(0,B:f(A))] =^= [a3]", "[null] <= [B:f(A)]_returnType", "[a3] <= [Parameter(0,B:f(A))]", "[ax.f(a3)] =^= [B:f(A)]_returnType", "[ax] <= Decl(I:f(A)) or [ax] <= Decl(A:f(A))", "Decl(B:f(A)) =^= p.B", "[I:f(A)]_returnType == [B:f(A)]_returnType", "[Parameter(0,I:f(A))] == [Parameter(0,B:f(A))]", "[null] <= [ax]", "[Parameter(0,I:f(A))] =^= [ai]", "Decl(I:f(A)) =^= p.I", "[a3] =^= A", "[a0] =^= A", "[ai] =^= A"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints15() throws Exception{
-		String[] strings= {"[Parameter(0,A:f(A))] =^= [a0]", "[I:f(A)]_returnType == [B:f(A)]_returnType", "[Parameter(0,I:f(A))] == [Parameter(0,B:f(A))]", "[null] <= [A:f(A)]_returnType", "[A:f(A)]_returnType == [B:f(A)]_returnType", "[Parameter(0,A:f(A))] == [Parameter(0,B:f(A))]", "Decl(B:f(A)) < Decl(A:f(A))", "[super.f(a3)] =^= [A:f(A)]_returnType", "Decl(A:f(A)) =^= p.A", "[null] <= [B:f(A)]_returnType", "[Parameter(0,I:f(A))] =^= [ai]", "[Parameter(0,B:f(A))] =^= [a3]", "[A:f(A)]_returnType =^= A", "Decl(B:f(A)) =^= p.B", "Decl(I:f(A)) =^= p.I", "Decl(B:f(A)) < Decl(I:f(A))", "[a3] <= [Parameter(0,A:f(A))]", "[I:f(A)]_returnType =^= A", "[B:f(A)]_returnType =^= A", "[a3] =^= A", "[a0] =^= A", "[ai] =^= A"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints16() throws Exception{
-		String[] strings= {"Decl(A:aField) =^= p.A", "Decl(A:f()) =^= p.A", "[this] =^= p.A", "[this] =^= p.A", "[this] <= [aTemp]", "[this] <= [aField]", "[this] <= [a]", "[a] =^= A", "[aField] =^= A", "[aTemp] =^= A", "[this] =^= p.A"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints17() throws Exception{
-		String[] strings= {"Decl(A:f()) =^= p.A", "[null] <= [a]", "[A:f()]_returnType =^= A", "[a] =^= A", "[a] <= [A:f()]_returnType"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints18() throws Exception{
-		String[] strings= {"[Parameter(0,B:B(A))] =^= [a1]", "Decl(B:B(A)) =^= p.B", "[Parameter(0,A:A(A))] =^= [a0]", "Decl(A:A(A)) =^= p.A", "[a1] <= [Parameter(0,A:A(A))]", "[a1] =^= A", "[a0] =^= A"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints19() throws Exception{
-		String[] strings= {"[super.aField] =^= p.A", "[a] =^= A", "Decl(B:f()) =^= p.B", "[a] <= [super.aField]", "[null] <= [a]", "Decl(A:aField) =^= p.A", "[aField] =^= A"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints20() throws Exception{
-		String[] strings= {"Decl(B:aField) =^= p.B", "Decl(A:aField) =^= p.A", "Decl(B:aField) < Decl(A:aField)", "[aField] =^= A", "[aField] =^= A"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints21() throws Exception{
-		String[] strings= {"Decl(A:f2(A[])) =^= p.A", "[Parameter(0,A:f2(A[]))] =^= [as]", "[as] =^= A[]"};
-		testConstraints(strings);
-	}	
-
-	public void testConstraints22() throws Exception{
-		String[] strings= {"[null] <= [A:f(A, Object)]_returnType", "[Parameter(0,A:f(A, Object))] =^= [a0]", "[Parameter(1,A:f(A, Object))] =^= [a1]", "[A:f(A, Object)]_returnType =^= A", "Decl(A:f(A, Object)) =^= p.A", "[a1] =^= Object", "[a0] =^= A"};
-		testConstraints(strings);
-	}	
-	
-	public void testConstraints23() throws Exception{
-		//test for bug 41271 NullPointerException dumping set of ITypeConstraints to System.out 
-		String[] strings= {"[args.length] =^= int", "[0] <= [i]", "[i] =^= int", "[args] <= Decl((array type):length)", "[args] =^= String[]", "[Parameter(0,Test1:main(String[]))] =^= [args]", "Decl(Test1:main(String[])) =^= p.Test1"};
-		testConstraints(strings);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A.java
deleted file mode 100644
index d6ce477..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.ui.tests.xml;
-
-
-public class A {
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A_TypeExtender.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A_TypeExtender.java
deleted file mode 100644
index c28be75..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A_TypeExtender.java
+++ /dev/null
@@ -1,34 +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.jdt.ui.tests.xml;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jdt.internal.corext.Assert;
-import org.eclipse.jdt.internal.corext.refactoring.participants.xml.TypeExtender;
-
-
-public class A_TypeExtender extends TypeExtender {
-
-	public Object invoke(Object receiver, String method, Object[] args) throws CoreException {
-		if ("simple".equals(method)) {
-			return "simple";
-		} else if ("overridden".equals(method)) {
-			return "A";
-		} else if ("ordering".equals(method)) {
-			return "A";
-		} else if ("chainOrdering".equals(method)) {
-			return "A";
-		}
-		Assert.isTrue(false);
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A_TypeExtender2.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A_TypeExtender2.java
deleted file mode 100644
index c9bb241..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/A_TypeExtender2.java
+++ /dev/null
@@ -1,31 +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.jdt.ui.tests.xml;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jdt.internal.corext.Assert;
-import org.eclipse.jdt.internal.corext.refactoring.participants.xml.TypeExtender;
-
-
-public class A_TypeExtender2 extends TypeExtender {
-
-	public Object invoke(Object receiver, String method, Object[] args) throws CoreException {
-		if ("chaining".equals(method)) {
-			return "A2";
-		} else if ("chainOrdering".equals(method)) {
-			return "A2";
-		}
-		Assert.isTrue(false);
-		return null;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/B.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/B.java
deleted file mode 100644
index c79448e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/B.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.ui.tests.xml;
-
-
-public class B extends A implements I {
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/B_TypeExtender.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/B_TypeExtender.java
deleted file mode 100644
index 6463a4a..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/B_TypeExtender.java
+++ /dev/null
@@ -1,28 +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.jdt.ui.tests.xml;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jdt.internal.corext.Assert;
-import org.eclipse.jdt.internal.corext.refactoring.participants.xml.TypeExtender;
-
-
-public class B_TypeExtender extends TypeExtender {
-
-	public Object invoke(Object receiver, String method, Object[] args) throws CoreException {
-		if ("overridden".equals(method)) {
-			return "B";
-		}
-		Assert.isTrue(false);
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/I.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/I.java
deleted file mode 100644
index 1c13d0e..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/I.java
+++ /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
- *******************************************************************************/
-package org.eclipse.jdt.ui.tests.xml;
-
-
-public interface I {
-
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/I_TypeExtender.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/I_TypeExtender.java
deleted file mode 100644
index 678fee0..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/I_TypeExtender.java
+++ /dev/null
@@ -1,28 +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.jdt.ui.tests.xml;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jdt.internal.corext.Assert;
-import org.eclipse.jdt.internal.corext.refactoring.participants.xml.TypeExtender;
-
-
-public class I_TypeExtender extends TypeExtender {
-
-	public Object invoke(Object receiver, String method, Object[] args) throws CoreException {
-		if ("ordering".equals(method)) {
-			return "I";
-		}
-		Assert.isTrue(false);
-		return null;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/TypeExtenderTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/TypeExtenderTests.java
deleted file mode 100644
index bee28bd..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/xml/TypeExtenderTests.java
+++ /dev/null
@@ -1,78 +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.jdt.ui.tests.xml;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jdt.internal.corext.refactoring.participants.xml.Method;
-import org.eclipse.jdt.internal.corext.refactoring.participants.xml.TypeExtension;
-
-public class TypeExtenderTests extends TestCase {
-	
-	private A a;
-	private B b;
-	private I i;
-
-	protected void setUp() throws Exception {
-		a= new A();
-		b= new B();
-		i= b;
-	}
-	
-	public void testSimple() throws Exception {
-		assertTrue(call(a, "simple", null).equals("simple"));
-	}
-	
-	public void testInherited() throws Exception {
-		assertTrue(call(b, "simple", null).equals("simple"));
-		assertTrue(call(i, "simple", null).equals("simple"));
-	}
-	
-	public void testUnknown() throws Exception {
-		try {
-			call(a, "unknown", null);
-		} catch (CoreException e) {
-			return;
-		}
-		assertTrue(false);
-	}
-	
-	public void testOverridden() throws Exception {
-		assertTrue(call(a, "overridden", null).equals("A"));
-		assertTrue(call(b, "overridden", null).equals("B"));
-		A b_as_a= b;
-		assertTrue(call(b_as_a, "overridden", null).equals("B"));
-		assertTrue(call(i, "overridden", null).equals("B"));
-	}
-	
-	public void testOdering() throws Exception {
-		assertTrue(call(b, "ordering", null).equals("A"));
-		I other= new I() {};
-		assertTrue(call(other, "ordering", null).equals("I"));
-	}
-	
-	public void testChaining() throws Exception {
-		assertTrue(call(a, "chaining", null).equals("A2"));
-	}
-	
-	// This test is questionable. It depends on if core runtime can
-	// guaratee any ordering in the plug-in registry.
-	public void testChainOrdering() throws Exception {
-		assertTrue(call(a, "chainOrdering", null).equals("A"));
-	}
-	
-	private Object call(Object receiver, String method, Object[] args) throws CoreException {
-		Method m= TypeExtension.getMethod(receiver, method);
-		return m.invoke(receiver, args);
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test.xml b/org.eclipse.jdt.ui.tests.refactoring/test.xml
deleted file mode 100644
index ccd6fca..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/test.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="testsuite" default="run" basedir=".">
-  <!-- The property ${eclipse-home} should be passed into this script -->
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}\..\.."/>
-
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="plugin-name" value="org.eclipse.jdt.ui.tests.refactoring"/>
-  <property name="library-file"
-            value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-
-  <!-- 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/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="refactoring-folder" 
-              value="${eclipse-home}/refactoring_folder"/>
-    <delete dir="${refactoring-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${refactoring-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" 
-                value="org.eclipse.jdt.ui.tests.all.AllAllTests"/>
-    </ant>
-  </target>
-
-  <!-- This target holds code to cleanup the testing environment after -->
-  <!-- after all of the tests have been run. You can use this target to -->
-  <!-- delete temporary files that have been created. -->
-  <target name="cleanup">
-  </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="${plugin-name}.xml"/>
-    </ant>
-  </target>
-
-</project>
diff --git a/org.eclipse.jdt.ui.tests/.classpath b/org.eclipse.jdt.ui.tests/.classpath
deleted file mode 100644
index a7432c6..0000000
--- a/org.eclipse.jdt.ui.tests/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="examples"/>
-	<classpathentry kind="src" path="test plugin"/>
-	<classpathentry kind="src" path="ui"/>
-	<classpathentry kind="src" path="chkpii"/>
-	<classpathentry kind="src" path="leaks"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.ui.tests/.cvsignore b/org.eclipse.jdt.ui.tests/.cvsignore
deleted file mode 100644
index c5e82d7..0000000
--- a/org.eclipse.jdt.ui.tests/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/.plugins-path b/org.eclipse.jdt.ui.tests/.plugins-path
deleted file mode 100644
index 36f1716..0000000
--- a/org.eclipse.jdt.ui.tests/.plugins-path
+++ /dev/null
@@ -1 +0,0 @@
-platformPath = file:/d:/workspaces/eclipse-sh1/plugins/
diff --git a/org.eclipse.jdt.ui.tests/.project b/org.eclipse.jdt.ui.tests/.project
deleted file mode 100644
index 3561a60..0000000
--- a/org.eclipse.jdt.ui.tests/.project
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt.ui.tests</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.core.runtime.compatibility</project>
-		<project>org.eclipse.jdt.core</project>
-		<project>org.eclipse.jdt.junit.eclipse</project>
-		<project>org.eclipse.jdt.launching</project>
-		<project>org.eclipse.jdt.ui</project>
-		<project>org.eclipse.jface.text</project>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.ui.editors</project>
-		<project>org.eclipse.ui.ide</project>
-		<project>org.eclipse.ui.views</project>
-		<project>org.eclipse.ui.workbench.texteditor</project>
-		<project>org.junit</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.jdt.ui.tests/about.html b/org.eclipse.jdt.ui.tests/about.html
deleted file mode 100644
index fad1e4a..0000000
--- a/org.eclipse.jdt.ui.tests/about.html
+++ /dev/null
@@ -1,44 +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>Third Party Content</h3>
-
-<p>The Content includes items that may be have been sourced from third parties as follows:</p>
-
-<p><b>JUnit 3.7</b></p>
-<p>The plug-in is based on software developed by JUnit.org.  Your use of JUnit 3.7 in both source and binary code
-form contained in the plug-in is subject to the terms and conditions of the IBM Public License 1.0 which is available at
-<a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>.
-The source code is located in testresources/junit37-noUI-src.zip.</p>
-
-<p>i) IBM effectively disclaims 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;</p>
-<p>ii) IBM effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;</p>
-<p>iii) IBM states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party.</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/org.eclipse.jdt.ui.tests/activation/org/eclipse/jdt/ui/tests/activation/JavaActivationTest.java b/org.eclipse.jdt.ui.tests/activation/org/eclipse/jdt/ui/tests/activation/JavaActivationTest.java
deleted file mode 100644
index d4804c5..0000000
--- a/org.eclipse.jdt.ui.tests/activation/org/eclipse/jdt/ui/tests/activation/JavaActivationTest.java
+++ /dev/null
@@ -1,109 +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.jdt.ui.tests.activation;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.TestCase;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-public class JavaActivationTest extends TestCase {
-	
-	private IJavaProject project;
-
-	protected void setUp() throws Exception {
-		project= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-	}
-
-	protected void tearDown() throws Exception {
-	    getPage().closeAllEditors(false);
-		JavaProjectHelper.delete(project);
-	}
-
-	private IWorkbenchPage getPage() {
-	    IWorkbench workbench= PlatformUI.getWorkbench();
-	    return workbench.getActiveWorkbenchWindow().getActivePage();
-	}
-	
-	private ICompilationUnit createTestCU() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(project, "src");
-		IPackageFragment pack= sourceFolder.createPackageFragment("pack0", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("public class List1 {\n}\n");
-		return pack.createCompilationUnit("List1.java", buf.toString(), false, null);
-	}
-	
-	public void testOpenJavaEditor() throws Exception {
-		String[] expectedActivations= {
-		        // activated since running tests
-		        "org.eclipse.jdt.junit.runtime", 
-		        "org.eclipse.pde.junit.runtime",
-		        "org.eclipse.jdt.ui.tests", 
-		        "org.junit", 
-		        
-		        // expected activations
-		        "org.osgi.framework",
-		        "org.eclipse.osgi.services",
-		        "org.eclipse.osgi.util",
-		        "org.eclipse.core.runtime",
-		        "org.eclipse.update.configurator",
-		        "org.eclipse.compare",
-		        "org.eclipse.core.filebuffers",
-		        "org.eclipse.core.resources",
-		        "org.eclipse.core.runtime.compatibility",
-		        "org.eclipse.debug.core",
-		        "org.eclipse.debug.ui", // ???
-		        "org.eclipse.help",
-		        "org.eclipse.jdt.core",
-		        "org.eclipse.jdt.ui",
-		        "org.eclipse.jface",
-		        "org.eclipse.jface.text",
-		        "org.eclipse.swt",
-		        "org.eclipse.team.core",
-		        "org.eclipse.text",
-		        "org.eclipse.ui",
-		        "org.eclipse.ui.editors",
-		        "org.eclipse.ui.externaltools", // ???
-		        "org.eclipse.ui.ide",
-		        "org.eclipse.ui.views",
-		        "org.eclipse.ui.workbench",
-		        "org.eclipse.ui.workbench.texteditor",
-		        "org.eclipse.update.core",
-		        "org.eclipse.update.scheduler" // ???
-		};
-		ICompilationUnit unit= createTestCU();
-		EditorUtility.openInEditor(unit);
-		IPluginDescriptor[] descriptors = Platform.getPluginRegistry().getPluginDescriptors();
-		
-		Set set= new HashSet();
-		set.addAll(Arrays.asList(expectedActivations));
-		
-		for (int i = 0; i < descriptors.length; i++) {
-		    IPluginDescriptor descriptor= descriptors[i];
-		    String uniqueIdentifier= descriptor.getUniqueIdentifier();
-		    if (descriptor.isPluginActivated())
-		        assertTrue ("plugin should not be activated: "+uniqueIdentifier,  set.contains(uniqueIdentifier)) ;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/build.properties b/org.eclipse.jdt.ui.tests/build.properties
deleted file mode 100644
index 82a886c..0000000
--- a/org.eclipse.jdt.ui.tests/build.properties
+++ /dev/null
@@ -1,18 +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.xml,\
-               test.xml,\
-               about.html,\
-               testresources/,\
-               *.jar
-source.javauitests.jar = examples/,\
-                         test plugin/,\
-                         ui/
diff --git a/org.eclipse.jdt.ui.tests/chkpii/ignoreErrorsUnix.txt b/org.eclipse.jdt.ui.tests/chkpii/ignoreErrorsUnix.txt
deleted file mode 100644
index e69de29..0000000
--- a/org.eclipse.jdt.ui.tests/chkpii/ignoreErrorsUnix.txt
+++ /dev/null
diff --git a/org.eclipse.jdt.ui.tests/chkpii/ignoreErrorsWindows.txt b/org.eclipse.jdt.ui.tests/chkpii/ignoreErrorsWindows.txt
deleted file mode 100644
index 3a88561..0000000
--- a/org.eclipse.jdt.ui.tests/chkpii/ignoreErrorsWindows.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-127
-128
diff --git a/org.eclipse.jdt.ui.tests/chkpii/ignoreFiles.txt b/org.eclipse.jdt.ui.tests/chkpii/ignoreFiles.txt
deleted file mode 100644
index 0699c45..0000000
--- a/org.eclipse.jdt.ui.tests/chkpii/ignoreFiles.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-feature.properties
-feature.xml
-cpl*.html
-license.html
-notice.html
-buildnotes*.htm
-buildnotes*.html
-*/bin/*
-*/plugin-export/*
-*/.metadata/*
-*/doc_zip/*
-*/scripts/*
-com.oti.zrh.contextids/*
-com.oti.zrh.eclipse.tools/*
-com.oti.zrh.eclipse.doc.tools-feature/*
-com.oti.zrh.eclipse.tools-updateSite/*
-Eclipse*JDT*Builds/*
-org.eclipse.jdt.launching/*
-org.eclipse.jdt.launching.j9/*
-org.eclipse.jdt.ui.tests.refactoring/resources/*
-platform-search-home/*
-platform-text-home/*
-jdt-ui-home/*
-org.eclipse.jdt.ui/core*extension\org/eclipse/jdt/internal/corext/template/default-codetemplates.xml
-org.eclipse.platform.doc.isv/buildDoc.xml
-org.eclipse.jdt.doc.isv/buildDoc.xml
-org.eclipse.jdt.core/*
-org.eclipse.tomcat/conf/*
-org.eclipse.ui/plugin.xml
-org.eclipse.platform.source/*
-org.apache.ant/*
-org.eclipse.help.webapp/*
-org.eclipse.pde.ui/*
-org.eclipse.pde.build/*
-org.eclipse.debug.core/*
-org.eclipse.jdt.debug.ui/*
-org.eclipse.jdt.debug/*
-org.eclipse.debug.ui/*
-org.eclipse.releng.tools/*
-org.eclipse.ui.console/*
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ChkpiiTests.java b/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ChkpiiTests.java
deleted file mode 100644
index 522f267..0000000
--- a/org.eclipse.jdt.ui.tests/chkpii/org/eclipse/jdt/ui/tests/chkpii/ChkpiiTests.java
+++ /dev/null
@@ -1,284 +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.jdt.ui.tests.chkpii;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.boot.BootLoader;
-
-public class ChkpiiTests extends TestCase {
-	
-	private String fLogDirectoryName;
-	
-	private static final int HTML= 0;
-	private static final int PROPERTIES= 1;
-	private static final int XML= 2;
-	
-	/**
-	 * Checks if the given log file contains errors.
-	 * 
-	 * @param logFilePath the path of the chkpii log file
-	 * @return <code>true</code> if there are errors in the log file
-	 */
-	private boolean hasErrors(String logFilePath) {
-		BufferedReader aReader= null;
-		
-		try {
-			aReader= new BufferedReader(new InputStreamReader(new FileInputStream(logFilePath)));
-			String aLine= aReader.readLine();
-			while (aLine != null) {
-				int aNumber= parseLine(aLine);
-				if (aNumber > 0)
-					return true;
-
-				aLine= aReader.readLine();
-			}
-		} catch (FileNotFoundException e) {
-			System.out.println("Could not open log file: " + logFilePath); //$NON-NLS-1$
-			return true;
-		} catch (IOException e) {
-			System.out.println("Error reading log file: " + logFilePath); //$NON-NLS-1$
-			return true;
-		} finally {
-			if (aReader != null) {
-				try {
-					aReader.close();
-				} catch (IOException e) {
-					return true;
-				}
-			}
-		}
-		
-		return false;
-	}
-	
-	public void testChkpii() {
-			
-		boolean testExecuted= testChkpii(HTML);
-		assertTrue("Could not run chkpii test. See console for details.", testExecuted); //$NON-NLS-1$
-		boolean result1= !hasErrors(getOutputFile(HTML));
-
-		testChkpii(XML);
-		assertTrue("Could not run chkpii test. See console for details.", testExecuted); //$NON-NLS-1$
-		boolean result2= !hasErrors(getOutputFile(XML));
-		
-		testChkpii(PROPERTIES);
-		assertTrue("Could not run chkpii test. See console for details.", testExecuted); //$NON-NLS-1$
-		boolean result3= !hasErrors(getOutputFile(PROPERTIES));
-
-		assertTrue("CHKPII warnings or errors in files. See " + fLogDirectoryName + " for details.", (result1 && result2 && result3)); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-		
-	private boolean testChkpii(int type) {
-		Runtime aRuntime= Runtime.getRuntime();
-		String chkpiiString= getChkpiiString(type);
-		BufferedReader aBufferedReader= null;
-		StringBuffer consoleLog= new StringBuffer();
-		try {
-			Process aProcess= aRuntime.exec(chkpiiString);
-			aBufferedReader= new BufferedReader(new InputStreamReader(aProcess.getInputStream()));
-			String line= aBufferedReader.readLine();
-			while (line != null) {
-				consoleLog.append(line);
-				consoleLog.append('\n');
-				line= aBufferedReader.readLine();
-			}
-			aProcess.waitFor();
-		} catch (IOException e) {
-			e.printStackTrace();
-			return false;
-		} catch (InterruptedException e) {
-			return false;
-		} finally {
-			if (aBufferedReader != null)
-				try {
-					aBufferedReader.close();
-				} catch (IOException ex) {
-				}
-		}
-		if (!new File(getOutputFile(type)).exists()) {
-			System.out.println(consoleLog.toString());
-			System.out.flush();
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Method getChkpiiString.
-	 * 
-	 * @param HTML
-	 * @return String
-	 */
-	private String getChkpiiString(int type) {
-		return getExec() + " " + getFilesToTest(type) + " -E -O " + getOutputFile(type) + " -XM @" + getExcludeErrors() + " -X " + getExcludeFile () + " -S"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-	}
-
-
-	private String getUserDirectory() {
-		return System.getProperty("user.dir") + File.separator; //$NON-NLS-1$
-	}
-
-	/**
-	 * Method getFilesToTest.
-	 * 
-	 * @param HTML
-	 * @return String
-	 */
-	private String getFilesToTest(int type) {
-			
-		String sniffFolder=	getUserDirectory() + ".." + File.separator; //$NON-NLS-1$
-
-		String aString= sniffFolder;
-			
-		switch (type) {
-			case HTML :
-				return aString + "*.htm*"; //$NON-NLS-1$
-			case PROPERTIES :
-				return aString + "*.properties"; //$NON-NLS-1$
-							
-			case XML : 
-				return aString + "*.xml"; //$NON-NLS-1$
-			
-			default :
-				return aString + "*.*"; //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Method getExcludeFiles.
-	 * 
-	 * @return String
-	 */
-	private String getExcludeFile() {
-		String aString= getUserDirectory() + "chkpii" + File.separator + "ignoreFiles.txt";  //$NON-NLS-1$//$NON-NLS-2$
-		return new File(aString).getPath();
-	}
-	
-	/**
-	 * Returns the output file path.
-	 * 
-	 * @param type the file type
-	 * @return the string with the output file path
-	 */
-	private String getOutputFile(int type) {
-
-		switch (type) {
-
-			case HTML :
-				return fLogDirectoryName + File.separator + "html.txt"; //$NON-NLS-1$
-
-			case PROPERTIES :
-				return fLogDirectoryName + File.separator + "properties.txt"; //$NON-NLS-1$
-		
-			case XML : 
-				return fLogDirectoryName + File.separator + "xml.txt"; //$NON-NLS-1$
-
-			default :
-				return fLogDirectoryName + File.separator + "other.txt"; //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Method getExec.
-	 * 
-	 * @return String
-	 */
-	private String getExec() {
-		return new File("chkpii.exe").getPath(); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Method getExcludeErrors.
-	 */
-	private String getExcludeErrors() {
-		
-		String fileName;
-		
-		if (BootLoader.getOS().equals(BootLoader.OS_WIN32))
-			fileName= "ignoreErrorsWindows.txt"; //$NON-NLS-1$
-		else
-			fileName= "ignoreErrorsUnix.txt"; //$NON-NLS-1$
-		
-		String aString= getUserDirectory() + "chkpii" + File.separator + fileName; //$NON-NLS-1$
-		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"); //$NON-NLS-1$
-		
-//		if (index == -1) {
-//			index= aLine.indexOf("Files Contain Warning"); //$NON-NLS-1$
-//		}
-		
-		if (index == -1) {
-			index= aLine.indexOf("Files Could Not Be Processed"); //$NON-NLS-1$
-		}
-		
-		if (index == -1) {
-			return index;
-		}
-		
-		String aString= aLine.substring(0, index).trim();
-		return Integer.parseInt(aString);
-	}
-	
-	/**
-	 * Constructor for EmptyDirectoriesTest.
-	 * @param arg0
-	 */
-	public ChkpiiTests(String arg0) {
-		super(arg0);
-	}
-
-	/*
-	 * @see TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		fLogDirectoryName= getUserDirectory() + ".." + File.separator + "chkpiiResults" + File.separator; //$NON-NLS-1$ //$NON-NLS-2$
-		try {
-			fLogDirectoryName= new File(fLogDirectoryName).getCanonicalPath();
-		} catch (IOException e) {
-			e.printStackTrace();
-			fLogDirectoryName= new File(fLogDirectoryName).getPath();
-		}
-
-		new File(fLogDirectoryName).mkdirs();
-
-		new File(getOutputFile(PROPERTIES)).delete();
-		new File(getOutputFile(HTML)).delete();
-		new File(getOutputFile(XML)).delete();
-		
-	}
-
-	/*
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		fLogDirectoryName= null;		
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/ASTChildConstantsGenerator.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/ASTChildConstantsGenerator.java
deleted file mode 100644
index ea8059b..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/ASTChildConstantsGenerator.java
+++ /dev/null
@@ -1,702 +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.jdt.ui.examples;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.core.ToolFactory;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.ASTVisitor;
-
-/**
- *
- */
-public class ASTChildConstantsGenerator extends TestCase {
-	
-	private static final String LIST= "java.util.List";
-	
-	public static TypeFilter fgListFilter= new NodeTypeFilter(List.class);
-	public static TypeFilter fgASTFilter= new NodeTypeFilter(ASTNode.class);
-	public static TypeFilter fgListAndASTFilter=  new PrimitiveTypeFilter(true);
-	public static TypeFilter fgPrimitiveFilter= new PrimitiveTypeFilter(false);
-	public static TypeFilter fgNoFilter= new TypeFilter();
-	
-	public static class TypeFilter {
-		public boolean accept(Class returnType) {
-			return true;
-		}
-	}
-	
-	public static class NodeTypeFilter extends TypeFilter {
-		private Class fClass;
-
-		public NodeTypeFilter(Class cl) {
-			fClass= cl;
-		}
-		
-		public boolean accept(Class returnType) {
-			return fClass.isAssignableFrom(returnType);
-		}
-	}
-	
-	public static class PrimitiveTypeFilter extends TypeFilter {
-
-		private boolean fInvert;
-
-		public PrimitiveTypeFilter(boolean b) {
-			fInvert= b;
-		}
-		
-		public boolean accept(Class returnType) {
-			return fInvert ^ (!LIST.equals(returnType.getName()) && !ASTNode.class.isAssignableFrom(returnType));
-		}
-	}	
-	
-	
-	public class ClassNameComparer implements Comparator {
-
-		private Collator fCollator= Collator.getInstance();
-		
-		public int compare(Object o1, Object o2) {
-			String name1= ((Class)o1).getName();
-			String name2= ((Class)o2).getName();		
-			return fCollator.compare(name1, name2);
-		}
-
-	}
-	
-	public class MethodNameComparer implements Comparator {
-
-		private Collator fCollator= Collator.getInstance();
-		
-		public int compare(Object o1, Object o2) {
-			String name1= ((Method)o1).getName();
-			String name2= ((Method)o2).getName();		
-			return fCollator.compare(name1, name2);
-		}
-
-	}
-	
-	public class MethodTypeComparer implements Comparator {
-
-		private Collator fCollator= Collator.getInstance();
-		
-		public int compare(Object o1, Object o2) {
-			Method m1= (Method)o1;
-			Method m2= (Method)o2;
-			boolean isList1= LIST.equals(m1.getReturnType().getName());
-			boolean isList2= LIST.equals(m2.getReturnType().getName());
-			if (isList1 && !isList2) {
-				return 1;
-			} else if (!isList1 && isList2) {
-				return -1;
-			}
-			String name1= m1.getName();
-			String name2= m2.getName();		
-			return fCollator.compare(name1, name2);
-		}
-
-	}	
-	
-	private static final Class THIS= ASTChildConstantsGenerator.class;
-
-	private static HashSet fgPropertyIgnoreList;
-	
-	static {
-		fgPropertyIgnoreList= new HashSet();
-		fgPropertyIgnoreList.add("setProperty");
-		fgPropertyIgnoreList.add("setParent");
-		fgPropertyIgnoreList.add("setFlags");
-		fgPropertyIgnoreList.add("setLeadingComment");
-	}
-	
-
-	public ASTChildConstantsGenerator(String name) {
-		super(name);
-		
-
-		
-	}
-
-	public static Test allTests() {
-		return new TestSuite(THIS);
-	}
-
-	public static Test suite() {
-		if (false) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTChildConstantsGenerator("createGeneratedCU"));
-			return suite;
-		}	
-	}
-
-	protected void setUp() throws Exception {
-	}
-
-
-	protected void tearDown() throws Exception {
-	}
-	
-	
-	public void createGeneratedCU() throws Exception {
-		
-		Class[] astClases= getASTClasses();
-		Arrays.sort(astClases, new ClassNameComparer());
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package org.eclipse.jdt.internal.corext.dom;\n\n");
-		buf.append("import java.util.List;");
-		buf.append("import org.eclipse.jdt.core.dom.*;\n\n");
-		buf.append("public class ASTNodeConstants {\n");
-		
-		createPropertyList(astClases, buf);
-		createPropertyValidator(astClases, buf);
-		createIsListTest(astClases, buf);
-		createIsAttributeTest(astClases, buf);
-		createListAccessor(astClases, buf);
-		createGetNodeChild(astClases, buf);
-		createGetPropertyOfNode(astClases, buf);
-		createGetNodeChildProperties(astClases, buf);
-		createGetChildPropertyName(astClases, buf);
-		
-		buf.append("}");
-		
-		String code= buf.toString();
-		
-		Hashtable options= JavaCore.getOptions();
-		options.put(JavaCore.FORMATTER_LINE_SPLIT, "999");
-		
-		// new formatter
-		//TextEdit edit= ToolFactory.createCodeFormatter(options).format(CodeFormatter.K_COMPILATION_UNIT, code, 0, code.length(), 0, String.valueOf('\n'));
-		//Document doc= new Document(code);
-		//edit.apply(doc, 0);
-		//String res= doc.get();
-		
-		// old formatter
-		String res= ToolFactory.createDefaultCodeFormatter(options).format(code, 0, null, String.valueOf('\n'));
-		System.out.print(res);
-	}
-	
-	public void createPropertyList(Class[] astClases, StringBuffer buf) throws Exception {
-		HashMap properties= getPropertyList(astClases);
-		
-		Object[] objects= properties.keySet().toArray();
-		Arrays.sort(objects, Collator.getInstance());
-		for (int i= 0; i < objects.length; i++) {
-			String curr= (String) objects[i];
-			
-			buf.append("/**\n");
-			buf.append(" * Property for nodes of type\n");
-			List parents= (List) properties.get(curr);
-			Collections.sort(parents, new ClassNameComparer());
-			int lastParent= parents.size() - 1;
-			for (int k= 0; k <= lastParent; k++) {
-				Class parent= (Class) parents.get(k);
-				buf.append(" * <code>" + Signature.getSimpleName(parent.getName()) + "</code>");
-				if (k != lastParent) {
-					buf.append(",\n");
-				} else {
-					buf.append(".\n");
-				}
-			}
-			buf.append(" */\n");
-			buf.append("public static final int " + curr + "= " + String.valueOf(i + 1) + ";\n\n");
-		}
-	}
-
-	public void createPropertyValidator(Class[] astClases, StringBuffer buf) throws Exception {
-		HashMap classes= createClassList(astClases);
-		
-		buf.append("\n/**");	
-		buf.append("\n *Returns <code>true</code> if a node has the given property.");
-		buf.append("\n */\n");
-		buf.append("public static boolean hasChildProperty(ASTNode node, int property) {");	
-		buf.append("switch (node.getNodeType()) {");	
-		
-		Object[] objects= classes.keySet().toArray();
-		Arrays.sort(objects, new ClassNameComparer());
-		for (int i= 0; i < objects.length; i++) {
-			Class curr= (Class) objects[i];
-			Object[] properties= ((List) classes.get(curr)).toArray();
-			Arrays.sort(properties, Collator.getInstance());
-			
-			int nProperties= properties.length;
-			if (nProperties != 0) {
-				String name= Signature.getSimpleName(curr.getName());
-				buf.append("case ASTNode." + toConstantName(name) + ":");
-				if (nProperties == 1) {
-					buf.append("return property == " +properties[0] + ";");
-				} else if (nProperties == 2) {
-					buf.append("return (property == " +properties[0] + ") || (property == " +properties[1] + ");");
-				} else if (nProperties == 3) {
-					buf.append("return (property == " +properties[0] + ") || (property == " +properties[1] + ") || (property == " +properties[2] + ");");
-				} else {
-					buf.append("switch (property) {");
-					for (int k= 0; k < nProperties; k++) {
-						buf.append("case " + properties[k] + ":");
-					}
-					buf.append("return true;");
-					buf.append("}");
-					buf.append("return false;");
-				}				
-			}
-		}
-		buf.append("}");	
-		buf.append("return false;");
-		buf.append("}\n\n");
-	}
-	
-	public void createIsListTest(Class[] astClases, StringBuffer buf) throws Exception {
-		
-		HashSet listProperties= new HashSet();
-		HashSet otherProperties= new HashSet();
-				
-		for (int i= 0; i < astClases.length; i++) {
-			Class cl= astClases[i];
-			Method[] properties= getProperties(cl);
-			for (int k= 0; k < properties.length; k++) {
-				Method curr= properties[k];
-				Class ret= curr.getReturnType();
-
-				String name= toConstantName(getPropertyName(curr));
-				if (!LIST.equals(ret.getName())) {
-					otherProperties.add(name);
-					if (listProperties.contains(name)) {
-						System.err.println("Property is list and non-list: " + name);
-					}
-					if (!fgASTFilter.accept(ret) && !fgPrimitiveFilter.accept(ret)) {
-						System.err.println("Property has unknown return type: " + ret.getName());
-					}
-				} else {
-					if (otherProperties.contains(name)) {
-						System.err.println("Property is list and non-list: " + name);
-					} else {
-						listProperties.add(name);
-					}
-				}
-			}
-		}
-
-		String[] lists= (String[]) listProperties.toArray(new String[listProperties.size()]);
-		Arrays.sort(lists, Collator.getInstance());
-		
-		buf.append("\n/**");	
-		buf.append("\n  * Returns <code>true</code> if property of a node is a list property.");
-		buf.append("\n */\n");
-		buf.append("public static boolean isListProperty(int property) {");	
-		buf.append("switch (property) {");	
-	
-		for (int i= 0; i < lists.length; i++) {
-			buf.append("case " + lists[i] + ":");
-		}
-		buf.append("return true;");
-		buf.append("}");	
-		buf.append("return false;");
-		buf.append("}\n\n");
-	}
-	
-	public void createIsAttributeTest(Class[] astClases, StringBuffer buf) throws Exception {
-		
-		HashSet otherProperties= new HashSet();
-		HashSet attribProperties= new HashSet();
-		
-		for (int i= 0; i < astClases.length; i++) {
-			Class cl= astClases[i];
-			Method[] properties= getProperties(cl);
-			for (int k= 0; k < properties.length; k++) {
-				Method curr= properties[k];
-				Class ret= curr.getReturnType();
-
-				String name= toConstantName(getPropertyName(curr));
-				if (fgPrimitiveFilter.accept(ret)) {
-					attribProperties.add(name);
-					if (otherProperties.contains(name)) {
-						System.err.println("Property is attribute and non-attribute: " + name);
-					}
-				} else {
-					if (attribProperties.contains(name)) {
-						System.err.println("Property is attribute and non-attribute: " + name);
-					} else {
-						otherProperties.add(name);
-					}
-				}
-			}
-		}
-
-		String[] lists= (String[]) attribProperties.toArray(new String[attribProperties.size()]);
-		Arrays.sort(lists, Collator.getInstance());
-		
-		buf.append("\n/**");	
-		buf.append("\n  * Returns <code>true</code> if property of a node is an attribute property (Not a List and not an ASTNode).");
-		buf.append("\n */\n");
-		buf.append("public static boolean isAttributeProperty(int property) {");	
-		buf.append("switch (property) {");	
-		
-		for (int i= 0; i < lists.length; i++) {
-			buf.append("case " + lists[i] + ":");
-		}
-		buf.append("return true;");
-		buf.append("}");	
-		buf.append("return false;");
-		buf.append("}\n\n");
-	}	
-	
-	
-	public void createListAccessor(Class[] astClases, StringBuffer buf) throws Exception {
-		
-		buf.append("\n/**");	
-		buf.append("\n * Gets a property in a list.");
-		buf.append("\n */\n");
-		buf.append("public static ASTNode getNodeChild(ASTNode node, int property, int index) {");	
-		buf.append("if (!isListProperty(property)) {");
-		buf.append("throw new IllegalArgumentException();");
-		buf.append("}");
-		buf.append("return (ASTNode) ((List) getNodeChild(node, property)).get(index);");
-		buf.append("}\n\n");
-		
-	}
-	
-	
-
-	
-	public void createGetNodeChild(Class[] astClases, StringBuffer buf) throws Exception {
-
-
-		buf.append("\n/**");	
-		buf.append("\n * Gets a ASTNode child by the property id. Booleans and integer attributes are returned boxed.");
-		buf.append("\n */\n");
-		buf.append("public static Object getNodeChild(ASTNode node, int property) {");	
-		buf.append("switch (node.getNodeType()) {");	
-
-		for (int i= 0; i < astClases.length; i++) {
-			Class curr= astClases[i];
-			Method[] properties= getProperties(curr, fgNoFilter);
-			
-			int nProperties= properties.length;
-			if (nProperties != 0) {
-				String className= Signature.getSimpleName(curr.getName());
-				buf.append("case ASTNode." + toConstantName(className) + ":");
-
-				if (nProperties == 1) {
-					String name= getPropertyName(properties[0]);
-	
-					buf.append("if (property == " + toConstantName(name) + ") {");
-					appendWrapped(buf, className, properties[0]);		
-					buf.append("}");
-					buf.append("break;");
-				} else {
-					Arrays.sort(properties, new MethodNameComparer());
-					
-					buf.append("switch (property) {");
-					for (int k= 0; k < nProperties; k++) {
-						
-						Method meth= properties[k];
-						String name= getPropertyName(meth);
-						buf.append("case " + toConstantName(name) + ":");
-						appendWrapped(buf, className, meth);		
-					}
-					buf.append("}");
-					buf.append("break;");
-				}				
-			}
-		}
-		buf.append("}");	
-		buf.append("throw new IllegalArgumentException();");
-		buf.append("}\n\n");
-	}
-	
-	
-	
-	
-	private void appendWrapped(StringBuffer buf, String className, Method meth) {
-		buf.append("return ");
-		String val= "((" + className + ") node)." + meth.getName() + "()";
-		
-		String retType= meth.getReturnType().getName();
-		if ("int".equals(retType)) {
-			buf.append("new Integer(");
-			buf.append(val);
-			buf.append(")");
-		} else if ("boolean".equals(retType)){
-			buf.append("new Boolean(");
-			buf.append(val);
-			buf.append(")");
-		} else {
-			buf.append(val);
-		}
-		buf.append(";");
-	}
-
-	public void createGetPropertyOfNode(Class[] astClases, StringBuffer buf) throws Exception {
-
-		buf.append("\n/**");	
-		buf.append("\n * Gets the child property a node is located at its parent.");
-		buf.append("\n */\n");
-		buf.append("public static int getPropertyOfNode(ASTNode node) {");
-		buf.append("ASTNode parent=node.getParent();");
-		buf.append("if (parent == null) {");
-		buf.append("throw new IllegalArgumentException();");
-		buf.append("}");
-		
-		buf.append("switch (parent.getNodeType()) {");
-
-		MethodTypeComparer comparer= new MethodTypeComparer();
-		
-		for (int i= 0; i < astClases.length; i++) {
-			Class curr= astClases[i];
-			Method[] properties= getProperties(curr, fgListAndASTFilter);
-			
-			int nProperties= properties.length;
-			if (nProperties != 0) {
-				String className= Signature.getSimpleName(curr.getName());
-				buf.append("case ASTNode." + toConstantName(className) + ":");
-				String varName= "((" + className + ") parent)";
-				if (nProperties > 2) {
-					varName= toVariableName(className);
-					buf.append(className);
-					buf.append(" ");
-					buf.append(varName);
-					buf.append("=(");
-					buf.append(className);
-					buf.append(")parent;");
-				}
-				Arrays.sort(properties, comparer);
-				for (int k= 0; k < properties.length; k++) {
-					Method meth= properties[k];
-					if (k != properties.length - 1) {
-						buf.append("if (").append(varName).append(".");
-						buf.append(meth.getName());
-						if (LIST.equals(meth.getReturnType().getName())) {
-							buf.append("().contains(node))"); 
-						} else {
-							buf.append("() == node)"); 
-						}
-					}
-					buf.append("return ");
-					buf.append(toConstantName(getPropertyName(meth)));
-					buf.append(";");
-				}
-			}
-		}
-		buf.append("}");	
-		buf.append("throw new IllegalArgumentException();");
-		buf.append("}\n\n");
-	}
-	
-	public void createGetNodeChildProperties(Class[] astClases, StringBuffer buf) throws Exception {
-
-		buf.append("\n/**");	
-		buf.append("\n * Returns the properties of all children.");
-		buf.append("\n */\n");
-		buf.append("public static int[] getNodeChildProperties(ASTNode node) {");
-		
-		buf.append("switch (node.getNodeType()) {");
-		
-		for (int i= 0; i < astClases.length; i++) {
-			Class curr= astClases[i];
-			Method[] properties= getProperties(curr, fgNoFilter);
-			
-			int nProperties= properties.length;
-			if (nProperties != 0) {
-				String className= Signature.getSimpleName(curr.getName());
-				buf.append("case ASTNode." + toConstantName(className) + ":");
-				buf.append("return new int[] {");
-				for (int k= 0; k < properties.length; k++) {
-					if (k > 0) {
-						buf.append(",");
-					}
-					buf.append(toConstantName(getPropertyName(properties[k])));
-				}
-				buf.append("};");
-			}
-		}
-		buf.append("}");	
-		buf.append("return new int[0];");
-		buf.append("}\n\n");
-	}
-	
-	private void createGetChildPropertyName(Class[] astClases, StringBuffer buf) {
-		HashSet result= new HashSet();
-		for (int i= 0; i < astClases.length; i++) {
-			Class cl= astClases[i];
-			Method[] properties= getProperties(cl);
-			for (int k= 0; k < properties.length; k++) {
-				Method curr= properties[k];
-				String name= getPropertyName(curr);
-				result.add(name);
-			}
-		}
-		Object[] properties= result.toArray();
-		Arrays.sort(properties, Collator.getInstance());
-		
-		buf.append("\n/**");	
-		buf.append("\n * Returns the name of a property.");
-		buf.append("\n */\n");
-		buf.append("public static String getPropertyName(int property) {");
-		
-		buf.append("switch (property) {");
-		
-		for (int i= 0; i < properties.length; i++) {
-			String curr= toConstantName((String) properties[i]);
-			
-			buf.append("case " + curr + ":");
-			buf.append("return ").append('"').append(curr).append('"').append("; //$NON-NLS-1$\n");
-		}
-		buf.append("}");	
-		buf.append("throw new IllegalArgumentException();");
-		buf.append("}\n\n");
-	}
-	
-	
-	private HashMap getPropertyList(Class[] astClases) {
-		HashMap result= new HashMap();
-		for (int i= 0; i < astClases.length; i++) {
-			Class cl= astClases[i];
-			Method[] properties= getProperties(cl);
-			for (int k= 0; k < properties.length; k++) {
-				Method curr= properties[k];
-				String name= getPropertyName(curr);
-				addToListMap(result, toConstantName(name), cl);
-			}
-		}
-		return result;
-	}
-	
-	private HashMap createClassList(Class[] astClases) {
-		HashMap result= new HashMap();
-		for (int i= 0; i < astClases.length; i++) {
-			Class cl= astClases[i];
-			Method[] properties= getProperties(cl);
-			for (int k= 0; k < properties.length; k++) {
-				Method curr= properties[k];
-				String name= getPropertyName(curr);
-				addToListMap(result, cl, toConstantName(name));
-			}
-		}
-		return result;
-	}	
-	
-	private static String getPropertyName(Method curr) {
-		String name= curr.getName();
-		if (name.startsWith("get")) {
-			return name.substring(3);
-		} else if (name.startsWith("is")) {
-			return name;
-		}
-		return name;
-	}
-	
-	
-	private void addToListMap(HashMap properties, Object key, Object value) {
-		ArrayList list= (ArrayList) properties.get(key);
-		if (list == null) {
-			list= new ArrayList(3);
-			properties.put(key, list);
-		}
-		list.add(value);
-	}
-	
-
-	private static Class[] getASTClasses() {
-		ArrayList list= new ArrayList();
-		Class class1= ASTVisitor.class;
-		Method[] methods= class1.getMethods();
-		for (int i= 0; i < methods.length; i++) {
-			Method curr= methods[i];
-			if ("visit".equals(curr.getName())) {
-				Class param= curr.getParameterTypes()[0];
-				list.add(param);
-			}
-		}
-		return (Class[]) list.toArray(new Class[list.size()]);
-	}
-		
-	private static Method[] getProperties(Class param) {
-		return getProperties(param, fgNoFilter);
-	}
-	
-	private static Method[] getProperties(Class param, TypeFilter filter) {
-		ArrayList res= new ArrayList();
-		Method[] methods= param.getMethods();
-		for (int i= 0; i < methods.length; i++) {
-			Method curr= methods[i];
-			int modifiers= curr.getModifiers();
-			if ((modifiers & (Modifier.STATIC | Modifier.PUBLIC)) == Modifier.PUBLIC) {
-				String name= curr.getName();
-				if (!fgPropertyIgnoreList.contains(name)) {
-					Class returnType= curr.getReturnType();
-					if (returnType.isArray()) {
-						continue;
-					}
-					
-					if (LIST.equals(returnType.getName())) {
-						if (filter.accept(returnType) ) {
-							res.add(curr);
-						}
-					} else if (name.startsWith("set")) {
-						Method getter= findGetter(methods, name.substring(3));
-						if (getter != null && filter.accept(getter.getReturnType())) {
-							res.add(getter);
-						}
-					}
-				}
-			}
-		}
-		return (Method[]) res.toArray(new Method[res.size()]);
-	}
-	
-	private static Method findGetter(Method[] methods, String string) {	
-		String s1= "get" + string;
-		String s2= "is" + string;
-		for (int i= 0; i < methods.length; i++) {
-			String name= methods[i].getName();
-			if (s1.equals(name) || s2.equals(name)) {
-				return methods[i];
-			}
-		}
-		return null;
-	}
-
-	private static String toConstantName(String string) {
-		StringBuffer buf= new StringBuffer();
-		for (int i= 0; i < string.length(); i++) {
-			char ch= string.charAt(i);
-			if (i != 0 && Character.isUpperCase(ch)) {
-				buf.append('_');
-			}
-			buf.append(Character.toUpperCase(ch));
-		}
-		return buf.toString();
-	}
-	
-	private static String toVariableName(String string) {
-		return Character.toLowerCase(string.charAt(0)) + string.substring(1);
-	}
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/AddTestMarkersAction.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/AddTestMarkersAction.java
deleted file mode 100644
index fd7f5b1..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/AddTestMarkersAction.java
+++ /dev/null
@@ -1,106 +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.jdt.ui.examples;
-
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.ui.IActionDelegate;
-import org.eclipse.ui.texteditor.MarkerUtilities;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.ToolFactory;
-import org.eclipse.jdt.core.compiler.IScanner;
-import org.eclipse.jdt.core.compiler.ITerminalSymbols;
-
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-
-public class AddTestMarkersAction extends Action implements IActionDelegate {
-
-	private ICompilationUnit fCompilationUnit;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		try {
-			EditorUtility.openInEditor(fCompilationUnit);
-			
-			ICompilationUnit cu= JavaModelUtil.toWorkingCopy(fCompilationUnit);
-			IScanner scanner= ToolFactory.createScanner(true, false, false, true);
-			scanner.setSource(cu.getSource().toCharArray());
-			
-			int count= 0;
-			int tok;
-			do {
-				tok= scanner.getNextToken();
-				if (isComment(tok)) {
-					int start= scanner.getCurrentTokenStartPosition();
-					int end= scanner.getCurrentTokenEndPosition() + 1;
-					int line= scanner.getLineNumber(start);
-					createMarker(cu, line, start, end - start);
-					count++;
-				}
-			} while (tok != ITerminalSymbols.TokenNameEOF);
-			
-			MessageDialog.openInformation(null, "Test Markers", count + " markers added");
-		} catch (Exception e) {
-			JavaTestPlugin.log(e);
-		}
-		
-	}
-
-	public static boolean isComment(int token) {
-		return token == ITerminalSymbols.TokenNameCOMMENT_BLOCK || token == ITerminalSymbols.TokenNameCOMMENT_JAVADOC 
-			|| token == ITerminalSymbols.TokenNameCOMMENT_LINE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		fCompilationUnit= null;
-		if (selection instanceof IStructuredSelection) {
-			Object object= ((IStructuredSelection) selection).getFirstElement();
-			if (object instanceof ICompilationUnit) {
-				fCompilationUnit= (ICompilationUnit) object;
-				
-			}
-		}
-	}
-	
-	
-	private void createMarker(ICompilationUnit cu, int line, int offset, int len) throws CoreException {
-		ICompilationUnit original= JavaModelUtil.toOriginal(cu);
-
-		HashMap map= new HashMap();
-		map.put(IMarker.LOCATION, cu.getElementName());
-		map.put(IMarker.MESSAGE, "Test marker");
-		map.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));
-		map.put(IMarker.LINE_NUMBER, new Integer(line));
-		map.put(IMarker.CHAR_START, new Integer(offset));
-		map.put(IMarker.CHAR_END, new Integer(offset + len));
-	
-		MarkerUtilities.createMarker(original.getResource(), map, "org.eclipse.jdt.ui.tests.testmarker");
-	}	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/CheckBoxExample.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/CheckBoxExample.java
deleted file mode 100644
index 24b5916..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/CheckBoxExample.java
+++ /dev/null
@@ -1,125 +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.jdt.ui.examples;
-
-
-import java.util.List;
-import java.util.Random;
-
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.viewers.LabelProvider;
-
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.CheckedListDialogField;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField;
-
-
-public class CheckBoxExample {
-	private Shell fShell;
-	
-	public CheckBoxExample() {
-	}
-	
-	public CheckBoxExample close () {
-		if ((fShell != null) && (!fShell.isDisposed ())) fShell.dispose ();
-		fShell= null;
-		return this;
-	}
-	
-	public CheckBoxExample open () {
-		fShell= new Shell ();
-		fShell.setText("Message Dialog Example");
-		fShell.setLayout(new GridLayout());
-		
-		Adapter adapter= new Adapter();
-
-
-		
-		String[] addButtons= new String[] { 
-			/* 0 */ "Add1", 
-			/* 1 */ "Check 0", 
-			/* 2 */ "Print", 
-			/* 3 */ null, 
-			/* 4 */ "Check All", 
-			/* 5 */ "Uncheck All", 
-			/* 6 */ null, 
-			/* 7 */ "Remove"
-		};
-		CheckedListDialogField list= new CheckedListDialogField(adapter, addButtons, new LabelProvider());
-		list.setCheckAllButtonIndex(4);
-		list.setUncheckAllButtonIndex(5);
-		list.setRemoveButtonIndex(7);
-		list.setLabelText("List: ");
-				
-		LayoutUtil.doDefaultLayout(fShell, new DialogField[] { list }, false);
-		
-		fShell.setSize(400,500);
-		fShell.open ();
-		return this;
-	}
-	
-	private static Random fgRandom= new Random();
-	
-	private class Adapter implements IStringButtonAdapter, IDialogFieldListener, IListAdapter {
-		
-		// -------- IStringButtonAdapter
-		public void changeControlPressed(DialogField field) {
-		}		
-				
-		// -------- IListAdapter
-		public void customButtonPressed(ListDialogField field, int index) {
-			if (field instanceof CheckedListDialogField) {
-				CheckedListDialogField list= (CheckedListDialogField)field;
-				if (index == 0) {
-					list.addElement("element-" + (fgRandom.nextInt() % 1000));
-				} else if (index == 2) {
-					System.out.println("---- printing all");
-					List checked= list.getCheckedElements();
-					for (int i= 0; i < checked.size(); i++) {
-						System.out.println(checked.get(i).toString());
-					}
-				} else {
-					list.setChecked(list.getElement(0), true);
-				}	
-			}
-		}
-		
-		public void selectionChanged(ListDialogField field) {}
-		
-		// -------- IDialogFieldListener
-		public void dialogFieldChanged(DialogField field) {
-		}
-		/* (non-Javadoc)
-		 * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#doubleClicked(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField)
-		 */
-		public void doubleClicked(ListDialogField field) {
-		}
-	}	
-	
-	public CheckBoxExample run () {
-		Display display= fShell.getDisplay ();
-		while (!fShell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		return this;
-	}
-	
-	public static void main(java.lang.String[] args) {
-		new CheckBoxExample().open().run().close();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/DialogFieldExample.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/DialogFieldExample.java
deleted file mode 100644
index 64d1e6b..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/DialogFieldExample.java
+++ /dev/null
@@ -1,169 +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.jdt.ui.examples;
-
-
-import java.util.Random;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogField;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogFieldGroup;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonDialogField;
-
-
-public class DialogFieldExample {
-	private Shell fShell;
-	
-	public DialogFieldExample() {
-	}
-	
-	public DialogFieldExample close () {
-		if ((fShell != null) && (!fShell.isDisposed ())) fShell.dispose ();
-		fShell= null;
-		return this;
-	}
-	
-	private class MylabelProvider extends LabelProvider implements ITableLabelProvider {
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
-		 */
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
-		 */
-		public String getColumnText(Object element, int columnIndex) {
-			if (columnIndex == 0) {
-				return element.toString();
-			} else {
-				return "" + columnIndex;
-			}
-		}
-	}
-	
-	
-	public DialogFieldExample open () {
-		fShell= new Shell ();
-		fShell.setText("Message Dialog Example");
-		fShell.setLayout(new GridLayout());
-		
-		Adapter adapter= new Adapter();
-		
-		StringButtonDialogField string1= new StringButtonDialogField(adapter);
-		string1.setLabelText("String1: ");
-		string1.setText("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
-		
-		StringButtonDialogField stringbutton= new StringButtonDialogField(adapter);
-		stringbutton.setLabelText("StringButton: ");
-		stringbutton.setButtonLabel("Click");
-		stringbutton.setText("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
-
-		
-		String[] addButtons= new String[] { 
-			/* 0 */ "Add1",
-			/* 1 */ "Add2",
-			/* 2 */ null,
-			/* 3 */ "Up",
-			/* 4 */ "Down",					
-			/* 5 */ null,
-			/* 6 */ "Remove"
-		};
-		String[] columnHeaders= new String[] { "Name", "Number" };
-		
-		
-		ListDialogField list= new ListDialogField(adapter, addButtons, new MylabelProvider());
-		list.setUpButtonIndex(3);
-		list.setDownButtonIndex(4);
-		list.setRemoveButtonIndex(6);
-		list.setLabelText("List: ");
-		
-		list.setTableColumns(new ListDialogField.ColumnsDescription(columnHeaders, true));
-		
-		for (int i= 0; i < 30; i++) {
-				list.addElement(i + "firstxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
-		}
-		
-		SelectionButtonDialogField selButton= new SelectionButtonDialogField(SWT.PUSH);
-		selButton.setLabelText("Press Button");
-		
-		String[] radioButtons1= new String[] { "Option One", "Option Two", "Option Three" };
-		SelectionButtonDialogFieldGroup rdgroup1= new SelectionButtonDialogFieldGroup(SWT.RADIO, radioButtons1, 3, 0);
-		rdgroup1.setLabelText("Radio Button Group");
-		
-		String[] radioButtons2= new String[] { "Option One", "Option Two", "Option Three" };
-		SelectionButtonDialogFieldGroup rdgroup2= new SelectionButtonDialogFieldGroup(SWT.CHECK, radioButtons2, 3);
-		rdgroup2.setLabelText("Radio Button Group 2");		
-		
-		LayoutUtil.doDefaultLayout(fShell, new DialogField[] { string1, rdgroup2, stringbutton, selButton, list, rdgroup1 }, false);
-		
-		((GridData)string1.getTextControl(null).getLayoutData()).widthHint= 100;
-		((GridData)stringbutton.getTextControl(null).getLayoutData()).widthHint= 100;
-		
-		fShell.setSize(fShell.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-		fShell.open ();
-		return this;
-	}
-	
-	private static Random fgRandom= new Random();
-	
-	private class Adapter implements IStringButtonAdapter, IDialogFieldListener, IListAdapter {
-		
-		// -------- IStringButtonAdapter
-		public void changeControlPressed(DialogField field) {
-		}		
-				
-		// -------- IListAdapter
-		public void customButtonPressed(ListDialogField field, int index) {
-			if (field != null) {
-				field.addElement("elementxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-" + fgRandom.nextInt());
-			}
-		}
-		
-		public void selectionChanged(ListDialogField field) {}
-		
-		// -------- IDialogFieldListener
-		public void dialogFieldChanged(DialogField field) {
-		}
-		/* (non-Javadoc)
-		 * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#doubleClicked(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField)
-		 */
-		public void doubleClicked(ListDialogField field) {
-		}
-	}	
-	
-	public DialogFieldExample run () {
-		Display display= fShell.getDisplay ();
-		while (!fShell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		return this;
-	}
-	
-	public static void main(java.lang.String[] args) {
-		new DialogFieldExample().open().run().close();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MultiElementListSelectorExample.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MultiElementListSelectorExample.java
deleted file mode 100644
index 765da7b..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MultiElementListSelectorExample.java
+++ /dev/null
@@ -1,82 +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.jdt.ui.examples;
-
-
-import java.util.Random;
-
-import org.eclipse.core.runtime.IStatus;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-
-import org.eclipse.ui.dialogs.ISelectionStatusValidator;
-
-import org.eclipse.jdt.internal.ui.dialogs.MultiElementListSelectionDialog;
-import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
-
-
-public class MultiElementListSelectorExample {
-
-
-	public static void main(String[] args) {
-
-
-		ISelectionStatusValidator validator= new ISelectionStatusValidator() {
-			public IStatus validate(Object[] selection) {
-				if (selection != null && selection.length == 1) {
-					return new StatusInfo();
-				} else {
-					StatusInfo status= new StatusInfo();
-					status.setError("Single selection");
-					return status;
-				}
-				
-			}
-		};
-
-
-
-		Random random= new Random();
-		
-		ILabelProvider elementRenderer= new org.eclipse.jface.viewers.LabelProvider() {
-			public String getText(Object element) {
-				return element.toString();
-			}
-		};
-		
-		int nLists= 3;
-		
-		Object[][] elements= new Object[nLists][];
-		for (int i= 0; i < nLists; i++) {
-			int size= random.nextInt(15);
-			elements[i]= new String[size];
-			for (int k= 0; k < size; k++) {
-				elements[i][k]= "elem-" + i + "-" + k;
-			}
-		}
-		Display display= new Display();
-		MultiElementListSelectionDialog d= new MultiElementListSelectionDialog(new Shell(display), elementRenderer);
-		d.setTitle("Title");
-		d.setIgnoreCase(true);
-		d.setMessage("this is a message");
-		d.setValidator(validator);
-		d.setElements(elements);
-		
-		d.open();
-		
-		Object[] res= d.getResult();
-		for (int i= 0; i < res.length; i++)
-			System.out.println(res[i]);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MyProjectCreationWizard.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MyProjectCreationWizard.java
deleted file mode 100644
index 0d0a718..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MyProjectCreationWizard.java
+++ /dev/null
@@ -1,174 +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.jdt.ui.examples;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.ui.wizards.JavaCapabilityConfigurationPage;
-
-/**
-<extension 
-	point="org.eclipse.ui.newWizards">
-  	<wizard
-		id="org.eclipse.jdt.ui.examples.MyProjectCreationWizard"
-		name="My project"
-		class="org.eclipse.jdt.ui.examples.MyProjectCreationWizard"
-		category="org.eclipse.jdt.ui.java"
-		project="true"
-		finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
-		icon="icons/full/ctool16/newjprj_wiz.gif">
-		<description>My project</description>
-    </wizard>	 
-</extension>
- */   
-
-/**
- * This example shows how to implement an own project wizard that uses the
- * JavaCapabilityConfigurationPage to allow the user to configure the Java build path.
- */
-public class MyProjectCreationWizard extends Wizard implements IExecutableExtension, INewWizard {
-
-	private WizardNewProjectCreationPage fMainPage;
-	private JavaCapabilityConfigurationPage fJavaPage;
-	
-	private IConfigurationElement fConfigElement;
-
-	private IWorkbench fWorkbench;
-	private IStructuredSelection fSelection;
-	
-	public MyProjectCreationWizard() {
-		setWindowTitle("New XY Project");
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement cfig, String propertyName, Object data) {
-		//  The config element will be used in <code>finishPage</code> to set the result perspective.
-		fConfigElement= cfig;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		fWorkbench= workbench;
-		fSelection= selection; 
-	}
-
-	/* (non-Javadoc)
-	 * @see Wizard#addPages
-	 */	
-	public void addPages() {
-		super.addPages();
-		fMainPage= new WizardNewProjectCreationPage("NewProjectCreationWizard");
-		fMainPage.setTitle("New");
-		fMainPage.setDescription("Create a new XY project.");
-		
-		// the main page
-		addPage(fMainPage);
-		
-		// the Java build path configuration page
-		fJavaPage= new JavaCapabilityConfigurationPage() {
-			public void setVisible(boolean visible) {
-				// need to override to react to changes on first page
-				updatePage();
-				super.setVisible(visible);
-			}
-		};
-		addPage(fJavaPage);
-		
-		//	TODO: add your pages here
-	}
-	
-	private void updatePage() {
-		IJavaProject jproject= JavaCore.create(fMainPage.getProjectHandle());
-		if (!jproject.equals(fJavaPage.getJavaProject())) {
-			fJavaPage.init(jproject, null, null, false);	
-		}
-	}
-	
-	private void finishPage(IProgressMonitor monitor) throws InterruptedException, CoreException {
-		if (monitor == null) {
-			monitor= new NullProgressMonitor();
-		}
-		try {		
-			monitor.beginTask("Creating XY project...", 3); // 3 steps
-
-			IProject project= fMainPage.getProjectHandle();
-			IPath locationPath= fMainPage.getLocationPath();
-		
-			// create the project
-			IProjectDescription desc= project.getWorkspace().newProjectDescription(project.getName());
-			if (!fMainPage.useDefaults()) {
-				desc.setLocation(locationPath);
-			}
-			project.create(desc, new SubProgressMonitor(monitor, 1));
-			project.open(new SubProgressMonitor(monitor, 1));
-			
-			updatePage();
-			fJavaPage.configureJavaProject(new SubProgressMonitor(monitor, 1));
-			// TODO: configure your page / nature
-	
-			// change to the perspective specified in the plugin.xml		
-			BasicNewProjectResourceWizard.updatePerspective(fConfigElement);
-			BasicNewResourceWizard.selectAndReveal(project, fWorkbench.getActiveWorkbenchWindow());
-			
-		} finally {
-			monitor.done();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see Wizard#performFinish
-	 */		
-	public boolean performFinish() {
-		WorkspaceModifyOperation op= new WorkspaceModifyOperation() {
-			protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
-				finishPage(monitor);
-			}
-		};
-		try {
-			getContainer().run(false, true, op);
-		} catch (InvocationTargetException e) {
-			return false; // TODO: should open error dialog and log
-		} catch  (InterruptedException e) {
-			return false; // canceled
-		}
-		return true;
-	}
-			
-
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MyQuickFixProcessor.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MyQuickFixProcessor.java
deleted file mode 100644
index b43d920..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/MyQuickFixProcessor.java
+++ /dev/null
@@ -1,72 +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.jdt.ui.examples;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.compiler.IProblem;
-
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
-import org.eclipse.jdt.ui.text.java.IProblemLocation;
-import org.eclipse.jdt.ui.text.java.IQuickFixProcessor;
-
-import org.eclipse.jdt.internal.ui.text.correction.ReplaceCorrectionProposal;
-
-/**
- *
- */
-public class MyQuickFixProcessor implements IQuickFixProcessor {
-/* Active on files with the name A.java
-
-<extension
-      point="org.eclipse.jdt.ui.quickFixProcessors">
-   <quickFixProcessor
-         id= "org.eclipse.jdt.ui.examples.MyQuickFixProcessor"
-         class="org.eclipse.jdt.ui.examples.MyQuickFixProcessor"
-         name="Example Quick Fix Processor">
-         <objectState adaptable="org.eclipse.core.resources.IResource">
-           <property name="name" value="A.java"/>
-        </objectState>
-   </quickFixProcessor>
-</extension> 
-
-*/
-	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.ui.text.correction.ICorrectionProcessor#hasCorrections(org.eclipse.jdt.core.ICompilationUnit, int)
-	 */
-	public boolean hasCorrections(ICompilationUnit unit, int problemId) {
-		return (problemId == IProblem.NumericValueOutOfRange);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.ui.text.correction.ICorrectionProcessor#getCorrections(org.eclipse.jdt.internal.ui.text.correction.IAssistContext, org.eclipse.jdt.internal.ui.text.correction.IProblemLocation[])
-	 */
-	public IJavaCompletionProposal[] getCorrections(IInvocationContext context, IProblemLocation[] locations) throws CoreException {
-		for (int i= 0; i < locations.length; i++) {
-			if (locations[i].getProblemId() == IProblem.NumericValueOutOfRange) {
-				return getNumericValueOutOfRangeCorrection(context, locations[i]);
-			}
-		}
-		return null;
-	}
-
-	private IJavaCompletionProposal[] getNumericValueOutOfRangeCorrection(IInvocationContext context, IProblemLocation location) {
-		ICompilationUnit cu= context.getCompilationUnit();
-		
-		ReplaceCorrectionProposal proposal= new ReplaceCorrectionProposal("Change to 0", cu, location.getOffset(), location.getLength(), "0", 5);
-		return new IJavaCompletionProposal[] { proposal };
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TabExample.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TabExample.java
deleted file mode 100644
index b3befe3..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TabExample.java
+++ /dev/null
@@ -1,142 +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.jdt.ui.examples;
-
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-import org.eclipse.jface.viewers.LabelProvider;
-
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField;
-
-
-public class TabExample {
-	private Shell fShell;
-	
-	public TabExample() {
-	}
-	
-	public TabExample close () {
-		if ((fShell != null) && (!fShell.isDisposed ())) fShell.dispose ();
-		fShell= null;
-		return this;
-	}
-	
-	public TabExample open () {
-		fShell= new Shell ();
-		fShell.setText("TabTest");
-		fShell.setLayout(new GridLayout());
-		
-		TabFolder folder= new TabFolder(fShell, SWT.NONE);	
-		folder.setLayoutData(new GridData(GridData.FILL_BOTH));
-		//folder.setLayout(new PageContainerFillLayout(0, 0, 20, 20));
-		//folder.setLayout(new FillLayout());
-	
-		/*folder.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				turnToPage(event);
-			}
-		});*/	
-				
-		TabItem item;
-		Label label;
-		
-		item= new TabItem(folder, SWT.NONE);
-		item.setText("Tab0");
-		
-		String[] addButtons= new String[] { 
-			/* 0 */ "Add1",
-			/* 1 */ "Add2",			
-			/* 2 */ null,
-			/* 3 */ "Remove"
-		};
-		ListDialogField list= new ListDialogField(new Adapter(), addButtons, new LabelProvider());
-		list.setRemoveButtonIndex(3);
-		list.setLabelText("List: ");
-
-
-		Composite c1= new Composite(folder, SWT.NONE);
-		LayoutUtil.doDefaultLayout(c1, new DialogField[] { list }, true);
-		
-		item.setControl(c1);
-		
-		item= new TabItem(folder, SWT.NONE);
-		item.setText("Tab1");
-		label= new Label(folder, SWT.LEFT);
-		label.setText("Tab1");
-		item.setControl(label);
-		
-		item= new TabItem(folder, SWT.NONE);
-		item.setText("Tab2");
-		label= new Label(folder, SWT.LEFT);
-		label.setText("Tab2");
-		item.setControl(label);
-		
-		item= new TabItem(folder, SWT.NONE);
-		item.setText("Tab3");
-		label= new Label(folder, SWT.LEFT);
-		label.setText("Tab3");
-		item.setControl(label);
-				
-		fShell.setSize(400,500);
-		fShell.open ();
-		return this;
-	}
-
-
-	private class Adapter implements IStringButtonAdapter, IDialogFieldListener, IListAdapter {
-		
-		// -------- IStringButtonAdapter
-		public void changeControlPressed(DialogField field) {
-		}		
-				
-		// -------- IListAdapter
-		public void customButtonPressed(ListDialogField field, int index) {
-		}
-		
-		public void selectionChanged(ListDialogField field) {
-		}
-		
-		// -------- IDialogFieldListener
-		public void dialogFieldChanged(DialogField field) {
-		}
-		/* (non-Javadoc)
-		 * @see org.eclipse.jdt.internal.ui.wizards.dialogfields.IListAdapter#doubleClicked(org.eclipse.jdt.internal.ui.wizards.dialogfields.ListDialogField)
-		 */
-		public void doubleClicked(ListDialogField field) {
-		}
-	}
-	
-	public TabExample run () {
-		Display display= fShell.getDisplay ();
-		while (!fShell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		return this;
-	}
-	
-	public static void main(java.lang.String[] args) {
-		new TabExample().open().run().close();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TreeListDialogFieldExample.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TreeListDialogFieldExample.java
deleted file mode 100644
index 4756cdd..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TreeListDialogFieldExample.java
+++ /dev/null
@@ -1,137 +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.jdt.ui.examples;
-
-
-import java.util.Random;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.viewers.LabelProvider;
-
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.ITreeListAdapter;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
-import org.eclipse.jdt.internal.ui.wizards.dialogfields.TreeListDialogField;
-
-
-public class TreeListDialogFieldExample {
-	private Shell fShell;
-	
-	public TreeListDialogFieldExample() {
-	}
-	
-	public TreeListDialogFieldExample close () {
-		if ((fShell != null) && (!fShell.isDisposed ())) fShell.dispose ();
-		fShell= null;
-		return this;
-	}
-	
-	
-		
-	public TreeListDialogFieldExample open () {
-		fShell= new Shell ();
-		fShell.setText("Message Dialog Example");
-		fShell.setLayout(new GridLayout());
-		
-		Adapter adapter= new Adapter();
-		
-		
-		String[] addButtons= new String[] { 
-			/* 0 */ "Add1",
-			/* 1 */ "Add2",
-			/* 2 */ null,
-			/* 3 */ "Up",
-			/* 4 */ "Down",					
-			/* 5 */ null,
-			/* 6 */ "Remove"
-		};
-		
-		TreeListDialogField list= new TreeListDialogField(adapter, addButtons, new LabelProvider());
-		list.setUpButtonIndex(3);
-		list.setDownButtonIndex(4);
-		list.setRemoveButtonIndex(6);
-		list.setLabelText("List: ");
-		
-	
-		for (int i= 0; i < 30; i++) {
-				list.addElement(i + "firstxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
-		}
-		
-		
-		LayoutUtil.doDefaultLayout(fShell, new DialogField[] { list }, false);
-		
-		fShell.setSize(fShell.computeSize(SWT.DEFAULT, SWT.DEFAULT));
-		fShell.open ();
-		return this;
-	}
-	
-	private static Random fgRandom= new Random();
-	
-	private class Adapter implements ITreeListAdapter {
-		
-		// -------- IStringButtonAdapter
-		public void changeControlPressed(DialogField field) {
-		}		
-				
-		// -------- ITreeListAdapter
-		public void customButtonPressed(TreeListDialogField field, int index) {
-			field.addElement("elementxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-" + fgRandom.nextInt());
-		}
-		
-		public void selectionChanged(TreeListDialogField field) {}
-		
-		public Object[] getChildren(TreeListDialogField field, Object element) {
-			if (field.getElements().contains(element)) {
-				return new String[] {
-					"Source Attachment: c:/hello/z.zip",
-					"Javadoc Location: http://www.oo.com/doc"
-				};
-			}
-			return new String[0];
-		}
-
-		public Object getParent(TreeListDialogField field, Object element) {
-			return null;
-		}
-
-		public boolean hasChildren(TreeListDialogField field, Object element) {
-			return field.getElements().contains(element);
-		}		
-		
-		// -------- IDialogFieldListener
-		public void dialogFieldChanged(DialogField field) {
-		}
-
-		public void doubleClicked(TreeListDialogField field) {
-		}
-
-		public void keyPressed(TreeListDialogField field, KeyEvent event) {
-		}
-
-	}	
-	
-	public TreeListDialogFieldExample run () {
-		Display display= fShell.getDisplay ();
-		while (!fShell.isDisposed ()) {
-			if (!display.readAndDispatch ()) display.sleep ();
-		}
-		return this;
-	}
-	
-	public static void main(java.lang.String[] args) {
-		new TreeListDialogFieldExample().open().run().close();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TwoPaneElementSelectorExample.java b/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TwoPaneElementSelectorExample.java
deleted file mode 100644
index 1513de9..0000000
--- a/org.eclipse.jdt.ui.tests/examples/org/eclipse/jdt/ui/examples/TwoPaneElementSelectorExample.java
+++ /dev/null
@@ -1,53 +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.jdt.ui.examples;
-
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-
-import org.eclipse.ui.dialogs.TwoPaneElementSelector;
-
-
-
-
-public class TwoPaneElementSelectorExample {
-
-
-	public static void main(String[] args) {
-		java.util.Random random= new java.util.Random();
-		Object[] elements= new Object[8000];
-		for (int i= 0; i < elements.length; i++)
-			elements[i]= new Integer(random.nextInt()).toString();
-		ILabelProvider elementRenderer= new org.eclipse.jface.viewers.LabelProvider() {
-			public String getText(Object element) {
-				return element.toString();
-			}
-		};
-		ILabelProvider qualfierRenderer= new org.eclipse.jface.viewers.LabelProvider() {
-			public String getText(Object element) {
-				return element.toString();
-			}
-		};
-		Display display= new Display();
-		TwoPaneElementSelector d= new TwoPaneElementSelector(new Shell(display), elementRenderer, qualfierRenderer);
-		d.setTitle("Title");
-		d.setMessage("this is a message");
-		d.setElements(elements);
-		
-		d.open();
-		
-		Object res= d.getResult();
-		System.out.println("res= "+res);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/leaks/LeakTestExample.launch b/org.eclipse.jdt.ui.tests/leaks/LeakTestExample.launch
deleted file mode 100644
index 3273c63..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/LeakTestExample.launch
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="clearws" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.jdt.ui.tests.leaks.JavaLeakTest"/>
-<stringAttribute key="vmargs" value="-Xj9 -XrunProfileNatives -Xmx256M"/>
-<booleanAttribute key="default" value="true"/>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="progargs" value="-os win32 -ws win32 -arch x86 -nl de_CH"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.jdt.ui.tests"/>
-<booleanAttribute key="askclear" value="false"/>
-<mapAttribute key="org.eclipse.debug.core.environmentVariables">
-<mapEntry key="PATH" value="%PATH%;c:\memleakstuff\memleaks\org.eclipse.jdt.ui.tests\leaks"/>
-</mapAttribute>
-<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.debug.ui.javaSourceLocator"/>
-<stringAttribute key="location0" value="C:\workspaces\junit-workbench-workspace"/>
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.uitestapplication"/>
-</launchConfiguration>
diff --git a/org.eclipse.jdt.ui.tests/leaks/ProfileNatives.dll b/org.eclipse.jdt.ui.tests/leaks/ProfileNatives.dll
deleted file mode 100644
index d333185..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/ProfileNatives.dll
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/LeakTestCase.java b/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/LeakTestCase.java
deleted file mode 100644
index ff9ae85..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/LeakTestCase.java
+++ /dev/null
@@ -1,109 +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.jdt.ui.leaktest;
-
-import junit.framework.TestCase;
-
-
-
-/**
- * Base class for leak test cases. To use the offered functionality, the test case has to run
- * in a LeakTestSetup that establishes the profile connection.
- */
-public class LeakTestCase extends TestCase {
-	
-	public LeakTestCase(String name) {
-		super(name);
-	}
-
-	
-	/**
-	 * Assert that two counts are different. The method does not fail if the profile connection
-	 * has not established (e.g. because profiling is not supported on the given platform)
-	 * @param startCount
-	 * @param endCount
-	 */
-	protected void assertDifferentCount(int startCount, int endCount) {
-		assertDifferentCount(null, startCount, endCount);
-	}
-	
-	/**
-	 * Assert that two counts are different. The method does not fail if the profile connection
-	 * has not established (e.g. because profiling is not supported on the given platform)
-	 * @param message Message to be printed if the test fails.
-	 * @param startCount
-	 * @param endCount
-	 */
-	protected void assertDifferentCount(String message, int startCount, int endCount) {
-		ProfilerConnector connection= LeakTestSetup.getProfilerConnector();
-		if (connection != null && (startCount == endCount)) {
-			String str= message != null ? message + ": " : "";
-			assertTrue(str + "instance count is not different: (" + startCount + " / " + endCount + " )", false);
-		}
-	}
-	
-	/**
-	 * Assert that two counts are equal. The method does not fail if the profile connection
-	 * has not established (e.g. because profiling is not supported on the given platform)
-	 * @param startCount
-	 * @param endCount
-	 */
-	protected void assertEqualCount(int startCount, int endCount) {
-		assertEqualCount(null, startCount, endCount);
-	}
-	
-	/**
-	 * Assert that two counts are equal. The method does not fail if the profile connection
-	 * has not established (e.g. because profiling is not supported on the given platform)
-	 * @param message Message to be printed if the test fails.
-	 * @param startCount
-	 * @param endCount
-	 */
-	protected void assertEqualCount(String message, int startCount, int endCount) {
-		ProfilerConnector connection= LeakTestSetup.getProfilerConnector();
-		if (connection != null && (startCount != endCount)) {
-			// only compare if connection could be established
-			String str= message != null ? message + ": " : "";
-			assertTrue(str + "instance count is not the same: (" + startCount + " / " + endCount + " )", false);
-		}
-	}
-	
-	/**
-	 * Returns the number of instances of a given class that are live (not garbage).
-	 * @param cl The class of the instances to count
-	 * @return Returns the current number of instances of the given class or <code>-1</code> if
-	 * no connection is established.
-	 * @throws ProfileException ProfileException is thrown if the request failed unexpectedly.
-	 */
-	protected int getInstanceCount(Class cl) throws ProfileException {
-		ProfilerConnector connection= LeakTestSetup.getProfilerConnector();
-		if (connection != null) {
-			return connection.getInstanceCount(cl);
-		}
-		return -1;
-	}
-	
-	/**
-	 * Returns the number of instances of a given class that are live (not garbage).
-	 * @param cl The class of the instances to count
-	 * @return Returns the current number of instances of the given class or <code>-1</code> if
-	 * no connection is established.
-	 * @throws ProfileException ProfileException is thrown if the request failed unexpectedly.
-	 */
-	protected int getInstanceCount(Class cl, Class[] excludedClasses) throws ProfileException {
-		ProfilerConnector connection= LeakTestSetup.getProfilerConnector();
-		if (connection != null) {
-			return connection.getInstanceCount(cl, excludedClasses);
-		}
-		return -1;
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/LeakTestSetup.java b/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/LeakTestSetup.java
deleted file mode 100644
index e193c3e..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/LeakTestSetup.java
+++ /dev/null
@@ -1,66 +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.jdt.ui.leaktest;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-
-/**
- *
- */
-public class LeakTestSetup extends TestSetup {
-	
-	private static LeakTestSetup fgCurrentSetup= null;
-	private ProfilerConnector fConnection;
-	
-	/**
-	 * @return Returns the profiler Connection or <code>null</code> if no profiler connection
-	 * could be established (e.g. because not supported on the platform)
-	 */
-	public static ProfilerConnector getProfilerConnector() {
-		return fgCurrentSetup.getConnection();
-	}
-		
-		
-	public LeakTestSetup(Test test) {
-		super(test);
-		if (fgCurrentSetup == null) {
-			fgCurrentSetup= this;
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		if (fgCurrentSetup != this) {
-			return;
-		}
-		try {
-			fConnection= new ProfilerConnector();
-		} catch (ProfileException e) {
-			fConnection= null;
-		}
-	}
-
-	protected void tearDown() throws Exception {
-		if (fgCurrentSetup != this) {
-			return;
-		}
-		fConnection.close();
-	}
-
-	/**
-	 * @return Returns the connection.
-	 */
-	public ProfilerConnector getConnection() {
-		return fConnection;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfileException.java b/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfileException.java
deleted file mode 100644
index 386bf4f..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfileException.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.eclipse.jdt.ui.leaktest;
-
-
-
-public class ProfileException extends Exception {
-
-	public ProfileException(String msg, Throwable e) {
-		super(msg, e);
-	}
-
-	public ProfileException(Throwable e) {
-		super(e);
-	}
-
-	public ProfileException(String msg) {
-		super(msg);
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfileNatives.java b/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfileNatives.java
deleted file mode 100644
index d034428..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfileNatives.java
+++ /dev/null
@@ -1,140 +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.jdt.ui.leaktest;
-
-import java.util.Vector;
-
-
-public class ProfileNatives {
-	private static boolean fgIsNativeLoaded= false;
-	static {
-		try {
-			System.loadLibrary("ProfileNatives");
-			fgIsNativeLoaded= isInitialized0();
-		} catch (UnsatisfiedLinkError e) {
-			e.printStackTrace();
-		}
-	}
-	
-	private static native int getInstanceCount0(Class clazz, Class[] excludedClasses);
-	private static native boolean isInitialized0();
-
-	public static boolean isInitialized() {
-		return fgIsNativeLoaded;
-	}
-	
-	public static int getInstanceCount(Class clazz, Class[] excludedClasses) throws ProfileException {
-		int instanceCount= getInstanceCount0(clazz, excludedClasses);
-		if (instanceCount < 0)
-			throw new ProfileException("Could not get instance count");
-		return instanceCount;
-	}
-	
-	public static int getInstanceCount(Class clazz) throws ProfileException {
-		return getInstanceCount(clazz, new Class[0]);
-	}
-	
-	public static void main(String[] args) {
-		Vector v= new Vector();
-		try {
-			System.out.println("count1= "+getInstanceCount(Vector.class));
-			MyThread t= new MyThread();
-			t.setObject(new Vector());
-			System.out.println("count2= "+getInstanceCount(Vector.class));
-			t.getObject();
-			t.doStop();
-			
-			System.out.println("count3= "+getInstanceCount(Vector.class));
-			Object o= new TestClass(new Vector()).createInner();
-			System.out.println("count4= "+getInstanceCount(Vector.class));
-			o= null;
-			System.out.println("count5= "+getInstanceCount(Vector.class));
-			
-			System.out.println("count6= "+getInstanceCount(Vector.class));
-			o= new TestClass(new Vector()).createAnon();
-			System.out.println("count7= "+getInstanceCount(Vector.class));
-			o= null;
-			System.out.println("count8= "+getInstanceCount(Vector.class));
-			} catch (ProfileException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-	
-	static class TestClass {
-		int fFoo;
-		Object fBar;
-		
-		TestClass(Object bar) {
-			fBar= bar;
-		}
-		
-		/**
-		 * @return
-		 */
-		public Object createAnon() {
-			return new Runnable() {
-
-				public void run() {
-					// TODO Auto-generated method stub
-					
-				}
-				
-			};
-		}
-
-		Object createInner() {
-			return new Inner();
-		}
-		
-		public class Inner {
-			
-		}
-	}
-	
-	static class MyThread extends Thread {
-		ThreadLocal fLocal;
-		boolean fStop= false;
-		MyThread() {
-			fLocal= new ThreadLocal();
-			this.start();
-		}
-		
-		public void setObject(Object foo) {
-			fLocal.set(foo);
-		}
-		
-		public Object getObject() {
-			return fLocal.get();
-		}
-		
-		/* (non-Javadoc)
-		 * @see java.lang.Thread#run()
-		 */
-		public void run() {
-			while (!fStop) {
-				System.out.println("sleeping");
-				try {
-					Thread.sleep(1000);
-				} catch (InterruptedException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-			}
-			System.out.println("thread stopping");
-		}
-		
-		public void doStop() {
-			fStop= true;
-		}
-	}
-}
-	
diff --git a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfilerConnector.java b/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfilerConnector.java
deleted file mode 100644
index 48e77c1..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/ProfilerConnector.java
+++ /dev/null
@@ -1,58 +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.jdt.ui.leaktest;
-
-import java.util.Vector;
-
-/**
- *
- */
-public class ProfilerConnector {
-
-	public ProfilerConnector() throws ProfileException {
-		if (!ProfileNatives.isInitialized()) {
-			throw new ProfileException("Not connected to a profiler");
-		}
-	}
-	
-	public int getInstanceCount(Class cl) throws ProfileException {
-		return ProfileNatives.getInstanceCount(cl);
-	}
-
-	public int getInstanceCount(Class cl, Class[] excludedClasses) throws ProfileException {
-		return ProfileNatives.getInstanceCount(cl, excludedClasses);
-	}
-	
-	public void close() {
-	}
-	
-	
-	private static Vector fgReference;
-	
-	public static void main(String[] str) {
-		try {
-			ProfilerConnector pc= new ProfilerConnector(); //$NON-NLS-1$
-			System.out.println("Connection installed.\n"); //$NON-NLS-1$
-			System.out.println("instance count Vector: " + pc.getInstanceCount(Vector.class));
-			fgReference= new Vector();
-			fgReference.add(fgReference);
-			
-			System.out.println("instance count Vector: " + pc.getInstanceCount(Vector.class));
-			fgReference= null;
-			System.out.println("instance count Vector: " + pc.getInstanceCount(Vector.class));
-			
-			pc.close();
-		} catch (ProfileException e) {
-			e.printStackTrace();
-		}
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/example/LeakTestExample.java b/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/example/LeakTestExample.java
deleted file mode 100644
index 390f794..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/leaktest/example/LeakTestExample.java
+++ /dev/null
@@ -1,126 +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.jdt.ui.leaktest.example;
-
-import java.util.ArrayList;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.ui.leaktest.LeakTestCase;
-import org.eclipse.jdt.ui.leaktest.LeakTestSetup;
-
-
-public class LeakTestExample extends LeakTestCase {
-
-	private static final Class THIS= LeakTestExample.class;
-	
-	private static class MyClass {
-		char[] text= new char[1000];
-	}
-	
-
-	public static Test suite() {
-		return new LeakTestSetup(new TestSuite(THIS));
-	}
-	
-	private Object fGlobalReference;
-	
-
-	public LeakTestExample(String name) {
-		super(name);
-	}
-			
-	public void testLeakGlobalReference() throws Exception {
-		Class cl= MyClass.class;
-
-		// get the count before creating the instance
-		int count1= getInstanceCount(cl);
-		
-		// create the instance
-		fGlobalReference= new MyClass();
-
-		// get the count after creating the instance
-		int count2= getInstanceCount(cl);
-		assertDifferentCount("after creation: ", count1, count2);
-		
-		// clear all references to the instance
-		fGlobalReference= null;
-		
-		// get the count after clearing the reference of the instance
-		int count3= getInstanceCount(cl);
-		assertEqualCount("after clear: ", count1, count3);
-	}
-	
-	public void testNoLeakGlobalReference() throws Exception {
-		Class cl= MyClass.class;
-
-		// get the count before creating my instance
-		int count1= getInstanceCount(cl);
-		
-		// create the instance
-		fGlobalReference= new MyClass();
-
-		// get the count after creating the instance
-		int count2= getInstanceCount(cl);
-		assertDifferentCount("after creation: ", count1, count2);
-		
-		// add the instance to a list
-		ArrayList list= new ArrayList();
-		list.add(fGlobalReference);
-		
-		// clear the global references of the instance
-		fGlobalReference= null;
-		
-		// get the count after clearing the global reference of the instance
-		// instance should still be here, it is referenced in the list
-		int count3= getInstanceCount(cl);
-		assertEqualCount("after clear: ", count2, count3);
-	}
-	
-	public void testLeakLocalReference() throws Exception {
-		Class cl= MyClass.class;
-
-		int count1= getInstanceCount(cl);
-		
-		MyClass reference= new MyClass();
-		
-		int count2= getInstanceCount(cl);
-		assertDifferentCount("after creation: ", count1, count2);
-		
-		reference.toString();
-		reference= null;
-		
-		int count3= getInstanceCount(cl);
-		assertEqualCount("after clear: ", count1, count3);
-	}
-	
-	public void testNoLeakLocalReference() throws Exception {
-		Class cl= MyClass.class;
-
-		int count1= getInstanceCount(cl);
-		
-		MyClass reference= new MyClass();
-
-		int count2= getInstanceCount(cl);
-		assertDifferentCount("after creation: ", count1, count2);
-		
-		ArrayList list= new ArrayList();
-		list.add(reference);
-		
-		reference= null;
-		
-		int count3= getInstanceCount(cl);
-		assertEqualCount("after clear: ", count2, count3);
-	}
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/tests/leaks/JavaLeakTest.java b/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/tests/leaks/JavaLeakTest.java
deleted file mode 100644
index 5ffdd52..0000000
--- a/org.eclipse.jdt.ui.tests/leaks/org/eclipse/jdt/ui/tests/leaks/JavaLeakTest.java
+++ /dev/null
@@ -1,150 +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.jdt.ui.tests.leaks;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jdt.internal.ui.text.JavaReconciler;
-import org.eclipse.jdt.internal.ui.wizards.NewClassCreationWizard;
-import org.eclipse.jdt.internal.ui.wizards.NewInterfaceCreationWizard;
-import org.eclipse.jdt.internal.ui.wizards.NewProjectCreationWizard;
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.ui.leaktest.LeakTestCase;
-import org.eclipse.jdt.ui.leaktest.LeakTestSetup;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.INewWizard;
-
-public class JavaLeakTest extends LeakTestCase {
-	
-	private IJavaProject fJProject1;
-
-	private static final Class THIS= JavaLeakTest.class;
-	
-	public JavaLeakTest(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		if (true) {
-			return new LeakTestSetup(new TestSuite(THIS));
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new JavaLeakTest("testLeak"));
-			return new LeakTestSetup(suite);
-		}	
-	}
-
-
-	protected void setUp() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		assertTrue("rt not found", JavaProjectHelper.addRTJar(fJProject1) != null);
-	}
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.delete(fJProject1);
-	}
-
-	private ICompilationUnit createTestCU() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack0", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("public class List1 {\n}\n");
-		return pack2.createCompilationUnit("List1.java", buf.toString(), false, null);
-	}
-	
-	public void testJavaEditor() throws Exception {
-		final Class cl= CompilationUnitEditor.class;
-		
-		// known reference via a ThreadLocal ref to JavaReconciler.BackgroundThread
-		final Class[] excludedClasses= new Class[] { JavaReconciler.class };
-
-		// count before opening the editor
-		final int count1= getInstanceCount(cl, excludedClasses);
-		
-		// open an editor on a CU
-		ICompilationUnit unit= createTestCU();
-		IEditorPart part= EditorUtility.openInEditor(unit);
-		// make sure the received instance has the type we're expecting
-		assertEquals(part.getClass(), cl);
-
-		int count2= getInstanceCount(cl, excludedClasses);
-		assertDifferentCount("JavaEditor", count1, count2);
-		
-		// close the editor
-		boolean res= JavaPlugin.getActivePage().closeAllEditors(false);
-		part= null;
-		assertTrue("Could not close editor", res);
-		
-		final boolean[] runnableFinished= new boolean[] { false };
-		
-		Display.getDefault().asyncExec(new Runnable() {
-			public void run() {
-				runnableFinished[0]= true;
-			}
-		});
-		// closing editors is posted via the event queue.
-		while (!runnableFinished[0])
-			Display.getDefault().readAndDispatch();
-		int count3 = getInstanceCount(cl, excludedClasses);
-		assertEqualCount("JavaEditor", count1, count3);
-	}
-	
-	public void testNewClassWizard() throws Exception {
-		int count1= getInstanceCount(NewClassCreationWizard.class);
-		doWizardLeakTest(new NewClassCreationWizard());
-		int count2= getInstanceCount(NewClassCreationWizard.class);
-		assertEqualCount("NewClassCreationWizard", count1, count2);
-	}
-	
-	public void testNewInterfaceWizard() throws Exception {
-		int count1= getInstanceCount(NewInterfaceCreationWizard.class);
-		doWizardLeakTest(new NewInterfaceCreationWizard());
-		int count2= getInstanceCount(NewInterfaceCreationWizard.class);
-		assertEqualCount("NewInterfaceCreationWizard", count1, count2);
-	}
-	
-	public void testNewJavaProjectWizard() throws Exception {
-		int count1= getInstanceCount(NewProjectCreationWizard.class);
-		doWizardLeakTest(new NewProjectCreationWizard());
-		int count2= getInstanceCount(NewProjectCreationWizard.class);
-		assertEqualCount("NewProjectCreationWizard", count1, count2);
-	}		
-	
-	private void doWizardLeakTest(INewWizard wizard) throws Exception {
-		wizard.init(JavaPlugin.getDefault().getWorkbench(), new StructuredSelection(fJProject1));
-		
-		Shell shell= JavaPlugin.getActiveWorkbenchShell();
-		WizardDialog dialog= new WizardDialog(shell, wizard);
-		dialog.setBlockOnOpen(false);
-		dialog.create();
-		dialog.open();
-		
-		dialog.close();
-		wizard= null;
-		dialog= null;
-	}	
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/plugin.properties b/org.eclipse.jdt.ui.tests/plugin.properties
deleted file mode 100644
index 1910216..0000000
--- a/org.eclipse.jdt.ui.tests/plugin.properties
+++ /dev/null
@@ -1,19 +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
-###############################################################################
-
-Plugin.name= Java Test Plugin
-Plugin.providerName= Eclipse.org
-javaElementDecorator.label= Java Element Decorator
-
-AddTestMarkersAction.label= Add Test Markers
-AddTestMarkersAction.tooltip= Add Test Markers
-
-exampleQuickFixProcessor.name= Example Quick Fix Processor
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/plugin.xml b/org.eclipse.jdt.ui.tests/plugin.xml
deleted file mode 100644
index ab1a53f..0000000
--- a/org.eclipse.jdt.ui.tests/plugin.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-   id="org.eclipse.jdt.ui.tests"
-   name="%Plugin.name"
-   version="3.0.0"
-   provider-name="%Plugin.providerName"
-   class="org.eclipse.jdt.testplugin.JavaTestPlugin">
-
-   <runtime>
-      <library name="javauitests.jar">
-         <export name="*"/>
-      </library>
-   </runtime>
-   <requires>
-      <import plugin="org.eclipse.ui.views"/>
-      <import plugin="org.junit"/>
-      <import plugin="org.eclipse.core.resources"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jdt.ui"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.jface.text"/>
-      <import plugin="org.eclipse.ui.ide"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor"/>
-      <import plugin="org.eclipse.ui.editors"/>
-      <import plugin="org.eclipse.core.runtime.compatibility" optional="true"/>
-      
-   </requires>
-
-
-<!-- **************** TEST DECORATOR ******************* -->
-   <extension
-         point="org.eclipse.ui.decorators">
-      <decorator
-            objectClass="org.eclipse.jdt.core.IJavaElement"
-            adaptable="true"
-            label="%javaElementDecorator.label"
-            state="false"
-            class="org.eclipse.jdt.testplugin.JavaElementDecorator"
-            id="org.eclipse.jdt.ui.tests.javaElementDecorator">
-      </decorator>
-   </extension>
-   <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="MochPluginView"
-            class="org.eclipse.jdt.ui.tests.packageview.MockPluginView"
-            id="org.eclipse.jdt.ui.tests.packageview.MockPluginView">
-      </view>
-      <view
-            name="MockPluginView"
-            class="org.eclipse.jdt.ui.tests.browsing.MockPluginView"
-            id="org.eclipse.jdt.ui.tests.browsing.MockPluginView">
-      </view>
-   </extension>
-<!-- **************** TEST MARKER for quick fix ******************* -->
-   <extension
-         id="testmarker"
-         name="jdt-test-problem"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.core.resources.problemmarker">
-      </super>
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerResolution">
-      <markerResolutionGenerator
-            markerType="org.eclipse.jdt.ui.tests.testmarker"
-            class="org.eclipse.jdt.ui.tests.quickfix.MarkerResolutionGenerator">
-      </markerResolutionGenerator>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <objectContribution
-            objectClass="org.eclipse.jdt.core.ICompilationUnit"
-            id="org.eclipse.jdt.ui.examples.AddTestMarkersAction">
-         <action
-               label="AddTestMarkersAction.label"
-               tooltip="AddTestMarkersAction.tooltip"
-               class="org.eclipse.jdt.ui.examples.AddTestMarkersAction"
-               menubarPath="AddTestMarkers"
-               enablesFor="1"
-               id="addTestmarkers">
-         </action>
-      </objectContribution>
-   </extension>
-   <extension
-         point="org.eclipse.jdt.ui.quickFixProcessors">
-      <quickFixProcessor
-            name="%exampleQuickFixProcessor.name"
-            class="org.eclipse.jdt.ui.examples.MyQuickFixProcessor"
-            id="org.eclipse.jdt.ui.examples.MyQuickFixProcessor">
-         <enablement>
-            <adapt
-                  type="org.eclipse.core.resources.IResource">
-               <test
-                     value="A.java"
-                     property="matchesPattern">
-               </test>
-            </adapt>
-         </enablement>
-      </quickFixProcessor>
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaElementDecorator.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaElementDecorator.java
deleted file mode 100644
index 372a432..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaElementDecorator.java
+++ /dev/null
@@ -1,36 +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.jdt.testplugin;
-
-import org.eclipse.swt.graphics.Image;
-
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.LabelProvider;
-
-/**
- * Allows to test decorators for Java elements
- */
-public class JavaElementDecorator extends LabelProvider implements ILabelDecorator {
-
-	/*
-	 * @see ILabelDecorator#decorateImage(Image, Object)
-	 */
-	public Image decorateImage(Image image, Object element) {
-		return null;
-	}
-
-	/*
-	 * @see ILabelDecorator#decorateText(String, Object)
-	 */
-	public String decorateText(String text, Object element) {
-		return text + "*";
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java
deleted file mode 100644
index 1d96720..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaTestPlugin.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaTestPlugin.java
deleted file mode 100644
index 8ef111f..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaTestPlugin.java
+++ /dev/null
@@ -1,93 +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.jdt.testplugin;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IPluginDescriptor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-
-
-public class JavaTestPlugin extends Plugin {
-	
-	private static JavaTestPlugin fgDefault;
-	
-	public JavaTestPlugin(IPluginDescriptor descriptor) {
-		super(descriptor);
-		fgDefault= this;
-	}
-	
-	public static JavaTestPlugin getDefault() {
-		return fgDefault;
-	}
-	
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-	
-	public static void enableAutobuild(boolean enable) throws CoreException {
-		// disable auto build
-		IWorkspace workspace= JavaTestPlugin.getWorkspace();
-		IWorkspaceDescription desc= workspace.getDescription();
-		desc.setAutoBuilding(enable);
-		workspace.setDescription(desc);
-	}
-	
-	public File getFileInPlugin(IPath path) {
-		try {
-			URL installURL= new URL(getDescriptor().getInstallURL(), path.toString());
-			URL localURL= Platform.asLocalURL(installURL);
-			return new File(localURL.getFile());
-		} catch (IOException e) {
-			return null;
-		}
-	}
-	
-	public static String getPluginId() {
-		return getDefault().getDescriptor().getUniqueIdentifier();
-	}
-
-	public static void log(IStatus status) {
-		getDefault().getLog().log(status);
-	}
-	
-	public static void logErrorMessage(String message) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, message, null));
-	}
-
-	public static void logErrorStatus(String message, IStatus status) {
-		if (status == null) {
-			logErrorMessage(message);
-			return;
-		}
-		MultiStatus multi= new MultiStatus(getPluginId(), IStatus.ERROR, message, null);
-		multi.add(status);
-		log(multi);
-	}
-	
-	public static void log(Throwable e) {
-		log(new Status(IStatus.ERROR, getPluginId(), IStatus.ERROR, e.getMessage(), e)); //$NON-NLS-1$
-	}	
-	
-		
-
-}
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/test/HelloWorld.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/test/HelloWorld.java
deleted file mode 100644
index e06a912..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/test/HelloWorld.java
+++ /dev/null
@@ -1,69 +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.jdt.testplugin.test;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-
-public class HelloWorld extends TestCase {
-	
-	private IJavaProject fJProject;
-	
-	
-	public static Test suite() {
-		TestSuite suite= new TestSuite();
-		suite.addTest(new HelloWorld("test1"));
-		return suite;
-	}		
-	
-	public HelloWorld(String name) {
-		super(name);
-	}
-	
-	protected void setUp() throws Exception {
-			fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.delete(fJProject);
-	}	
-		
-	public void test1() throws Exception {
-		if (JavaProjectHelper.addRTJar(fJProject) == null) {
-			assertTrue("jdk not found", false);
-			return;
-		}
-		
-		String name= "java/util/Vector.java";
-		IClassFile classfile= (IClassFile) fJProject.findElement(new Path(name));
-		assertTrue("classfile not found", classfile != null);
-		
-		IType type= classfile.getType();
-		System.out.println("methods of Vector");
-		IMethod[] methods= type.getMethods();
-		for (int i= 0; i < methods.length; i++) {
-			System.out.println(methods[i].getElementName());
-		}
-	}		
-
-}
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/test/JavaTestCase.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/test/JavaTestCase.java
deleted file mode 100644
index 21d6ae6..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/test/JavaTestCase.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.jdt.testplugin.test;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-
-public class JavaTestCase extends TestCase {
-	
-	private IJavaProject fJavaProject;
-
-	public JavaTestCase(String name) {
-		super(name);
-	}
-			
-	public static Test suite() {
-		TestSuite suite= new TestSuite();
-		suite.addTest(new JavaTestCase("doTest1"));
-		return suite;
-	}
-	
-	/**
-	 * Creates a new test Java project.
-	 */	
-	protected void setUp() throws Exception {
-		fJavaProject= JavaProjectHelper.createJavaProject("HelloWorldProject", "bin");
-
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		IPackageFragment pack= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= pack.getCompilationUnit("A.java");
-		IType type= cu.createType("public class A {\n}\n", null, true, null);
-		type.createMethod("public void a() {}\n", null, true, null);
-		type.createMethod("public void b(java.util.Vector v) {}\n", null, true, null);
-	}
-
-	/**
-	 * Removes the test java project.
-	 */	
-	protected void tearDown () throws Exception {
-		JavaProjectHelper.delete(fJavaProject);
-	}
-				
-	/*
-	 * Basic test: Checks for created methods.
-	 */
-	public void doTest1() throws Exception {
-		
-		String name= "ibm/util/A.java";
-		ICompilationUnit cu= (ICompilationUnit) fJavaProject.findElement(new Path(name));
-		assertTrue("A.java must exist", cu != null);
-		IType type= cu.getType("A");
-		assertTrue("Type A must exist", type != null);
-		
-		System.out.println("methods of A");
-		IMethod[] methods= type.getMethods();
-		for (int i= 0; i < methods.length; i++) {
-			System.out.println(methods[i].getElementName());
-		}
-		assertTrue("Should contain 2 methods", methods.length == 2);
-	}	
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/AccessibilityTestPass.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/AccessibilityTestPass.java
deleted file mode 100644
index fd9faf6..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/AccessibilityTestPass.java
+++ /dev/null
@@ -1,76 +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.jdt.testplugin.util;
-
-
-import java.util.ArrayList;
-
-
-public class AccessibilityTestPass implements IDialogTestPass {
-	private static final int CHECKLIST_SIZE = 5;
-	
-	/**
-	 * @see IDialogTestPass#title()
-	 */
-	public String title() {
-		return "Test Pass: Accessibility";
-	}
-	/**
-	 * @see IDialogTestPass#description()
-	 */
-	public String description() {
-		return "Verify the accessibility of the dialogs.";
-	}
-	/**
-	 * @see IDialogTestPass#label()
-	 */
-	public String label() {
-		return "&Accessibility";
-	}	
-	/**
-	 * @see IDialogTestPass#checkListTexts()
-	 */
-	public ArrayList checkListTexts() {
-		ArrayList list = new ArrayList(CHECKLIST_SIZE);
-		list.add("&1) all widgets are accessible by tabbing.");
-		list.add("&2) forwards and backwards tabbing is in a logical order");
-		list.add("&3) all the widgets with labels have an appropriate mnemonic.");
-		list.add("&4) there are no duplicate mnemonics.");
-		list.add("&5) selectable widgets can be selected using the spacebar.");
-		return list;
-	}
-	/**
-	 * @see IDialogTestPass#failureTexts()
-	 * Size of the return array must be the same size as the checkListTexts'
-	 * ArrayList.
-	 */
-	public String[] failureTexts() {
-		String[] failureText = new String[CHECKLIST_SIZE];
-		failureText[0] = "Some widgets aren't accessible by tabbing.";
-		failureText[1] = "Tabbing order is illogical.";
-		failureText[2] = "Missing or inappropriate mnemonics.";
-		failureText[3] = "Duplicate mnemonics.";
-		failureText[4] = "Some widgets cannot be selected using the spacebar.";
-		return failureText;
-	}
-	/**
-	 * @see IDialogTestPass#queryText()
-	 */
-	public String queryText() {
-		return "Is the accessibility of the dialog acceptable?";
-	}
-	/**
-	 * @see IDialogTestPass#getID()
-	 */
-	public int getID() {
-		return VerifyDialog.TEST_ACCESS;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/DialogCheck.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/DialogCheck.java
deleted file mode 100644
index a441f1f..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/DialogCheck.java
+++ /dev/null
@@ -1,224 +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.jdt.testplugin.util;
-
-
-
-
-import junit.framework.Assert;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-
-import org.eclipse.ui.internal.WorkbenchPlugin;
-
-
-/**
- * A <code>DialogCheck</code> is used test a dialog in
- * various ways. 
- * <p>
- * For interactive tests use <code>assertDialog</code>.
- * For automated tests use <code>assert DialogTexts</code>.
- * </p> 
- */
-public class DialogCheck {
-	private DialogCheck() {
-	}
-	private static VerifyDialog _verifyDialog;
-
-
-	/**
-	 * Asserts that a given dialog is not null and that it passes
-	 * certain visual tests.  These tests will be verified manually
-	 * by the tester using an input dialog.  Use this assert method
-	 * to verify a dialog's sizing, initial focus, or accessiblity.
-	 * To ensure that both the input dialog and the test dialog are
-	 * accessible by the tester, the getShell() method should be used
-	 * when creating the test dialog.
-	 * 
-	 * Example usage:
-	 * <code>Dialog dialog = new AboutDialog( DialogCheck.getShell() );
-	 * DialogCheck.assertDialog(dialog, this);</code>
-	 * 
-	 * @param dialog the test dialog to be verified.
-	 */
-	public static void assertDialog(Dialog dialog) {
-		Assert.assertNotNull(dialog);
-		if (_verifyDialog.getShell() == null) {
-			//force the creation of the verify dialog
-			getShell();
-		}
-		if (_verifyDialog.open(dialog) == IDialogConstants.NO_ID) {
-			Assert.assertTrue(_verifyDialog.getFailureText(), false);
-		}
-	}
-
-
-	/**
-	 * Automated test that checks all the labels and buttons of a dialog
-	 * to make sure there is enough room to display all the text.  Any
-	 * text that wraps is only approximated and is currently not accurate.
-	 * 
-	 * @param dialog the test dialog to be verified.
-	 */
-	public static void assertDialogTexts(Dialog dialog) {
-		Assert.assertNotNull(dialog);
-		dialog.setBlockOnOpen(false);
-		dialog.open();
-		Shell shell = dialog.getShell();
-		verifyCompositeText(shell);
-		dialog.close();
-	}
-
-
-	/**
-	 * This method should be called when creating dialogs to test.  This
-	 * ensures that the dialog's parent shell will be that of the
-	 * verification dialog.
-	 * 
-	 * @return Shell The shell of the verification dialog to be used as
-	 * the parent shell of the test dialog.
-	 */
-	public static Shell getShell() {
-		Shell shell =
-			WorkbenchPlugin
-				.getDefault()
-				.getWorkbench()
-				.getActiveWorkbenchWindow()
-				.getShell();
-		_verifyDialog = new VerifyDialog(shell);
-		_verifyDialog.create();
-		return _verifyDialog.getShell();
-	}
-
-
-	/*
-	 * Looks at all the child widgets of a given composite and
-	 * verifies the text on all labels and widgets.
-	 * @param composite The composite to look through
-	 */
-	private static void verifyCompositeText(Composite composite) {
-		Control children[] = composite.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			try {
-				//verify the text if the child is a button
-				verifyButtonText((Button) children[i]);
-			} catch (ClassCastException exNotButton) {
-				try {
-					//child is not a button, maybe a label
-					verifyLabelText((Label) children[i]);
-				} catch (ClassCastException exNotLabel) {
-					try {
-						//child is not a label, make a recursive call if it is a composite
-						verifyCompositeText((Composite) children[i]);
-					} catch (ClassCastException exNotComposite) {
-						//the child is not a button, label, or composite - ignore it.
-					}
-				}
-			}
-		}
-	}
-	
-	/*
-	 * Verifies that a given button is large enough to display its text.
-	 * @param button The button to verify,
-	 */
-	private static void verifyButtonText(Button button) {
-		String widget = button.toString();
-		Point size = button.getSize();
-
-
-		//compute the size with no line wrapping
-		Point preferred = button.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		//if (size.y/preferred.y) == X, then label spans X lines, so divide
-		//the calculated value of preferred.x by X
-		if (preferred.y * size.y > 0) {
-			preferred.y /= countLines(button.getText()); //check for '\n\'
-			if (size.y / preferred.y > 1) {
-				preferred.x /= (size.y / preferred.y);
-			}
-		}
-
-
-		String message =
-			new StringBuffer("Warning: ")
-				.append(widget)
-				.append("\n\tActual Width -> ")
-				.append(size.x)
-				.append("\n\tRecommended Width -> ")
-				.append(preferred.x)
-				.toString();
-		if (preferred.x > size.x) {
-			//close the dialog
-			button.getShell().dispose();
-			Assert.assertTrue(message.toString(), false);
-		}
-	}
-	
-	/*
-	 * Verifies that a given label is large enough to display its text.
-	 * @param label The label to verify,
-	 */
-	private static void verifyLabelText(Label label) {
-		String widget = label.toString();
-		Point size = label.getSize();
-
-
-		//compute the size with no line wrapping
-		Point preferred = label.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-		//if (size.y/preferred.y) == X, then label spans X lines, so divide
-		//the calculated value of preferred.x by X
-		if (preferred.y * size.y > 0) {
-			preferred.y /= countLines(label.getText());
-			if (size.y / preferred.y > 1) {
-				preferred.x /= (size.y / preferred.y);
-			}
-		}
-		String message =
-			new StringBuffer("Warning: ")
-				.append(widget)
-				.append("\n\tActual Width -> ")
-				.append(size.x)
-				.append("\n\tRecommended Width -> ")
-				.append(preferred.x)
-				.toString();
-		if (preferred.x > size.x) {
-			//close the dialog
-			label.getShell().dispose();
-			Assert.assertTrue(message.toString(), false);
-		}
-	}
-	
-	/*
-	 * Counts the number of lines in a given String.
-	 * For example, if a string contains one (1) newline character,
-	 * a value of two (2) would be returned.
-	 * @param text The string to look through.
-	 * @return int the number of lines in text.
-	 */
-	private static int countLines(String text) {
-		int newLines = 1;
-		for (int i = 0; i < text.length(); i++) {
-			if (text.charAt(i) == '\n') {
-				newLines++;
-			}
-		}
-		return newLines;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/FailureDialog.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/FailureDialog.java
deleted file mode 100644
index 2ff98ff..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/FailureDialog.java
+++ /dev/null
@@ -1,113 +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.jdt.testplugin.util;
-
-
- 
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.resource.JFaceResources;
-
-
-/*
- * A dialog for collecting notes from the tester regarding
- * the failure of a test.
- */
-public class FailureDialog extends Dialog {
-	private Text _text;
-	private String _log;
-	private int SIZING_TEXT_WIDTH = 400;
-	private int SIZING_TEXT_HEIGHT = 200;
-	
-	/**
-	 * Constructor for FailureDialog
-	 */
-	public FailureDialog(Shell parentShell) {
-		super(parentShell);
-	}
-	/* (non-Javadoc)
-	 * Method declared on Window.
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText("Dialog Test Failed");
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		createButton(parent, IDialogConstants.OK_ID, "&OK", true);
-		createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// page group
-		Composite composite = (Composite)super.createDialogArea(parent);
-		composite.setSize( composite.computeSize(SWT.DEFAULT, SWT.DEFAULT) );
-		
-		Label label = new Label(composite, SWT.WRAP);
-		label.setText("&Enter a note regarding the failure:");
-		
-		_text = new Text(composite, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		_text.setFont( JFaceResources.getFontRegistry().get(JFaceResources.TEXT_FONT) );
-		GridData data = new GridData(GridData.FILL_BOTH);
-		data.widthHint = SIZING_TEXT_WIDTH;
-		data.heightHint = SIZING_TEXT_HEIGHT;
-		_text.setLayoutData(data);
-		
-		return composite;
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected void okPressed() {		
-		_log = _text.getText();
-		super.okPressed();
-	}
-	/*
-	 * @return String the text contained in the input area of
-	 * the dialog.
-	 */
-	String getText() {
-		if (_log == null) {
-			return "Empty entry.";
-		} else {
-			return _log;
-		}
-	}
-	/*
-	 * Sets the text of the input area.  This should only be
-	 * called to set the initial text so only call before invoking
-	 * open().
-	 */
-	void setText(String text) {
-		_text.setText(text);
-	}
-	/*
-	 * Returns a string representation of this class which
-	 * the text contained in the input area of the dialog.
-	 */
-	public String toString() {
-		return getText();
-	}
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/FocusTestPass.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/FocusTestPass.java
deleted file mode 100644
index 3588b81..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/FocusTestPass.java
+++ /dev/null
@@ -1,74 +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.jdt.testplugin.util;
-
-
- 
-import java.util.ArrayList;
-
-
-/*
- * This test pass verifies the initial focus of a dialog
- * when it is given focus.
- */
-public class FocusTestPass implements IDialogTestPass {
-	private static final int CHECKLIST_SIZE = 1;
-
-
-	/**
-	 * @see IDialogTestPass#title()
-	 */
-	public String title() {
-		return "Test Pass: Initial Focus";
-	}
-	/**
-	 * @see IDialogTestPass#description()
-	 */
-	public String description() {
-		return "Verify the initial focus of the dialogs.";
-	}
-	/**
-	 * @see IDialogTestPass#label()
-	 */
-	public String label() {
-		return "&Initial Focus";
-	}	
-	/**
-	 * @see IDialogTestPass#checkListTexts()
-	 */
-	public ArrayList checkListTexts() {
-		ArrayList list = new ArrayList(CHECKLIST_SIZE);
-		list.add("&1) the initial focus is appropriate.");
-		return list;
-	}
-	/**
-	 * @see IDialogTestPass#failureTexts()
-	 * Size of the return array must be the same size as the checkListTexts'
-	 * ArrayList.
-	 */
-	public String[] failureTexts() {
-		String[] failureText = new String[CHECKLIST_SIZE];
-		failureText[0] = "The initial focus is inappropriate.";
-		return failureText;
-	}
-	/**
-	 * @see IDialogTestPass#queryText()
-	 */
-	public String queryText() {
-		return "Is the initial focus of the dialog correct?";
-	}
-	/**
-	 * @see IDialogTestPass#getID()
-	 */
-	public int getID() {
-		return VerifyDialog.TEST_FOCUS;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/IDialogTestPass.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/IDialogTestPass.java
deleted file mode 100644
index f1c1949..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/IDialogTestPass.java
+++ /dev/null
@@ -1,58 +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.jdt.testplugin.util;
-
-
-import java.util.ArrayList;
-
-
-/*
- * Interface to describe a visual test pass for a dialog test.
- */
-public interface IDialogTestPass {
-	/*
-	 * @return String The title of the test pass.
-	 */
-	public String title();
-	/*
-	 * @return String The description of the test pass.
-	 */
-	public String description();
-	/*
-	 * @return String The label of the test pass to be used
-	 * in a selection list.  The return includes an '&'
-	 * if a mnemonic is desired.
-	 */
-	public String label();
-	/*
-	 * @return ArrayList A list of items to appear in a checklist.
-	 * The items in the list must be Strings and should include an
-	 * '&' if a mnemonic is desired.
-	 */
-	public ArrayList checkListTexts();
-	/*
-	 * @return String[] Associated failure messages that correspond
-	 * to the checklist items.  The size of this array should be the
-	 * same size as the checklist.
-	 */
-	public String[] failureTexts();
-	/*
-	 * @return String The test that corresponds to the test pass to
-	 * which the tester will respond with a 'yes' or 'no'.
-	 */
-	public String queryText();
-	/*
-	 * @return int A unique number that identifies the test pass.
-	 */
-	public int getID();
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/SizingTestPass.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/SizingTestPass.java
deleted file mode 100644
index d3ff20a..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/SizingTestPass.java
+++ /dev/null
@@ -1,82 +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.jdt.testplugin.util;
-
-
- 
-import java.util.ArrayList;
-
-
-/*
- * This test pass verifies visually the sizing of the dialog and its
- * widgets.
- */
-class SizingTestPass implements IDialogTestPass {
-	private static final int CHECKLIST_SIZE = 5;
-
-
-	/**
-	 * @see IDialogTestPass#title()
-	 */
-	public String title() {
-		return "Test Pass: Sizing and Display";
-	}
-	/**
-	 * @see IDialogTestPass#description()
-	 */
-	public String description() {
-		return "Verify the sizing and display of the dialogs and widgets.";
-	}
-	/**
-	 * @see IDialogTestPass#label()
-	 */
-	public String label() {
-		return "&Sizing and Display";
-	}	
-	/**
-	 * @see IDialogTestPass#checkListTexts()
-	 */
-	public ArrayList checkListTexts() {
-		ArrayList list = new ArrayList(CHECKLIST_SIZE);
-		list.add("&1) the correct dialog displays.");
-		list.add("&2) the dialog is an appropriate size for the required resolution (1024x768).");
-		list.add("&3) the texts are correct and not cut off.");
-		list.add("&4) all strings have been externalized properly.");
-		list.add("&5) all the widgets are viewable and not cut off.");
-		return list;
-	}
-	/**
-	 * @see IDialogTestPass#failureTexts()
-	 * Size of the return array must be the same size as the checkListTexts'
-	 * ArrayList.
-	 */
-	public String[] failureTexts() {
-		String[] failureText = new String[CHECKLIST_SIZE];
-		failureText[0] = "The wrong dialog displayed.";
-		failureText[1] = "The dialog is too large for the required resolution.";
-		failureText[2] = "Text labels are wrong or cut off.";
-		failureText[3] = "Some strings have not been externalized properly.";
-		failureText[4] = "Some widgets are cut off.";
-		return failureText;
-	}
-	/**
-	 * @see IDialogTestPass#queryText()
-	 */
-	public String queryText() {
-		return "Is the sizing and display of the dialog correct?";
-	}
-	/**
-	 * @see IDialogTestPass#getID()
-	 */
-	public int getID() {
-		return VerifyDialog.TEST_SIZING;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/VerifyDialog.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/VerifyDialog.java
deleted file mode 100644
index e2f7d33..0000000
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/util/VerifyDialog.java
+++ /dev/null
@@ -1,314 +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.jdt.testplugin.util;
-
-
-import java.util.Iterator;
-
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.TitleAreaDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-
-/*
- * This dialog is intended to verify a dialogs in a testing
- * environment.  The tester can test for sizing, initial focus,
- * or accessibility.
- */
-public class VerifyDialog extends TitleAreaDialog {
-	private int SIZING_WIDTH = 400;
-	
-	private static int      TEST_TYPE;
-	public static final int TEST_SIZING = 0;
-	public static final int TEST_FOCUS  = 1;
-	public static final int TEST_ACCESS = 2;
-	private IDialogTestPass _dialogTests[] = new IDialogTestPass[3];
-
-
-	private Dialog _testDialog; //the dialog to test
-	private Point  _testDialogSize;
-	
-	private Label  _queryLabel;
-	private Button _yesButton;
-	private Button _noButton;
-	private Button _checkList[];
-	private String _failureText;
-	
-	/*
-	 * Create an instance of the verification dialog.
-	 */
-	public VerifyDialog(Shell parent) {
-		super(parent);
-		if ( !(TEST_TYPE <= 2) && !(TEST_TYPE >= 0) ) {
-			TEST_TYPE = TEST_SIZING;
-		}
-		_failureText = "";
-		_dialogTests[0] = new SizingTestPass();
-		_dialogTests[1] = new FocusTestPass();
-		_dialogTests[2] = new AccessibilityTestPass();
-	}
-	
-	/* (non-Javadoc)
-	 * Method declared on Window.
-	 */
-	protected void configureShell(Shell newShell) {
-		super.configureShell(newShell);
-		newShell.setText("Dialog Verification");
-		setShellStyle(SWT.NONE);
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		_yesButton = createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, true);
-		_noButton = createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, false);
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected void buttonPressed(int buttonId) {
-		if (IDialogConstants.YES_ID == buttonId) {
-			setReturnCode(IDialogConstants.YES_ID);
-			if (_testDialog.getShell() != null) {
-				_testDialog.close();
-			}
-			close();
-		} else if (IDialogConstants.NO_ID == buttonId) {
-			handleFailure();
-		}
-	}
-	/* (non-Javadoc)
-	 * Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		// top level composite
-		Composite parentComposite = (Composite)super.createDialogArea(parent);
-
-
-		// create a composite with standard margins and spacing
-		Composite composite = new Composite(parentComposite, SWT.NONE);
-		composite.setSize(SIZING_WIDTH, SWT.DEFAULT);
-		GridLayout layout = new GridLayout();
-		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
-		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
-		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
-		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-
-		createTestSelectionGroup(composite);
-		createCheckListGroup(composite);
-
-
-		_queryLabel = new Label(composite, SWT.NONE);
-		_queryLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		initializeTest();
-		return composite;
-	}
-	/*
-	 * Group for selecting type of test.
-	 */
-	private void createTestSelectionGroup(Composite parent) {
-		Group group = new Group(parent, SWT.SHADOW_NONE);
-		group.setText("Testing:");
-		group.setLayout( new GridLayout() );
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		group.setLayoutData(data);
-		
-		for (int i = 0; i < _dialogTests.length; i++) {
-			Button radio = new Button(group, SWT.RADIO);
-			radio.setText( _dialogTests[i].label() );
-			final int testID = _dialogTests[i].getID();
-			radio.addSelectionListener(new SelectionAdapter() {
-				public void widgetSelected(SelectionEvent e) {
-					TEST_TYPE = testID;
-					initializeTest();
-					_yesButton.setEnabled(true);
-				}
-			});
-			if ( TEST_TYPE == _dialogTests[i].getID() ) {
-				radio.setSelection(true);
-			}
-		}
-	}
-	/*
-	 * Initializes the checklist with empty checks.
-	 */
-	private void createCheckListGroup(Composite parent) {
-		Group group = new Group(parent, SWT.SHADOW_NONE);
-		group.setText("Verify that:");
-		group.setLayout( new GridLayout() );
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		group.setLayoutData(data);
-		
-		int checkListSize = 0;
-		for (int i = 0; i < _dialogTests.length; i++) {
-			int size = _dialogTests[i].checkListTexts().size();
-			if (size > checkListSize) {
-				checkListSize = size;
-			}
-		}
-		_checkList = new Button[checkListSize];
-		SelectionAdapter selectionAdapter = new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				checkYesEnable();
-			}
-		};
-		for (int i = 0; i < checkListSize; i++) {
-			_checkList[i] = new Button(group, SWT.CHECK);
-			_checkList[i].addSelectionListener(selectionAdapter);
-			data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-			data.grabExcessHorizontalSpace = true;
-			_checkList[i].setLayoutData(data);
-		}		
-	}
-	/*
-	 * Disables the yes button if any of the items in the checklist
-	 * are unchecked.  Enables the yes button otherwise.
-	 */
-	private void checkYesEnable() {
-		boolean enable = true;
-		for (int i = 0; i < _checkList.length; i++) {
-			if ( !_checkList[i].getSelection() ) {
-				enable = false;
-			}			
-		}
-		_yesButton.setEnabled(enable);
-	}
-	/*
-	 * Initializes the checklist, banner texts, and query label
-	 */
-	private void initializeTest() {
-		IDialogTestPass test = _dialogTests[TEST_TYPE];
-		setTitle( test.title() );
-		setMessage( test.description() );
-		Iterator iterator = test.checkListTexts().iterator();
-		for (int i = 0; i < _checkList.length; i++) {
-			if ( iterator.hasNext() ) {
-				_checkList[i].setText( iterator.next().toString() );
-				_checkList[i].setVisible(true);
-				_checkList[i].update();
-			} else {
-				_checkList[i].setVisible(false);
-				_checkList[i].update();
-			}
-			_checkList[i].setSelection(true);
-		}
-		_queryLabel.setText( test.queryText() );
-	}
-	public String getFailureText() {
-		return _failureText;
-	}
-	/*
-	 * Can't open the verification dialog without a specified
-	 * test dialog, this simply returns a failure and prevents
-	 * opening.  Should use open(Dialog) instead.
-	 * 
-	 */
-	public int open() {
-		_failureText = "Testing dialog is required, use VerifyDialog::open(Dialog)";
-		return IDialogConstants.NO_ID;
-	}
-	/*
-	 * Opens the verification dialog to test the specified dialog.
-	 */
-	public int open(Dialog testDialog) {
-		if (getShell() == null) {
-			create();
-		}
-		getShell().setLocation(0, 0);
-		getShell().setSize(Math.max(SIZING_WIDTH, getShell().getSize().x), getShell().getSize().y);
-		_testDialog = testDialog;
-		if (_testDialog.getShell() == null) {
-			_testDialog.create();
-		}
-		_testDialogSize = _testDialog.getShell().getSize();
-		openNewTestDialog();
-		
-		return super.open();
-	}
-	/*
-	 * Opens the dialog to be verified.
-	 */
-	private void openNewTestDialog() {
-		if (_testDialog.getShell() == null) {
-			_testDialog.create();
-		}
-		_testDialog.setBlockOnOpen(false);
-		_testDialog.getShell().setLocation(getShell().getSize().x + 1, 0);
-		_testDialog.getShell().setSize(_testDialogSize);
-		_testDialog.getShell().addShellListener(new ShellAdapter() {
-			public void shellClosed(ShellEvent e) {				
-				e.doit = false;
-			}
-		
-		});		
-		_testDialog.open();
-	}
-	/*
-	 * The test dialog failed, open the failure dialog.
-	 */
-	private void handleFailure() {
-		IDialogTestPass test = _dialogTests[TEST_TYPE];
-		StringBuffer text = new StringBuffer();
-		String label = test.label();
-		label = label.substring(0, label.indexOf("&")) +
-		        label.substring(label.indexOf("&") + 1);
-		text.append(label).
-		     append(" failed on the ").
-		     append(SWT.getPlatform()).
-		     append(" platform:\n");
-		
-		String failureMessages[] = test.failureTexts();
-		for (int i = 0; i < test.checkListTexts().size(); i++) {
-			if ( !_checkList[i].getSelection() ) {
-				text.append("- ").append(failureMessages[i]).append("\n");
-			}
-		}
-		FailureDialog dialog = new FailureDialog( getShell() );
-		dialog.create();
-		dialog.setText( text.toString() );
-		if (dialog.open() == IDialogConstants.OK_ID) {
-			_failureText = dialog.toString();
-			setReturnCode(IDialogConstants.NO_ID);
-			if (_testDialog.getShell() != null) {
-				_testDialog.close();
-			}
-			close();
-		}
-	}
-	/*
-	 * In case the shell was closed by a means other than
-	 * the NO button.
-	 */
-	protected void handleShellCloseEvent() {
-		handleFailure();
-	}
-}
-
-
diff --git a/org.eclipse.jdt.ui.tests/test.xml b/org.eclipse.jdt.ui.tests/test.xml
deleted file mode 100644
index d211e89..0000000
--- a/org.eclipse.jdt.ui.tests/test.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<project name="testsuite" default="run" basedir=".">
-  <!-- The property ${eclipse-home} should be passed into this script -->
-  <!-- Set a meaningful default value for when it is not. -->
-  <property name="eclipse-home" value="${basedir}\..\.."/>
-
-  <!-- sets the properties eclipse-home, and library-file -->
-  <property name="plugin-name" value="org.eclipse.jdt.ui.tests"/>
-  <property name="library-file"
-            value="${eclipse-home}/plugins/org.eclipse.test/library.xml"/>
-
-  <!-- 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/>
-    <delete>
-      <fileset dir="${eclipse-home}" includes="org*.xml"/>
-    </delete>
-  </target>
-
-  <!-- This target defines the tests that need to be run. -->
-  <target name="suite">
-    <property name="jdt-folder" 
-              value="${eclipse-home}/jdt_folder"/>
-    <delete dir="${jdt-folder}" quiet="true"/>
-    <ant target="ui-test" antfile="${library-file}" dir="${eclipse-home}">
-      <property name="data-dir" value="${jdt-folder}"/>
-      <property name="plugin-name" value="${plugin-name}"/>
-      <property name="classname" 
-                value="org.eclipse.jdt.ui.tests.AutomatedSuite"/>
-    </ant>
-  </target>
-
-  <!-- This target holds code to cleanup the testing environment after -->
-  <!-- after all of the tests have been run. You can use this target to -->
-  <!-- delete temporary files that have been created. -->
-  <target name="cleanup">
-  </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="${plugin-name}.xml"/>
-    </ant>
-  </target>
-
-</project>
diff --git a/org.eclipse.jdt.ui.tests/testresources/compoundtest.jar b/org.eclipse.jdt.ui.tests/testresources/compoundtest.jar
deleted file mode 100644
index ae5ea24..0000000
--- a/org.eclipse.jdt.ui.tests/testresources/compoundtest.jar
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/testresources/junit37-noUI-src.zip b/org.eclipse.jdt.ui.tests/testresources/junit37-noUI-src.zip
deleted file mode 100644
index 4f95d30..0000000
--- a/org.eclipse.jdt.ui.tests/testresources/junit37-noUI-src.zip
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/testresources/myinternallib.jar b/org.eclipse.jdt.ui.tests/testresources/myinternallib.jar
deleted file mode 100644
index 22228df..0000000
--- a/org.eclipse.jdt.ui.tests/testresources/myinternallib.jar
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/testresources/mylib.jar b/org.eclipse.jdt.ui.tests/testresources/mylib.jar
deleted file mode 100644
index 140e3c6..0000000
--- a/org.eclipse.jdt.ui.tests/testresources/mylib.jar
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/testresources/rtstubs.jar b/org.eclipse.jdt.ui.tests/testresources/rtstubs.jar
deleted file mode 100644
index cf3edc3..0000000
--- a/org.eclipse.jdt.ui.tests/testresources/rtstubs.jar
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/AutomatedSuite.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/AutomatedSuite.java
deleted file mode 100644
index 64ef361..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/AutomatedSuite.java
+++ /dev/null
@@ -1,73 +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.jdt.ui.tests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.ui.tests.astrewrite.ASTRewritingTest;
-import org.eclipse.jdt.ui.tests.browsing.PackagesViewContentProviderTests;
-import org.eclipse.jdt.ui.tests.browsing.PackagesViewDeltaTests;
-import org.eclipse.jdt.ui.tests.callhierarchy.CallHierarchyContentProviderTest;
-import org.eclipse.jdt.ui.tests.core.CoreTests;
-import org.eclipse.jdt.ui.tests.packageview.ContentProviderTests1;
-import org.eclipse.jdt.ui.tests.packageview.ContentProviderTests2;
-import org.eclipse.jdt.ui.tests.packageview.ContentProviderTests3;
-import org.eclipse.jdt.ui.tests.packageview.ContentProviderTests4;
-import org.eclipse.jdt.ui.tests.quickfix.QuickFixTest;
-import org.eclipse.jdt.ui.tests.text.HTML2TextReaderTester;
-import org.eclipse.jdt.ui.tests.text.JavaDoc2HTMLTextReaderTester;
-import org.eclipse.jdt.ui.tests.text.JavaHeuristicScannerTest;
-import org.eclipse.jdt.ui.tests.text.SmartSemicolonAutoEditStrategyTest;
-import org.eclipse.jdt.ui.tests.wizardapi.NewJavaProjectWizardTest;
-
-
-/**
- * Test all areas of the UI.
- */
-public class AutomatedSuite extends TestSuite {
-
-	/**
-	 * Returns the suite.  This is required to
-	 * use the JUnit Launcher.
-	 */
-	public static Test suite() {
-		return new AutomatedSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public AutomatedSuite() {
-		addTest(CoreTests.suite());
-		addTest(ASTRewritingTest.suite());
-		addTest(QuickFixTest.suite());
-		
-		addTest(NewJavaProjectWizardTest.suite());
-		
-		addTest(JavaDoc2HTMLTextReaderTester.suite());
-		addTest(HTML2TextReaderTester.suite());
-		addTest(ContentProviderTests1.suite());
-		addTest(ContentProviderTests2.suite());
-		addTest(ContentProviderTests3.suite());
-		addTest(ContentProviderTests4.suite());	
-		
-		addTest(PackagesViewContentProviderTests.suite());
-		addTest(PackagesViewDeltaTests.suite());
-		
-		addTest(CallHierarchyContentProviderTest.suite());
-		
-		addTest(JavaHeuristicScannerTest.suite());
-		addTest(SmartSemicolonAutoEditStrategyTest.suite());
-	}
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/UIInteractiveSuite.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/UIInteractiveSuite.java
deleted file mode 100644
index 9681eac..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/UIInteractiveSuite.java
+++ /dev/null
@@ -1,42 +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.jdt.ui.tests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.ui.tests.dialogs.DialogsTest;
-import org.eclipse.jdt.ui.tests.dialogs.PreferencesTest;
-import org.eclipse.jdt.ui.tests.dialogs.WizardsTest;
-
-/**
- * Test all areas of the UI.
- */
-public class UIInteractiveSuite extends TestSuite {
-
-	/**
-	 * Returns the suite.  This is required to
-	 * use the JUnit Launcher.
-	 */
-	public static Test suite() {
-		return new UIInteractiveSuite();
-	}
-
-	/**
-	 * Construct the test suite.
-	 */
-	public UIInteractiveSuite() {
-		addTest(PreferencesTest.suite());
-		addTest(WizardsTest.suite());
-		addTest(DialogsTest.suite());
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingCollapseTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingCollapseTest.java
deleted file mode 100644
index 6bdf76c..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingCollapseTest.java
+++ /dev/null
@@ -1,329 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 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.jdt.ui.tests.astrewrite;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.Block;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.ExpressionStatement;
-import org.eclipse.jdt.core.dom.IfStatement;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.MethodInvocation;
-import org.eclipse.jdt.core.dom.ReturnStatement;
-import org.eclipse.jdt.core.dom.Statement;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodeConstants;
-import org.eclipse.jdt.internal.corext.dom.ASTRewrite;
-import org.eclipse.jdt.internal.corext.dom.NodeFinder;
-
-public class ASTRewritingCollapseTest extends ASTRewritingTest {
-	
-	private static final Class THIS= ASTRewritingCollapseTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ASTRewritingCollapseTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTRewritingCollapseTest("testCollapsedTargetNodes2"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-// tests for collapse	
-	
-	
-	public void testCollapsedTargetNodes() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		String str= "return;";
-		ReturnStatement returnStatement= (ReturnStatement) NodeFinder.perform(astRoot, buf.indexOf(str), str.length());
-		
-		MethodInvocation newMethodInv1= ast.newMethodInvocation();
-		newMethodInv1.setName(ast.newSimpleName("foo1"));
-		ExpressionStatement st1= ast.newExpressionStatement(newMethodInv1);
-		
-		MethodInvocation newMethodInv2= ast.newMethodInvocation();
-		newMethodInv2.setName(ast.newSimpleName("foo2"));
-		ExpressionStatement st2= ast.newExpressionStatement(newMethodInv2);
-		
-		Block placeholder= rewrite.getCollapseTargetPlaceholder(new Statement[] { st1, st2 });
-		rewrite.markAsReplaced(returnStatement, placeholder);
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        foo1();\n");
-		buf.append("        foo2();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();		
-
-		assertEqualString(preview, expected);
-	}
-	
-	public void testCollapsedTargetNodes2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		String str= "return;";
-		ReturnStatement returnStatement= (ReturnStatement) NodeFinder.perform(astRoot, buf.indexOf(str), str.length());
-		
-		MethodInvocation newMethodInv1= ast.newMethodInvocation();
-		newMethodInv1.setName(ast.newSimpleName("foo1"));
-		ExpressionStatement st1= ast.newExpressionStatement(newMethodInv1);
-		
-		MethodInvocation newMethodInv2= ast.newMethodInvocation();
-		newMethodInv2.setName(ast.newSimpleName("foo2"));
-		ExpressionStatement st2= ast.newExpressionStatement(newMethodInv2);
-		
-		ReturnStatement st3= (ReturnStatement) rewrite.createCopyPlaceholder(returnStatement);
-		
-		Block placeholder= rewrite.getCollapseTargetPlaceholder(new Statement[] { st1, st2, st3 });
-		rewrite.markAsReplaced(returnStatement.getParent(), placeholder);
-		
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        foo1();\n");
-		buf.append("        foo2();\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();		
-
-		assertEqualString(preview, expected);
-	}
-	
-	
-	public void testMoveCollapsedCD() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            foo();\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		{
-			List statements= methodDecl.getBody().statements();
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			List ifStatementBody= ((Block) ifStatement.getThenStatement()).statements();
-			ASTNode collapsed= rewrite.collapseNodes(ifStatementBody, 0, ifStatementBody.size());
-			
-			ASTNode placeholder= rewrite.createCopyPlaceholder(collapsed);
-			rewrite.markAsRemoved(collapsed);
-			
-			rewrite.getListRewrite(methodDecl.getBody(), ASTNodeConstants.STATEMENTS).insertLast(placeholder, null);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("        }\n");
-		buf.append("        foo();\n");
-		buf.append("        i++; // comment\n");
-		buf.append("        i++;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void testMoveCollapsed() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            foo();\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		{
-			List statements= methodDecl.getBody().statements();
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			List ifStatementBody= ((Block) ifStatement.getThenStatement()).statements();
-			ASTNode collapsed= rewrite.collapseNodes(ifStatementBody, 0, ifStatementBody.size());
-			
-			ASTNode placeholder= rewrite.createMovePlaceholder(collapsed);
-			rewrite.getListRewrite(methodDecl.getBody(), ASTNodeConstants.STATEMENTS).insertLast(placeholder, null);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("        }\n");
-		buf.append("        foo();\n");
-		buf.append("        i++; // comment\n");
-		buf.append("        i++;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}		
-	
-	public void testReplaceCollapsed() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            foo();\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		{
-			List statements= methodDecl.getBody().statements();
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			List ifStatementBody= ((Block) ifStatement.getThenStatement()).statements();
-			ASTNode collapsed= rewrite.collapseNodes(ifStatementBody, 0, ifStatementBody.size());
-			
-			ASTNode newStatement= ast.newReturnStatement();
-			rewrite.markAsReplaced(collapsed, newStatement);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            return;\n");		
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}	
-
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingExpressionsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingExpressionsTest.java
deleted file mode 100644
index d3519c4..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingExpressionsTest.java
+++ /dev/null
@@ -1,1583 +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.jdt.ui.tests.astrewrite;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.*;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodeConstants;
-import org.eclipse.jdt.internal.corext.dom.NewASTRewrite;
-
-public class ASTRewritingExpressionsTest extends ASTRewritingTest {
-	private static final Class THIS= ASTRewritingExpressionsTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ASTRewritingExpressionsTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTRewritingExpressionsTest("testThisExpression"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	
-	
-	public void testArrayAccess() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    int[] o= new int[] { 1, 2, 3 };\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        o[3 /* comment*/ - 1]= this.o[3 - 1];\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{	// replace left hand side index, replace right hand side index by left side index
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			ArrayAccess left= (ArrayAccess) assignment.getLeftHandSide();
-			ArrayAccess right= (ArrayAccess) assignment.getRightHandSide();
-			
-			NumberLiteral name= ast.newNumberLiteral("1");
-			rewrite.markAsReplaced(left.getIndex(), name);
-			
-			ASTNode placeHolder= rewrite.createCopyPlaceholder(left.getIndex());
-			rewrite.markAsReplaced(right.getIndex(), placeHolder);
-			
-			SimpleName newName= ast.newSimpleName("o");
-			rewrite.markAsReplaced(right.getArray(), newName);
-		}
-
-				
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    int[] o= new int[] { 1, 2, 3 };\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        o[1]= o[3 /* comment*/ - 1];\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-			
-		assertEqualString(preview, buf.toString());
-	}
-
-
-	public void testArrayCreation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(new int[] { 1, 2, 3 },\n");
-		buf.append("        new int[] { 1, 2, 3 },\n");
-		buf.append("        new int[2][][],\n");
-		buf.append("        new int[2][][],\n");
-		buf.append("        new int[2][][],\n");
-		buf.append("        new int[2][][]);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		ExpressionStatement statement= (ExpressionStatement) statements.get(0);
-		MethodInvocation invocation= (MethodInvocation) statement.getExpression();
-		List args= invocation.arguments();
-		assertTrue("Number of arguments not 6", args.size() == 6);
-		
-		{	// replace the element type and increase the dimension
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(0);
-			ArrayType arrayType= arrayCreation.getType();
-			
-			PrimitiveType floatType= ast.newPrimitiveType(PrimitiveType.FLOAT); 
-			ArrayType newArrayType= ast.newArrayType(floatType, 2);
-			
-			rewrite.markAsReplaced(arrayType, newArrayType);
-		}
-		{	// remove the initializer, add a dimension expression
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(1);
-			rewrite.markAsRemoved(arrayCreation.getInitializer());
-			
-			List dimensions= arrayCreation.dimensions();
-			assertTrue("Number of dimension expressions not 0", dimensions.size() == 0);
-			
-			NumberLiteral literal= ast.newNumberLiteral("10");
-			
-			rewrite.getListRewrite(arrayCreation, ASTNodeConstants.DIMENSIONS).insertLast(literal, null);
-		}
-		{	// remove all dimension except one, no dimension expression
-			// insert the initializer: formatter problems
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(2);
-			ArrayType arrayType= arrayCreation.getType();			
-			PrimitiveType intType= ast.newPrimitiveType(PrimitiveType.INT); 
-			ArrayType newArrayType= ast.newArrayType(intType, 1);
-			
-			rewrite.markAsReplaced(arrayType, newArrayType);
-			
-			List dimensions= arrayCreation.dimensions();
-			assertTrue("Number of dimension expressions not 1", dimensions.size() == 1);
-			
-			rewrite.markAsRemoved((ASTNode) dimensions.get(0));
-			
-			ArrayInitializer initializer= ast.newArrayInitializer();
-			List expressions= initializer.expressions();
-			expressions.add(ast.newNumberLiteral("10"));
-		}
-		{	// add 2 dimension expressions
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(3);
-			
-			List dimensions= arrayCreation.dimensions();
-			assertTrue("Number of dimension expressions not 1", dimensions.size() == 1);
-			
-			NumberLiteral literal1= ast.newNumberLiteral("10");
-			rewrite.getListRewrite(arrayCreation, ASTNodeConstants.DIMENSIONS).insertLast(literal1, null);
-
-			NumberLiteral literal2= ast.newNumberLiteral("11");
-			rewrite.getListRewrite(arrayCreation, ASTNodeConstants.DIMENSIONS).insertLast(literal2, null);
-
-		}
-		{	// add 2 empty dimensions
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(4);
-			ArrayType arrayType= arrayCreation.getType();
-			assertTrue("Number of dimension not 3", arrayType.getDimensions() == 3);
-			
-			PrimitiveType intType= ast.newPrimitiveType(PrimitiveType.INT); 
-			ArrayType newArrayType= ast.newArrayType(intType, 5);
-			
-			rewrite.markAsReplaced(arrayType, newArrayType);
-		}
-		{	// replace dimension expression, add a dimension expression
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(5);
-
-			List dimensions= arrayCreation.dimensions();
-			assertTrue("Number of dimension expressions not 1", dimensions.size() == 1);
-
-			NumberLiteral literal1= ast.newNumberLiteral("10");
-			rewrite.markAsReplaced((ASTNode) dimensions.get(0), literal1);
-			
-			NumberLiteral literal2= ast.newNumberLiteral("11");
-			rewrite.getListRewrite(arrayCreation, ASTNodeConstants.DIMENSIONS).insertLast(literal2, null);
-
-		}			
-				
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(new float[][] { 1, 2, 3 },\n");
-		buf.append("        new int[10],\n");
-		buf.append("        new int[],\n");
-		buf.append("        new int[2][10][11],\n");
-		buf.append("        new int[2][][][][],\n");
-		buf.append("        new int[10][11][]);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-		
-	public void testArrayInitializer() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(new int[] { 1, 2, 3 },\n");
-		buf.append("        new int[] { 1, 2, 3 },\n");
-		buf.append("        new int[] { 1, 2, 3 });\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		ExpressionStatement statement= (ExpressionStatement) statements.get(0);
-		MethodInvocation invocation= (MethodInvocation) statement.getExpression();
-		List args= invocation.arguments();
-	
-		{	// remove first and last initializer expression
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(0);
-			ArrayInitializer initializer= arrayCreation.getInitializer();
-			
-			List expressions= initializer.expressions();
-			assertTrue("Number of initializer expressions not 3", expressions.size() == 3);
-			
-			rewrite.markAsRemoved((ASTNode) expressions.get(0));
-			rewrite.markAsRemoved((ASTNode) expressions.get(2));
-		}
-		{	// insert at second and last position
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(1);
-			ArrayInitializer initializer= arrayCreation.getInitializer();
-			
-			List expressions= initializer.expressions();
-			assertTrue("Number of initializer expressions not 3", expressions.size() == 3);
-
-			NumberLiteral literal1= ast.newNumberLiteral("10");
-			rewrite.getListRewrite(initializer, ASTNodeConstants.EXPRESSIONS).insertAfter(literal1, (ASTNode) expressions.get(0), null);
-			
-			NumberLiteral literal2= ast.newNumberLiteral("11");
-			rewrite.getListRewrite(initializer, ASTNodeConstants.EXPRESSIONS).insertLast(literal2, null);
-
-		}		
-		{	// replace first and last initializer expression
-			ArrayCreation arrayCreation= (ArrayCreation) args.get(2);
-			ArrayInitializer initializer= arrayCreation.getInitializer();
-			
-			List expressions= initializer.expressions();
-			assertTrue("Number of initializer expressions not 3", expressions.size() == 3);
-
-			NumberLiteral literal1= ast.newNumberLiteral("10");
-			NumberLiteral literal2= ast.newNumberLiteral("11");
-			
-			rewrite.markAsReplaced((ASTNode) expressions.get(0), literal1);
-			rewrite.markAsReplaced((ASTNode) expressions.get(2), literal2);
-		}		
-				
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(new int[] { 2 },\n");
-		buf.append("        new int[] { 1, 10, 2, 3, 11 },\n");
-		buf.append("        new int[] { 10, 2, 11 });\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	
-	public void testAssignment() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int i, j;\n");
-		buf.append("        i= 0;\n");
-		buf.append("        i-= j= 3;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-		{ // change left side & right side
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(1);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			SimpleName name= ast.newSimpleName("j");
-			rewrite.markAsReplaced(assignment.getLeftHandSide(), name);
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("goo"));
-			invocation.setExpression(ast.newSimpleName("other"));
-			
-			rewrite.markAsReplaced(assignment.getRightHandSide(), invocation);
-		}
-		{ // change operator and operator of inner
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(2);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			rewrite.markAsReplaced(assignment, ASTNodeConstants.OPERATOR, Assignment.Operator.DIVIDE_ASSIGN, null);
-			
-			Assignment inner= (Assignment) assignment.getRightHandSide();
-						
-			rewrite.markAsReplaced(inner, ASTNodeConstants.OPERATOR, Assignment.Operator.RIGHT_SHIFT_UNSIGNED_ASSIGN, null);
-		}
-				
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int i, j;\n");
-		buf.append("        j= other.goo();\n");
-		buf.append("        i/= j>>>= 3;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-
-	public void testCastExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        x= (E) clone();\n");
-		buf.append("        z= y.toList();\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 2", statements.size() == 2);
-		{ // change cast type and cast expression
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			CastExpression expression= (CastExpression) assignment.getRightHandSide();
-			SimpleType newType= ast.newSimpleType(ast.newSimpleName("SuperE"));
-			rewrite.markAsReplaced(expression.getType(), newType);
-			
-			SimpleName newExpression= ast.newSimpleName("a");
-			rewrite.markAsReplaced(expression.getExpression(), newExpression);
-		}
-		{ // create cast
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(1);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			Expression rightHand= assignment.getRightHandSide();
-			
-			Expression placeholder= (Expression) rewrite.createCopyPlaceholder(rightHand);
-			
-			CastExpression newCastExpression= ast.newCastExpression();
-			newCastExpression.setType(ast.newSimpleType(ast.newSimpleName("List")));
-			newCastExpression.setExpression(placeholder);
-			
-			rewrite.markAsReplaced(rightHand, newCastExpression);
-		}	
-				
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        x= (SuperE) a;\n");
-		buf.append("        z= (List) y.toList();\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	
-	public void testCastExpression_bug28824() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        z= foo().y.toList();\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // create cast
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			Expression rightHand= assignment.getRightHandSide();
-			
-			String rightHandString= cu.getBuffer().getText(rightHand.getStartPosition(), rightHand.getLength());
-			assertEqualString(rightHandString, "foo().y.toList()");
-			
-			Expression placeholder= (Expression) rewrite.createCopyPlaceholder(rightHand);
-			
-			CastExpression newCastExpression= ast.newCastExpression();
-			newCastExpression.setType(ast.newSimpleType(ast.newSimpleName("List")));
-			newCastExpression.setExpression(placeholder);
-			
-			rewrite.markAsReplaced(rightHand, newCastExpression);
-		}		
-				
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        z= (List) foo().y.toList();\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	
-	public void testCatchClause() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } catch (CoreException e) {\n");
-		buf.append("        }\n");			
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 1);
-		List catchClauses= ((TryStatement) statements.get(0)).catchClauses();
-		assertTrue("Number of catchClauses not 2", catchClauses.size() == 2);
-		{ // change exception type
-			CatchClause clause= (CatchClause) catchClauses.get(0);
-			
-			SingleVariableDeclaration exception= clause.getException();
-			
-			SingleVariableDeclaration newException= ast.newSingleVariableDeclaration();
-						
-			newException.setType(ast.newSimpleType(ast.newSimpleName("NullPointerException")));
-			newException.setName(ast.newSimpleName("ex"));
-			
-			rewrite.markAsReplaced(exception, newException);
-		}
-		{ // change body
-			CatchClause clause= (CatchClause) catchClauses.get(1);
-			Block body= clause.getBody();
-			
-			Block newBody= ast.newBlock();
-			ReturnStatement returnStatement= ast.newReturnStatement();
-			newBody.statements().add(returnStatement);
-			
-			rewrite.markAsReplaced(body, newBody);
-		}
-				
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");
-		buf.append("        } catch (NullPointerException ex) {\n");
-		buf.append("        } catch (CoreException e) {\n");
-		buf.append("            return;\n");	
-		buf.append("        }\n");			
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-
-	public void testClassInstanceCreation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo().new Inner();\n");
-		buf.append("        new Runnable(\"Hello\") {\n");
-		buf.append("            public void run() {\n");
-		buf.append("            }\n");		
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 2", statements.size() == 2);
-		{ // remove expression, change type name, add argument, add anonym decl
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			ClassInstanceCreation creation= (ClassInstanceCreation) stmt.getExpression();
-
-			rewrite.markAsRemoved(creation.getExpression());
-			
-			SimpleName newName= ast.newSimpleName("NewInner");
-			rewrite.markAsReplaced(creation.getName(), newName);
-			
-			StringLiteral stringLiteral1= ast.newStringLiteral();
-			stringLiteral1.setLiteralValue("Hello");
-			rewrite.getListRewrite(creation, ASTNodeConstants.ARGUMENTS).insertLast(stringLiteral1, null);
-
-			
-			StringLiteral stringLiteral2= ast.newStringLiteral();
-			stringLiteral2.setLiteralValue("World");
-			rewrite.getListRewrite(creation, ASTNodeConstants.ARGUMENTS).insertLast(stringLiteral2, null);
-			
-			assertTrue("Has anonym class decl", creation.getAnonymousClassDeclaration() == null);
-			
-			AnonymousClassDeclaration anonymDecl= ast.newAnonymousClassDeclaration();
-			MethodDeclaration anonymMethDecl= createNewMethod(ast, "newMethod", false);
-			anonymDecl.bodyDeclarations().add(anonymMethDecl);
-			
-			rewrite.markAsInsert(creation, ASTNodeConstants.ANONYMOUS_CLASS_DECLARATION, anonymDecl, null);			
-
-		}
-		{ // add expression, remove argument, remove anonym decl 
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(1);
-			ClassInstanceCreation creation= (ClassInstanceCreation) stmt.getExpression();
-
-			assertTrue("Has expression", creation.getExpression() == null);
-			
-			SimpleName newExpression= ast.newSimpleName("x");
-			rewrite.markAsInsert(creation, ASTNodeConstants.EXPRESSION, newExpression, null);			
-
-			
-			List arguments= creation.arguments();
-			assertTrue("Must have 1 argument", arguments.size() == 1);
-			
-			rewrite.markAsRemoved((ASTNode) arguments.get(0));
-			
-			rewrite.markAsRemoved(creation.getAnonymousClassDeclaration());
-		}
-		
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new NewInner(\"Hello\", \"World\") {\n");
-		buf.append("            private void newMethod(String str) {\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("        x.new Runnable();\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	public void testConditionalExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= (k == 0) ? 1 : 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // change compare expression, then expression & else expression
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			ConditionalExpression condExpression= (ConditionalExpression) assignment.getRightHandSide();
-			
-			BooleanLiteral literal= ast.newBooleanLiteral(true);
-			rewrite.markAsReplaced(condExpression.getExpression(), literal);
-			
-			SimpleName newThenExpre= ast.newSimpleName("x");
-			rewrite.markAsReplaced(condExpression.getThenExpression(), newThenExpre);
-			
-			InfixExpression infixExpression= ast.newInfixExpression();
-			infixExpression.setLeftOperand(ast.newNumberLiteral("1"));
-			infixExpression.setRightOperand(ast.newNumberLiteral("2"));
-			infixExpression.setOperator(InfixExpression.Operator.PLUS);
-			
-			rewrite.markAsReplaced(condExpression.getElseExpression(), infixExpression);
-		}
-		
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= true ? x : 1 + 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	public void testFieldAccess() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        foo().i= goo().i;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // replace field expression, replace field name
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			FieldAccess leftFieldAccess= (FieldAccess) assignment.getLeftHandSide();
-			FieldAccess rightFieldAccess= (FieldAccess) assignment.getRightHandSide();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("xoo"));
-			rewrite.markAsReplaced(leftFieldAccess.getExpression(), invocation);
-			
-			SimpleName newName= ast.newSimpleName("x");
-			rewrite.markAsReplaced(leftFieldAccess.getName(), newName);
-
-			SimpleName rightHand= ast.newSimpleName("b");
-			rewrite.markAsReplaced(rightFieldAccess.getExpression(), rightHand);
-		}
-		
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        xoo().x= b.i;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	public void testInfixExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= 1 + 2;\n");
-		buf.append("        j= 1 + 2 + 3 + 4 + 5;\n");
-		buf.append("        k= 1 + 2 + 3 + 4 + 5;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-		{ // change left side & right side & operand
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			InfixExpression expr= (InfixExpression) assignment.getRightHandSide();
-			
-			SimpleName leftOp= ast.newSimpleName("k");
-			rewrite.markAsReplaced(expr.getLeftOperand(), leftOp);	
-
-			SimpleName rightOp= ast.newSimpleName("j");
-			rewrite.markAsReplaced(expr.getRightOperand(), rightOp);	
-			
-			// change operand
-			rewrite.markAsReplaced(expr, ASTNodeConstants.OPERATOR, InfixExpression.Operator.MINUS, null);
-		}
-		
-		{ // remove an ext. operand, add one and replace one
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(1);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			InfixExpression expr= (InfixExpression) assignment.getRightHandSide();
-			
-			List extendedOperands= expr.extendedOperands();
-			assertTrue("Number of extendedOperands not 3", extendedOperands.size() == 3);
-			
-			rewrite.markAsRemoved((ASTNode) extendedOperands.get(0));
-			
-			SimpleName newOp1= ast.newSimpleName("k");
-			rewrite.markAsReplaced((ASTNode) extendedOperands.get(1), newOp1);
-			
-			SimpleName newOp2= ast.newSimpleName("n");
-			rewrite.getListRewrite(expr, ASTNodeConstants.EXTENDED_OPERANDS).insertLast(newOp2, null);
-
-		}
-		
-		{ // change operand
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(2);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			InfixExpression expr= (InfixExpression) assignment.getRightHandSide();			
-			
-			rewrite.markAsReplaced(expr, ASTNodeConstants.OPERATOR, InfixExpression.Operator.TIMES, null);
-		}			
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= k - j;\n");
-		buf.append("        j= 1 + 2 + k + 5 + n;\n");
-		buf.append("        k= 1 * 2 * 3 * 4 * 5;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-
-	public void testInstanceofExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(k instanceof Vector);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // change left side & right side
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			MethodInvocation invocation= (MethodInvocation) stmt.getExpression();
-			
-			List arguments= invocation.arguments();
-			InstanceofExpression expr= (InstanceofExpression) arguments.get(0);
-			
-			SimpleName name= ast.newSimpleName("x");
-			rewrite.markAsReplaced(expr.getLeftOperand(), name);
-			
-			Type newCastType= ast.newSimpleType(ast.newSimpleName("List"));
-
-			rewrite.markAsReplaced(expr.getRightOperand(), newCastType);
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(x instanceof List);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	public void testMethodInvocation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        foo(1, 2).goo();\n");
-		buf.append("        foo(1, 2).goo();\n");
-		buf.append("        foo(1, 2).goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-		{ // remove expression, add param, change name
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			MethodInvocation invocation= (MethodInvocation) stmt.getExpression();
-			
-			rewrite.markAsRemoved(invocation.getExpression());
-			
-			SimpleName name= ast.newSimpleName("x");
-			rewrite.markAsReplaced(invocation.getName(), name);
-			
-			ASTNode arg= ast.newNumberLiteral("1");
-			rewrite.getListRewrite(invocation, ASTNodeConstants.ARGUMENTS).insertLast(arg, null);
-
-		}
-		{ // insert expression, delete params
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(1);
-			MethodInvocation invocation= (MethodInvocation) stmt.getExpression();
-			
-			MethodInvocation leftInvocation= (MethodInvocation) invocation.getExpression();
-			
-			SimpleName newExpression= ast.newSimpleName("x");
-			rewrite.markAsInsert(leftInvocation, ASTNodeConstants.EXPRESSION, newExpression, null);
-			
-			List args= leftInvocation.arguments();
-			rewrite.markAsRemoved((ASTNode) args.get(0));
-			rewrite.markAsRemoved((ASTNode) args.get(1));
-		}
-		{ // remove expression, add it as parameter
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(2);
-			MethodInvocation invocation= (MethodInvocation) stmt.getExpression();
-			
-			ASTNode placeHolder= rewrite.createCopyPlaceholder(invocation.getExpression());
-			
-			rewrite.markAsRemoved(invocation, ASTNodeConstants.EXPRESSION, null);
-
-			rewrite.getListRewrite(invocation, ASTNodeConstants.ARGUMENTS).insertLast(placeHolder, null);
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        x(1);\n");
-		buf.append("        x.foo().goo();\n");		
-		buf.append("        goo(foo(1, 2));\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-
-	public void testMethodParamsRenameReorder() throws Exception {
-		if (true)
-			return;
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void m(boolean y, int a) {\n");
-		buf.append("        m(y, a);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "m");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ 
-			//params 
-			List params= methodDecl.parameters();
-			SingleVariableDeclaration firstParam= (SingleVariableDeclaration) params.get(0);
-			SingleVariableDeclaration secondParam= (SingleVariableDeclaration) params.get(1);
-
-			//args
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			MethodInvocation invocation= (MethodInvocation) stmt.getExpression();
-			List arguments= invocation.arguments();
-			SimpleName first= (SimpleName) arguments.get(0);
-			SimpleName second= (SimpleName) arguments.get(1);
-			
-
-			//rename args
-			SimpleName newFirstArg= methodDecl.getAST().newSimpleName("yyy");
-			SimpleName newSecondArg= methodDecl.getAST().newSimpleName("bb");
-			rewrite.markAsReplaced(first, newFirstArg);
-			rewrite.markAsReplaced(second, newSecondArg);
-			
-
-			//rename params
-			SimpleName newFirstName= methodDecl.getAST().newSimpleName("yyy");
-			SimpleName newSecondName= methodDecl.getAST().newSimpleName("bb");
-			rewrite.markAsReplaced(firstParam.getName(), newFirstName);
-			rewrite.markAsReplaced(secondParam.getName(), newSecondName);
-			
-			//reoder params
-			ASTNode paramplaceholder1= rewrite.createCopyPlaceholder(firstParam);
-			ASTNode paramplaceholder2= rewrite.createCopyPlaceholder(secondParam);
-			
-			rewrite.markAsReplaced(firstParam, paramplaceholder2);
-			rewrite.markAsReplaced(secondParam, paramplaceholder1);
-			
-			//reorder args
-			ASTNode placeholder1= rewrite.createCopyPlaceholder(first);
-			ASTNode placeholder2= rewrite.createCopyPlaceholder(second);
-			
-			rewrite.markAsReplaced(first, placeholder2);
-			rewrite.markAsReplaced(second, placeholder1);
-
-			
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void m(int bb, boolean yyy) {\n");
-		buf.append("        m(bb, yyy);\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	public void testMethodInvocation1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        foo(foo(1, 2), 3);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // remove expression, add param, change name
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			MethodInvocation invocation= (MethodInvocation) stmt.getExpression();
-			
-			List arguments= invocation.arguments();
-			MethodInvocation first= (MethodInvocation) arguments.get(0);
-			ASTNode second= (ASTNode) arguments.get(1);
-			
-			ASTNode placeholder1= rewrite.createCopyPlaceholder(first);
-			ASTNode placeholder2= rewrite.createCopyPlaceholder(second);
-			
-			rewrite.markAsReplaced(first, placeholder2);
-			rewrite.markAsReplaced(second, placeholder1);
-			
-			List innerArguments= first.arguments();
-			ASTNode innerFirst= (ASTNode) innerArguments.get(0);
-			ASTNode innerSecond= (ASTNode) innerArguments.get(1);
-			
-			ASTNode innerPlaceholder1= rewrite.createCopyPlaceholder(innerFirst);
-			ASTNode innerPlaceholder2= rewrite.createCopyPlaceholder(innerSecond);
-			
-			rewrite.markAsReplaced(innerFirst, innerPlaceholder2);
-			rewrite.markAsReplaced(innerSecond, innerPlaceholder1);			
-			
-			
-			
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        foo(3, foo(2, 1));\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		assertEqualString(preview, buf.toString());
-		
-	}	
-	
-	public void testParenthesizedExpression() throws Exception {
-		//System.out.println(getClass().getName()+"::" + getName() +" disabled (bug 23362)");
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= (1 + 2) * 3;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // replace expression
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			InfixExpression multiplication= (InfixExpression) assignment.getRightHandSide();
-			
-			ParenthesizedExpression parenthesizedExpression= (ParenthesizedExpression) multiplication.getLeftOperand();
-						
-			SimpleName name= ast.newSimpleName("x");
-			rewrite.markAsReplaced(parenthesizedExpression.getExpression(), name);
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= (x) * 3;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-		
-	}
-	
-	public void testPrefixExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= --x;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // modify operand and operation
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			PrefixExpression preExpression= (PrefixExpression) assignment.getRightHandSide();
-					
-			NumberLiteral newOperation= ast.newNumberLiteral("10");
-			rewrite.markAsReplaced(preExpression.getOperand(), newOperation);
-			
-			rewrite.markAsReplaced(preExpression, ASTNodeConstants.OPERATOR, PrefixExpression.Operator.COMPLEMENT, null);
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= ~10;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}	
-	
-	public void testPostfixExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= x--;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // modify operand and operation
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			
-			PostfixExpression postExpression= (PostfixExpression) assignment.getRightHandSide();
-					
-			NumberLiteral newOperation= ast.newNumberLiteral("10");
-			rewrite.markAsReplaced(postExpression.getOperand(), newOperation);
-			
-			rewrite.markAsReplaced(postExpression, ASTNodeConstants.OPERATOR, PostfixExpression.Operator.INCREMENT, null);
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= 10++;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}		
-
-	public void testSuperConstructorInvocation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("    }\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        foo(i + i).super(i);\n");
-		buf.append("    }\n");
-		buf.append("    public E(int i, int k) {\n");
-		buf.append("        Outer.super(foo(goo(x)), 1);\n");
-		buf.append("    }\n");	
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		List bodyDeclarations= type.bodyDeclarations();
-		assertTrue("Number of bodyDeclarations not 3", bodyDeclarations.size() == 3);
-		{ // add expresssion & parameter
-			MethodDeclaration methodDecl= (MethodDeclaration) bodyDeclarations.get(0);
-			SuperConstructorInvocation invocation= (SuperConstructorInvocation) methodDecl.getBody().statements().get(0);
-
-			SimpleName newExpression= ast.newSimpleName("x");
-			rewrite.markAsInsert(invocation, ASTNodeConstants.EXPRESSION, newExpression, null);
-
-			ASTNode arg= ast.newNumberLiteral("1");
-			rewrite.getListRewrite(invocation, ASTNodeConstants.ARGUMENTS).insertLast(arg, null);
-
-		}
-		{ // remove expression, replace argument with argument of expression
-			MethodDeclaration methodDecl= (MethodDeclaration) bodyDeclarations.get(1);
-			SuperConstructorInvocation invocation= (SuperConstructorInvocation) methodDecl.getBody().statements().get(0);
-
-			MethodInvocation expression= (MethodInvocation) invocation.getExpression();
-			rewrite.markAsRemoved(expression);
-			
-			ASTNode placeHolder= rewrite.createCopyPlaceholder((ASTNode) expression.arguments().get(0));
-			
-			ASTNode arg1= (ASTNode) invocation.arguments().get(0);
-			
-			rewrite.markAsReplaced(arg1, placeHolder);
-		}
-		{ // remove argument, replace expression with part of argument
-			MethodDeclaration methodDecl= (MethodDeclaration) bodyDeclarations.get(2);
-			SuperConstructorInvocation invocation= (SuperConstructorInvocation) methodDecl.getBody().statements().get(0);
-			
-			MethodInvocation arg1= (MethodInvocation) invocation.arguments().get(0);
-			rewrite.markAsRemoved(arg1);
-			
-			ASTNode placeHolder= rewrite.createCopyPlaceholder((ASTNode) arg1.arguments().get(0));
-			
-			rewrite.markAsReplaced(invocation.getExpression(), placeHolder);
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("        x.super(1);\n");
-		buf.append("    }\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        super(i + i);\n");
-		buf.append("    }\n");
-		buf.append("    public E(int i, int k) {\n");
-		buf.append("        goo(x).super(1);\n");
-		buf.append("    }\n");	
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	public void testSuperFieldInvocation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        super.x= Outer.super.y;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-			
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // insert qualifier, replace field name, delete qualifier
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			Assignment assignment= (Assignment) stmt.getExpression();
-			SuperFieldAccess leftFieldAccess= (SuperFieldAccess) assignment.getLeftHandSide();
-			SuperFieldAccess rightFieldAccess= (SuperFieldAccess) assignment.getRightHandSide();
-			
-			SimpleName newQualifier= ast.newSimpleName("X");
-			rewrite.markAsInsert(leftFieldAccess, ASTNodeConstants.QUALIFIER, newQualifier, null);
-
-			SimpleName newName= ast.newSimpleName("y");
-			rewrite.markAsReplaced(leftFieldAccess.getName(), newName);
-
-			rewrite.markAsRemoved(rightFieldAccess.getQualifier());
-		}
-		
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        X.super.y= super.y;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}	
-	public void testSuperMethodInvocation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        super.foo();\n");
-		buf.append("        Outer.super.foo(i);\n");		
-		buf.append("        Outer.super.foo(foo(X.goo()), 1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-		{ // add qualifier & parameter
-			ExpressionStatement statement= (ExpressionStatement) statements.get(0);
-			SuperMethodInvocation invocation= (SuperMethodInvocation) statement.getExpression();
-
-			SimpleName newExpression= ast.newSimpleName("X");
-			rewrite.markAsInsert(invocation, ASTNodeConstants.QUALIFIER, newExpression, null);
-			
-			ASTNode arg= ast.newNumberLiteral("1");
-			rewrite.getListRewrite(invocation, ASTNodeConstants.ARGUMENTS).insertLast(arg, null);
-		}
-		{ // remove qualifier, replace argument with argument of expression
-			ExpressionStatement statement= (ExpressionStatement) statements.get(1);
-			SuperMethodInvocation invocation= (SuperMethodInvocation) statement.getExpression();
-
-			Name qualifier= invocation.getQualifier();
-			rewrite.markAsRemoved(qualifier);
-			
-			Name placeHolder= (Name) rewrite.createCopyPlaceholder(qualifier);
-			
-			FieldAccess newFieldAccess= ast.newFieldAccess();
-			newFieldAccess.setExpression(placeHolder);
-			newFieldAccess.setName(ast.newSimpleName("count"));
-			
-			ASTNode arg1= (ASTNode) invocation.arguments().get(0);
-			rewrite.markAsReplaced(arg1, newFieldAccess);
-		}
-		{ // remove argument, replace qualifier with part argument qualifier
-			ExpressionStatement statement= (ExpressionStatement) statements.get(2);
-			SuperMethodInvocation invocation= (SuperMethodInvocation) statement.getExpression();
-			
-			MethodInvocation arg1= (MethodInvocation) invocation.arguments().get(0);
-			rewrite.markAsRemoved(arg1);
-			
-			MethodInvocation innerArg= (MethodInvocation) arg1.arguments().get(0);
-			
-			ASTNode placeHolder= rewrite.createCopyPlaceholder(innerArg.getExpression());
-			
-			rewrite.markAsReplaced(invocation.getQualifier(), placeHolder);
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        X.super.foo(1);\n");
-		buf.append("        super.foo(Outer.count);\n");		
-		buf.append("        X.super.foo(1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	public void testThisExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        return this;\n");		
-		buf.append("        return Outer.this;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 2", statements.size() == 2);
-		{ // add qualifier
-			ReturnStatement returnStatement= (ReturnStatement) statements.get(0);
-			
-			ThisExpression thisExpression= (ThisExpression) returnStatement.getExpression();
-
-			SimpleName newExpression= ast.newSimpleName("X");
-			rewrite.markAsInsert(thisExpression, ASTNodeConstants.QUALIFIER, newExpression, null);
-		}
-		{ // remove qualifier
-			ReturnStatement returnStatement= (ReturnStatement) statements.get(1);
-			
-			ThisExpression thisExpression= (ThisExpression) returnStatement.getExpression();
-
-			rewrite.markAsRemoved(thisExpression.getQualifier());
-		}
-
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        return X.this;\n");		
-		buf.append("        return this;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-	
-	public void testTypeLiteral() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        return E.class;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // replace type
-			ReturnStatement returnStatement= (ReturnStatement) statements.get(0);
-			
-			TypeLiteral typeLiteral= (TypeLiteral) returnStatement.getExpression();
-
-			Type newType= ast.newPrimitiveType(PrimitiveType.VOID);
-			
-			rewrite.markAsReplaced(typeLiteral.getType(), newType);
-		}
-			
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        return void.class;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(preview, buf.toString());
-		
-	}
-			
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingInsertBoundTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingInsertBoundTest.java
deleted file mode 100644
index 217103c..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingInsertBoundTest.java
+++ /dev/null
@@ -1,1704 +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.jdt.ui.tests.astrewrite;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.PrimitiveType;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.ASTRewrite;
-import org.eclipse.jdt.internal.ui.text.correction.ASTRewriteCorrectionProposal;
-
-public class ASTRewritingInsertBoundTest extends ASTRewritingTest {
-
-	private static final Class THIS= ASTRewritingInsertBoundTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-	
-	
-
-	public ASTRewritingInsertBoundTest(String name) {
-		super(name);
-	}
-	
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTRewritingInsertBoundTest("testRemove3"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	private MethodDeclaration newMethodDeclaration(AST ast, String name) {
-		MethodDeclaration decl= ast.newMethodDeclaration();
-		decl.setName(ast.newSimpleName(name));
-		decl.setBody(null);
-		decl.setReturnType(ast.newPrimitiveType(PrimitiveType.VOID));
-		return decl;
-	}
-	
-	private FieldDeclaration newFieldDeclaration(AST ast, String name) {
-		VariableDeclarationFragment frag= ast.newVariableDeclarationFragment();
-		frag.setName(ast.newSimpleName(name));
-		FieldDeclaration decl= ast.newFieldDeclaration(frag);
-		decl.setType(ast.newPrimitiveType(PrimitiveType.INT));
-		return decl;
-	}	
-	
-	
-	public void testInsert1() throws Exception {
-		// insert first and last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(0, decl1);
-		decls.add(decl2);
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testInsert3() throws Exception {
-		// insert 2 x beween 
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(1, decl1);
-		decls.add(3, decl2);
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	public void testInsert2() throws Exception {
-		// insert first and last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-		MethodDeclaration decl3= newMethodDeclaration(ast, "new3");
-		rewrite.markAsInserted(decl3);
-		MethodDeclaration decl4= newMethodDeclaration(ast, "new4");
-		rewrite.markAsInserted(decl4);
-
-		decls.add(0, decl1);
-		decls.add(1, decl2);
-		decls.add(decl3);
-		decls.add(decl4);	
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("    void new3();\n");
-		buf.append("\n");
-		buf.append("    void new4();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-
-	public void testInsert1Before() throws Exception {
-		// insert 2x first and 2xlast
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(0, decl1);
-		decls.add(decl2);
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testInsert2Before() throws Exception {
-		// insert 2x first and 2 x last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-		FieldDeclaration decl3= newFieldDeclaration(ast, "new3");
-		rewrite.markAsInserted(decl3);
-		FieldDeclaration decl4= newFieldDeclaration(ast, "new4");
-		rewrite.markAsInserted(decl4);
-
-		decls.add(0, decl1);
-		decls.add(1, decl2);
-		decls.add(decl3);
-		decls.add(decl4);	
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("    int new3;\n");
-		buf.append("\n");
-		buf.append("    int new4;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-	public void testInsert3Before() throws Exception {
-		// insert 2 x beween 
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(1, decl1);
-		decls.add(3, decl2);
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");	
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemove1() throws Exception {
-		// remove first and last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemove2() throws Exception {
-		// remove second
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemove3() throws Exception {
-		// remove 2nd and 3rd
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemove4() throws Exception {
-		// remove all
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	public void testRemoveInsert1() throws Exception {
-		// remove first add before first, remove last add after last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(0, decl1);
-		decls.add(decl2);		
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemoveInsert2() throws Exception {
-		// remove first add 2x first, remove last add 2x  last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-		MethodDeclaration decl3= newMethodDeclaration(ast, "new3");
-		rewrite.markAsInserted(decl3);
-		MethodDeclaration decl4= newMethodDeclaration(ast, "new4");
-		rewrite.markAsInserted(decl4);
-
-		decls.add(0, decl1);
-		decls.add(2, decl2);
-		decls.add(decl3);
-		decls.add(decl4);
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    void new3();\n");
-		buf.append("\n");
-		buf.append("    void new4();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemoveInsert3() throws Exception {
-		// remove middle, add before, add after
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(1, decl1);
-		decls.add(3, decl2);
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	public void testRemoveInsert1Before() throws Exception {
-		// remove first add before first, remove last add after last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(0, decl1);
-		decls.add(decl2);		
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemoveInsert2Before() throws Exception {
-		// remove first add 2x first, remove last add 2x  last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-		FieldDeclaration decl3= newFieldDeclaration(ast, "new3");
-		rewrite.markAsInserted(decl3);
-		FieldDeclaration decl4= newFieldDeclaration(ast, "new4");
-		rewrite.markAsInserted(decl4);
-
-		decls.add(0, decl1);
-		decls.add(2, decl2);
-		decls.add(decl3);
-		decls.add(decl4);
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    int new3;\n");
-		buf.append("\n");
-		buf.append("    int new4;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemoveInsert3Before() throws Exception {
-		// remove middle, add before, add after
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(1, decl1);
-		decls.add(3, decl2);
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");		
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemoveInsert4() throws Exception {
-		// remove first and add after first, remove last and add before last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(1, decl1);
-		decls.add(3, decl2);		
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testRemoveInsert4Before() throws Exception {
-		// remove first and add after first, remove last and add before last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-
-		decls.add(1, decl1);
-		decls.add(3, decl2);		
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-	public void testRemoveInsert5() throws Exception {
-		// remove first and add after and befroe first, remove last and add after and before last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-		MethodDeclaration decl3= newMethodDeclaration(ast, "new3");
-		rewrite.markAsInserted(decl3);
-		MethodDeclaration decl4= newMethodDeclaration(ast, "new4");
-		rewrite.markAsInserted(decl4);
-		
-		decls.add(0, decl1);
-		decls.add(2, decl2);
-		decls.add(4, decl3);
-		decls.add(decl4);
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    void new3();\n");
-		buf.append("\n");
-		buf.append("    void new4();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testRemoveInsert5Before() throws Exception {
-		// remove first and add after first, remove last and add before last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-		FieldDeclaration decl3= newFieldDeclaration(ast, "new3");
-		rewrite.markAsInserted(decl3);
-		FieldDeclaration decl4= newFieldDeclaration(ast, "new4");
-		rewrite.markAsInserted(decl4);
-
-		decls.add(0, decl1);
-		decls.add(2, decl2);
-		decls.add(4, decl3);
-		decls.add(decl4);	
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("    int new3;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    int new4;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-
-	public void testRemoveInsert6() throws Exception {
-		// remove all, add before first and after last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(0, decl1);
-		decls.add(decl2);		
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testRemoveInsert6Before() throws Exception {
-		// remove all, add before first and after last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(0, decl1);
-		decls.add(decl2);		
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-
-	public void testRemoveInsert7() throws Exception {
-		// remove all, add after first and before last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public void foo1();\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public void foo2();\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public void foo3();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		MethodDeclaration decl1= newMethodDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		MethodDeclaration decl2= newMethodDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(1, decl1);
-		decls.add(3, decl2);		
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    void new1();\n");
-		buf.append("\n");
-		buf.append("    void new2();\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-
-	public void testRemoveInsert7Before() throws Exception {
-		// remove all, add after first and before last
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("//c2\n");
-		buf.append("\n");
-		buf.append("    public int x2;\n");
-		buf.append("\n");
-		buf.append("//c3\n");
-		buf.append("\n");
-		buf.append("    public int x3;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		List decls= type.bodyDeclarations();
-
-		rewrite.markAsRemoved((ASTNode) decls.get(0));
-		rewrite.markAsRemoved((ASTNode) decls.get(1));
-		rewrite.markAsRemoved((ASTNode) decls.get(2));
-		
-		FieldDeclaration decl1= newFieldDeclaration(ast, "new1");
-		rewrite.markAsInserted(decl1);
-		FieldDeclaration decl2= newFieldDeclaration(ast, "new2");
-		rewrite.markAsInserted(decl2);
-
-		decls.add(1, decl1);
-		decls.add(3, decl2);		
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("//c1\n");
-		buf.append("\n");
-		buf.append("    int new1;\n");
-		buf.append("\n");
-		buf.append("    int new2;\n");
-		buf.append("\n");
-		buf.append("//c4\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-
-
-
-
-
-	
-}
-
-
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingMethodDeclTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingMethodDeclTest.java
deleted file mode 100644
index 6f5fb43..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingMethodDeclTest.java
+++ /dev/null
@@ -1,1514 +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.jdt.ui.tests.astrewrite;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.*;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodeConstants;
-import org.eclipse.jdt.internal.corext.dom.ASTRewrite;
-import org.eclipse.jdt.internal.corext.dom.ListRewriter;
-import org.eclipse.jdt.internal.corext.refactoring.changes.CompilationUnitChange;
-import org.eclipse.jdt.internal.ui.text.correction.ASTRewriteCorrectionProposal;
-
-public class ASTRewritingMethodDeclTest extends ASTRewritingTest {
-	
-	private static final Class THIS= ASTRewritingMethodDeclTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ASTRewritingMethodDeclTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTRewritingMethodDeclTest("testMethodDeclChanges"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	public void testMethodDeclChanges() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(int p1, int p2, int p3) {}\n");
-		buf.append("    public void gee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void hee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void iee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public void jee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public abstract void kee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("    public abstract void lee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // convert constructor to method: insert return type
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-			
-			Type newReturnType= astRoot.getAST().newPrimitiveType(PrimitiveType.FLOAT);
-			
-			// from constructor to method
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.RETURN_TYPE, newReturnType, null);
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.IS_CONSTRUCTOR, Boolean.FALSE, null);
-		}
-		{ // change return type
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "gee");
-			assertTrue("Has no return type: gee", methodDecl.getReturnType() != null);
-			
-			Type returnType= methodDecl.getReturnType();
-			Type newReturnType= astRoot.getAST().newPrimitiveType(PrimitiveType.FLOAT);
-			rewrite.markAsReplaced(returnType, newReturnType);
-		}
-		{ // remove return type
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "hee");
-			assertTrue("Has no return type: hee", methodDecl.getReturnType() != null);
-						
-			// from method to constructor
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.IS_CONSTRUCTOR, Boolean.TRUE, null);
-		}
-		{ // rename method name
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "iee");
-			
-			SimpleName name= methodDecl.getName();
-			SimpleName newName= ast.newSimpleName("xii");
-			
-			rewrite.markAsReplaced(name, newName);
-		}				
-		{ // rename first param & last throw statement
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "jee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			SingleVariableDeclaration newParam= createNewParam(ast, "m");
-			rewrite.markAsReplaced((ASTNode) parameters.get(0), newParam);
-						
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 2 thrown exceptions", thrownExceptions.size() == 2);
-			Name newThrownException= ast.newSimpleName("ArrayStoreException");
-			rewrite.markAsReplaced((ASTNode) thrownExceptions.get(1), newThrownException);			
-		}
-		{ // rename first and second param & rename first and last exception
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "kee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");
-			rewrite.markAsReplaced((ASTNode) parameters.get(0), newParam1);
-			rewrite.markAsReplaced((ASTNode) parameters.get(1), newParam2);
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 3 thrown exceptions", thrownExceptions.size() == 3);
-			Name newThrownException1= ast.newSimpleName("ArrayStoreException");
-			Name newThrownException2= ast.newSimpleName("InterruptedException");
-			rewrite.markAsReplaced((ASTNode) thrownExceptions.get(0), newThrownException1);
-			rewrite.markAsReplaced((ASTNode) thrownExceptions.get(2), newThrownException2);
-		}		
-		{ // rename all params & rename second exception
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "lee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");			
-			SingleVariableDeclaration newParam3= createNewParam(ast, "m3");	
-			rewrite.markAsReplaced((ASTNode) parameters.get(0), newParam1);
-			rewrite.markAsReplaced((ASTNode) parameters.get(1), newParam2);
-			rewrite.markAsReplaced((ASTNode) parameters.get(2), newParam3);
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 3 thrown exceptions", thrownExceptions.size() == 3);
-			Name newThrownException= ast.newSimpleName("ArrayStoreException");
-			rewrite.markAsReplaced((ASTNode) thrownExceptions.get(1), newThrownException);
-		}				
-		
-					
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public float E(int p1, int p2, int p3) {}\n");
-		buf.append("    public float gee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public hee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void xii(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public void jee(float m, int p2, int p3) throws IllegalArgumentException, ArrayStoreException {}\n");
-		buf.append("    public abstract void kee(float m1, float m2, int p3) throws ArrayStoreException, IllegalAccessException, InterruptedException;\n");
-		buf.append("    public abstract void lee(float m1, float m2, float m3) throws IllegalArgumentException, ArrayStoreException, SecurityException;\n");
-		buf.append("}\n");	
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testListRemoves() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(int p1, int p2, int p3) {}\n");
-		buf.append("    public void gee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void hee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void iee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public void jee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public abstract void kee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("    public abstract void lee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // delete first param
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			rewrite.markAsRemoved((ASTNode) parameters.get(0));
-		}
-		{ // delete second param & remove exception & remove public
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "gee");
-			
-			// change flags
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.MODIFIERS, new Integer(0), null);
-			
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			rewrite.markAsRemoved((ASTNode) parameters.get(1));
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 1 thrown exceptions", thrownExceptions.size() == 1);
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(0));
-		}		
-		{ // delete last param
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "hee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			rewrite.markAsRemoved((ASTNode) parameters.get(2));	
-		}				
-		{ // delete first and second param & remove first exception
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "iee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			rewrite.markAsRemoved((ASTNode) parameters.get(0));
-			rewrite.markAsRemoved((ASTNode) parameters.get(1));
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 2 thrown exceptions", thrownExceptions.size() == 2);
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(0));	
-		}				
-		{ // delete first and last param & remove second
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "jee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			rewrite.markAsRemoved((ASTNode) parameters.get(0));
-			rewrite.markAsRemoved((ASTNode) parameters.get(2));
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 2 thrown exceptions", thrownExceptions.size() == 2);
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(1));			
-		}
-		{ // delete second and last param & remove first exception
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "kee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			rewrite.markAsRemoved((ASTNode) parameters.get(1));
-			rewrite.markAsRemoved((ASTNode) parameters.get(2));
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 3 thrown exceptions", thrownExceptions.size() == 3);
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(1));
-		}		
-		{ // delete all params & remove first and last exception
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "lee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			rewrite.markAsRemoved((ASTNode) parameters.get(0));
-			rewrite.markAsRemoved((ASTNode) parameters.get(1));
-			rewrite.markAsRemoved((ASTNode) parameters.get(2));
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 3 thrown exceptions", thrownExceptions.size() == 3);
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(0));
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(2));				
-		}				
-
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(int p2, int p3) {}\n");
-		buf.append("    void gee(int p1, int p3) {}\n");
-		buf.append("    public void hee(int p1, int p2) throws IllegalArgumentException {}\n");
-		buf.append("    public void iee(int p3) throws IllegalAccessException {}\n");
-		buf.append("    public void jee(int p2) throws IllegalArgumentException {}\n");
-		buf.append("    public abstract void kee(int p1) throws IllegalArgumentException, SecurityException;\n");
-		buf.append("    public abstract void lee() throws IllegalAccessException;\n");
-		buf.append("}\n");	
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testListInserts() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(int p1, int p2, int p3) {}\n");
-		buf.append("    public void gee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void hee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void iee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public void jee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public abstract void kee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("    public abstract void lee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // insert before first param & insert an exception
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			SingleVariableDeclaration newParam= createNewParam(ast, "m");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS).insertFirst(newParam, null);
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 0 thrown exceptions", thrownExceptions.size() == 0);
-			
-			Name newThrownException= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertFirst(newThrownException, null);
-
-		}
-		{ // insert before second param & insert before first exception & add synchronized
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "gee");
-			
-			// change flags
-			int newModifiers= Modifier.PUBLIC | Modifier.SYNCHRONIZED;
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			ASTNode secondParam= (ASTNode) parameters.get(1);
-			SingleVariableDeclaration newParam= createNewParam(ast, "m");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS).insertBefore(newParam, secondParam, null);
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 1 thrown exceptions", thrownExceptions.size() == 1);
-			
-			ASTNode firstException= (ASTNode) thrownExceptions.get(0);
-			Name newThrownException= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertBefore(newThrownException, firstException, null);
-		}		
-		{ // insert after last param & insert after first exception & add synchronized, static
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "hee");
-			
-			// change flags
-			int newModifiers= Modifier.PUBLIC | Modifier.SYNCHRONIZED | Modifier.STATIC;
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-			
-			SingleVariableDeclaration newParam= createNewParam(ast, "m");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS).insertLast(newParam, null);
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 1 thrown exceptions", thrownExceptions.size() == 1);
-			
-			ASTNode firstException= (ASTNode) thrownExceptions.get(0);
-			Name newThrownException= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertAfter(newThrownException, firstException, null);
-
-		}				
-		{ // insert 2 params before first & insert between two exception
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "iee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			ASTNode firstParam= (ASTNode) parameters.get(0);
-			
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");
-			
-			ListRewriter listRewrite = rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS);
-			listRewrite.insertBefore(newParam1, firstParam, null);
-			listRewrite.insertBefore(newParam2, firstParam, null);
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 2 thrown exceptions", thrownExceptions.size() == 2);
-			
-			ASTNode firstException= (ASTNode) thrownExceptions.get(0);
-			Name newThrownException= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertAfter(newThrownException, firstException, null);
-		}			
-		{ // insert 2 params after first & replace the second exception and insert new after
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "jee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			ListRewriter listRewrite = rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS);
-
-			ASTNode firstParam= (ASTNode) parameters.get(0);
-			
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");
-			listRewrite.insertAfter(newParam2, firstParam, null);
-			listRewrite.insertAfter(newParam1, firstParam, null);
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 2 thrown exceptions", thrownExceptions.size() == 2);
-			
-			Name newThrownException1= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException1, null);
-
-			Name newThrownException2= ast.newSimpleName("ArrayStoreException");
-			rewrite.markAsReplaced((ASTNode) thrownExceptions.get(1), newThrownException2);
-		}
-		{ // insert 2 params after last & remove the last exception and insert new after
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "kee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			ListRewriter listRewrite= rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS);
-			ASTNode lastParam= (ASTNode) parameters.get(2);
-			
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");
-
-			listRewrite.insertAfter(newParam2, lastParam, null);
-			listRewrite.insertAfter(newParam1, lastParam, null);
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 3 thrown exceptions", thrownExceptions.size() == 3);
-			
-			ASTNode lastException= (ASTNode) thrownExceptions.get(2);
-			rewrite.markAsRemoved(lastException);
-			
-			Name newThrownException= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertBefore(newThrownException, lastException, null);
-		}	
-		{ // insert at first and last position & remove 2nd, add after 2nd, remove 3rd
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "lee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			ListRewriter listRewrite= rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS);
-			
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");
-			listRewrite.insertFirst(newParam1, null);
-			listRewrite.insertLast(newParam2, null);
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 3 thrown exceptions", thrownExceptions.size() == 3);
-			
-			ASTNode secondException= (ASTNode) thrownExceptions.get(1);
-			ASTNode lastException= (ASTNode) thrownExceptions.get(2);
-			rewrite.markAsRemoved(secondException);
-			rewrite.markAsRemoved(lastException);
-			
-			Name newThrownException= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertAfter(newThrownException, secondException, null);
-
-		}				
-
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(float m, int p1, int p2, int p3) throws InterruptedException {}\n");
-		buf.append("    public synchronized void gee(int p1, float m, int p2, int p3) throws InterruptedException, IllegalArgumentException {}\n");
-		buf.append("    public static synchronized void hee(int p1, int p2, int p3, float m) throws IllegalArgumentException, InterruptedException {}\n");
-		buf.append("    public void iee(float m1, float m2, int p1, int p2, int p3) throws IllegalArgumentException, InterruptedException, IllegalAccessException {}\n");
-		buf.append("    public void jee(int p1, float m1, float m2, int p2, int p3) throws IllegalArgumentException, ArrayStoreException, InterruptedException {}\n");
-		buf.append("    public abstract void kee(int p1, int p2, int p3, float m1, float m2) throws IllegalArgumentException, IllegalAccessException, InterruptedException;\n");
-		buf.append("    public abstract void lee(float m1, int p1, int p2, int p3, float m2) throws IllegalArgumentException, InterruptedException;\n");
-		buf.append("}\n");	
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testListInsert() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public abstract void lee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // insert at first and last position & remove 2nd, add after 2nd, remove 3rd
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "lee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			ListRewriter listRewrite= rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS);
-			
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");
-			listRewrite.insertFirst(newParam1, null);
-			listRewrite.insertLast(newParam2, null);
-			
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 3 thrown exceptions", thrownExceptions.size() == 3);
-			
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(1));
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(2));
-			
-			Name newThrownException= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException, null);
-		}				
-
-
-	
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public abstract void lee(float m1, int p1, int p2, int p3, float m2) throws IllegalArgumentException, InterruptedException;\n");
-		buf.append("}\n");	
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testListCombinations() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(int p1, int p2, int p3) {}\n");
-		buf.append("    public void gee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void hee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void iee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public void jee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public abstract void kee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("    public abstract void lee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // delete all and insert after & insert 2 exceptions
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-		
-			rewrite.markAsRemoved((ASTNode) parameters.get(0));
-			rewrite.markAsRemoved((ASTNode) parameters.get(1));
-			rewrite.markAsRemoved((ASTNode) parameters.get(2));
-
-			SingleVariableDeclaration newParam= createNewParam(ast, "m");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS).insertLast(newParam, null);
-
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 0 thrown exceptions", thrownExceptions.size() == 0);
-			
-			Name newThrownException1= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException1, null);
-
-			Name newThrownException2= ast.newSimpleName("ArrayStoreException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException2, null);
-			
-		}
-		{ // delete first 2, replace last and insert after & replace first exception and insert before
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "gee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			rewrite.markAsRemoved((ASTNode) parameters.get(0));
-			rewrite.markAsRemoved((ASTNode) parameters.get(1));
-			
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			rewrite.markAsReplaced((ASTNode) parameters.get(2), newParam1);
-						
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS).insertLast(newParam2, null);
-
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 1 thrown exceptions", thrownExceptions.size() == 1);
-			
-			Name modifiedThrownException= ast.newSimpleName("InterruptedException");
-			rewrite.markAsReplaced((ASTNode) thrownExceptions.get(0), modifiedThrownException);
-						
-			Name newThrownException2= ast.newSimpleName("ArrayStoreException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException2, null);
-
-		}		
-		{ // delete first 2, replace last and insert at first & remove first and insert before
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "hee");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-
-			rewrite.markAsRemoved((ASTNode) parameters.get(0));
-			rewrite.markAsRemoved((ASTNode) parameters.get(1));
-			
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			rewrite.markAsReplaced((ASTNode) parameters.get(2), newParam1);
-						
-			SingleVariableDeclaration newParam2= createNewParam(ast, "m2");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS).insertFirst(newParam2, null);
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 1 thrown exceptions", thrownExceptions.size() == 1);
-			
-			rewrite.markAsRemoved((ASTNode) thrownExceptions.get(0));
-						
-			Name newThrownException2= ast.newSimpleName("ArrayStoreException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException2, null);
-		}				
-
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(float m) throws InterruptedException, ArrayStoreException {}\n");
-		buf.append("    public void gee(float m1, float m2) throws InterruptedException, ArrayStoreException {}\n");
-		buf.append("    public void hee(float m2, float m1) throws ArrayStoreException {}\n");
-		buf.append("    public void iee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public void jee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public abstract void kee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("    public abstract void lee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("}\n");	
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testListCombination() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(int p1, int p2, int p3) {}\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // delete all and insert after & insert 2 exceptions
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-			List parameters= methodDecl.parameters();
-			assertTrue("must be 3 parameters", parameters.size() == 3);
-		
-			rewrite.markAsRemoved((ASTNode) parameters.get(0));
-			rewrite.markAsRemoved((ASTNode) parameters.get(1));
-			rewrite.markAsRemoved((ASTNode) parameters.get(2));
-
-			SingleVariableDeclaration newParam= createNewParam(ast, "m");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS).insertLast(newParam, null);
-
-			List thrownExceptions= methodDecl.thrownExceptions();
-			assertTrue("must be 0 thrown exceptions", thrownExceptions.size() == 0);
-			
-			Name newThrownException1= ast.newSimpleName("InterruptedException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException1, null);
-			
-			Name newThrownException2= ast.newSimpleName("ArrayStoreException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException2, null);
-
-			
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(float m) throws InterruptedException, ArrayStoreException {}\n");
-		buf.append("}\n");	
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	public void testMethodBody() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(int p1, int p2, int p3) {}\n");
-		buf.append("    public void gee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void hee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void iee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public void jee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public abstract void kee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("    public abstract void lee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // replace block
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-			
-			Block body= methodDecl.getBody();
-			assertTrue("No body: E", body != null);
-			
-			Block newBlock= ast.newBlock();
-
-			rewrite.markAsReplaced(body, newBlock);
-		}
-		{ // delete block & set abstract
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "gee");
-			
-			// change flags
-			int newModifiers= Modifier.PUBLIC | Modifier.ABSTRACT;
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			Block body= methodDecl.getBody();
-			assertTrue("No body: gee", body != null);
-
-			rewrite.markAsRemoved(body);
-		}
-		{ // insert block & set to private
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "kee");
-			
-			// change flags
-			int newModifiers= Modifier.PRIVATE;
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			
-			Block body= methodDecl.getBody();
-			assertTrue("Has body", body == null);
-			
-			Block newBlock= ast.newBlock();
-			rewrite.markAsInsert(methodDecl, ASTNodeConstants.BODY, newBlock, null);
-		}		
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public E(int p1, int p2, int p3) {\n");
-		buf.append("    }\n");
-		buf.append("    public abstract void gee(int p1, int p2, int p3) throws IllegalArgumentException;\n");
-		buf.append("    public void hee(int p1, int p2, int p3) throws IllegalArgumentException {}\n");
-		buf.append("    public void iee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    public void jee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException {}\n");
-		buf.append("    private void kee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException {\n");
-		buf.append("    }\n");
-		buf.append("    public abstract void lee(int p1, int p2, int p3) throws IllegalArgumentException, IllegalAccessException, SecurityException;\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testMethodDeclarationExtraDimensions() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public Object foo1() { return null; }\n");
-		buf.append("    public Object foo2() throws IllegalArgumentException { return null; }\n");
-		buf.append("    public Object foo3()[][] { return null; }\n");
-		buf.append("    public Object foo4()[][] throws IllegalArgumentException { return null; }\n");
-		buf.append("    public Object foo5()[][] { return null; }\n");
-		buf.append("    public Object foo6(int i)[][] throws IllegalArgumentException { return null; }\n");
-		buf.append("    public Object foo7(int i)[][] { return null; }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // add extra dim, add throws
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo1");
-			
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(1), null);
-			
-			Name newThrownException2= ast.newSimpleName("ArrayStoreException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException2, null);
-
-		}
-		{ // add extra dim, remove throws
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo2");
-			
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(1), null);
-			
-			rewrite.markAsRemoved((ASTNode) methodDecl.thrownExceptions().get(0));			
-		}		
-		{ // remove extra dim, add throws
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo3");
-
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(1), null);
-			
-			Name newThrownException2= ast.newSimpleName("ArrayStoreException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException2, null);
-
-		}
-		{ // add extra dim, remove throws
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo4");
-			
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(1), null);
-			
-			rewrite.markAsRemoved((ASTNode) methodDecl.thrownExceptions().get(0));			
-		}
-		{ // add params, add extra dim, add throws
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo5");
-			
-			SingleVariableDeclaration newParam1= createNewParam(ast, "m1");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.PARAMETERS).insertLast(newParam1, null);
-
-			
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(4), null);
-			
-			Name newThrownException2= ast.newSimpleName("ArrayStoreException");
-			rewrite.getListRewrite(methodDecl, ASTNodeConstants.THROWN_EXCEPTIONS).insertLast(newThrownException2, null);
-	
-		}
-		{ // remove params, add extra dim, remove throws
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo6");
-			
-			rewrite.markAsRemoved((ASTNode) methodDecl.parameters().get(0));		
-			
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(4), null);
-			
-			rewrite.markAsRemoved((ASTNode) methodDecl.thrownExceptions().get(0));			
-		}
-		{ // remove block
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo7");
-			rewrite.markAsRemoved(methodDecl.getBody());			
-		}					
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public Object foo1()[] throws ArrayStoreException { return null; }\n");
-		buf.append("    public Object foo2()[] { return null; }\n");
-		buf.append("    public Object foo3()[] throws ArrayStoreException { return null; }\n");
-		buf.append("    public Object foo4()[] { return null; }\n");
-		buf.append("    public Object foo5(float m1)[][][][] throws ArrayStoreException { return null; }\n");
-		buf.append("    public Object foo6()[][][][] { return null; }\n");
-		buf.append("    public Object foo7(int i)[][];\n");		
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	
-	public void testFieldDeclaration() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    int i1= 1;\n");
-		buf.append("    int i2= 1, k2= 2, n2= 3;\n");
-		buf.append("    static final int i3= 1, k3= 2, n3= 3;\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "A");
-		
-		FieldDeclaration[] fieldDeclarations= type.getFields();
-		assertTrue("Number of fieldDeclarations not 3", fieldDeclarations.length == 3);
-		{	// add modifier, change type, add fragment
-			FieldDeclaration decl= fieldDeclarations[0];
-			
-			// add modifier
-			int newModifiers= Modifier.FINAL;
-			rewrite.markAsReplaced(decl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			PrimitiveType newType= ast.newPrimitiveType(PrimitiveType.BOOLEAN);
-			rewrite.markAsReplaced(decl.getType(), newType);
-					
-			VariableDeclarationFragment frag=	ast.newVariableDeclarationFragment();
-			frag.setName(ast.newSimpleName("k1"));
-			frag.setInitializer(null);
-
-			rewrite.getListRewrite(decl, ASTNodeConstants.FRAGMENTS).insertLast(frag, null);
-
-		}
-		{	// add modifiers, remove first two fragments, replace last
-			FieldDeclaration decl= fieldDeclarations[1];
-			
-			// add modifier
-			int newModifiers= Modifier.FINAL | Modifier.STATIC | Modifier.TRANSIENT;
-			rewrite.markAsReplaced(decl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			List fragments= decl.fragments();
-			assertTrue("Number of fragments not 3", fragments.size() == 3);
-			
-			rewrite.markAsRemoved((ASTNode) fragments.get(0));
-			rewrite.markAsRemoved((ASTNode) fragments.get(1));
-			
-			VariableDeclarationFragment frag=	ast.newVariableDeclarationFragment();
-			frag.setName(ast.newSimpleName("k2"));
-			frag.setInitializer(null);
-			
-			rewrite.markAsReplaced((ASTNode) fragments.get(2), frag);
-		}
-		{	// remove modifiers
-			FieldDeclaration decl= fieldDeclarations[2];
-			
-			// change modifier
-			int newModifiers= 0;
-			rewrite.markAsReplaced(decl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    final boolean i1= 1, k1;\n");
-		buf.append("    static final transient int k2;\n");
-		buf.append("    int i3= 1, k3= 2, n3= 3;\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testInitializer() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    {\n");
-		buf.append("        foo();\n");
-		buf.append("    }\n");
-		buf.append("    static {\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "A");
-		
-		List declarations= type.bodyDeclarations();
-		assertTrue("Number of fieldDeclarations not 2", declarations.size() == 2);
-		{	// change modifier, replace body
-			Initializer initializer= (Initializer) declarations.get(0);
-			
-			// add modifier
-			int newModifiers= Modifier.STATIC;
-			rewrite.markAsReplaced(initializer, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			
-			Block block= ast.newBlock();
-			block.statements().add(ast.newReturnStatement());
-			
-			rewrite.markAsReplaced(initializer.getBody(), block);
-		}
-		{	// change modifier
-			Initializer initializer= (Initializer) declarations.get(1);
-			
-			int newModifiers= 0;
-			rewrite.markAsReplaced(initializer, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    static {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("    {\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	public void testMethodDeclarationParamShuffel() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public Object foo1(int i, boolean b) { return null; }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // add extra dim, add throws
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo1");
-			
-			List params= methodDecl.parameters();
-			
-			SingleVariableDeclaration first= (SingleVariableDeclaration) params.get(0);
-			SingleVariableDeclaration second= (SingleVariableDeclaration) params.get(1);
-			rewrite.markAsReplaced(first.getName(), ast.newSimpleName("x"));
-			rewrite.markAsReplaced(second.getName(), ast.newSimpleName("y"));
-				
-			ASTNode copy1= rewrite.createCopy(first);
-			ASTNode copy2= rewrite.createCopy(second);
-			
-			rewrite.markAsReplaced(first, copy2);
-			rewrite.markAsReplaced(second, copy1);
-			
-		}
-	
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public Object foo1(boolean y, int x) { return null; }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-
-	public void testMethodDeclarationParamShuffel1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public Object foo1(int i, boolean b) { return null; }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ 
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo1");
-			
-			List params= methodDecl.parameters();
-			
-			SingleVariableDeclaration first= (SingleVariableDeclaration) params.get(0);
-			SingleVariableDeclaration second= (SingleVariableDeclaration) params.get(1);
-				
-			ASTNode copy2= rewrite.createCopy(second);
-
-			rewrite.markAsReplaced(first, copy2);
-			rewrite.markAsRemoved(second);
-		}
-	
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		CompilationUnitChange compilationUnitChange= proposal.getCompilationUnitChange();
-		compilationUnitChange.setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public Object foo1(boolean b) { return null; }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-		
-	public void testMethodDeclaration_bug24916() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class DD {\n");
-		buf.append("    private int DD()[]{\n");
-		buf.append("    };\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("DD.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "DD");
-		{
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "DD");
-			
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.IS_CONSTRUCTOR, Boolean.TRUE, null);
-			rewrite.markAsReplaced(methodDecl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(0), null);
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-
-		proposal.apply(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class DD {\n");
-		buf.append("    private DD(){\n");
-		buf.append("    };\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testMethodComments1() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-
-		buf.append("public class DD {\n");
-		buf.append("    // one line comment\n");
-		buf.append("    private void foo(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    /**\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("DD.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "DD");
-		{
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			rewrite.markAsRemoved(methodDecl);
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-
-		proposal.apply(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class DD {\n");
-		buf.append("    /**\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testMethodComments2() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class DD {\n");
-		buf.append("    // one line comment\n");
-		buf.append("    private void foo(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("DD.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "DD");
-		{
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo2");
-			ASTNode node= rewrite.createCopy(methodDecl);
-
-			ASTNode firstDecl= (ASTNode) type.bodyDeclarations().get(0);
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertAfter(node, firstDecl, null);
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-
-		proposal.apply(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class DD {\n");
-		buf.append("    // one line comment\n");
-		buf.append("    private void foo(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");
-		buf.append("\n");				
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testMethodComments3() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-
-		buf.append("public class DD {\n");
-		buf.append("    // one line comment\n");
-		buf.append("\n");		
-		buf.append("    private void foo(){\n");
-		buf.append("    } // another\n");
-		buf.append("\n");
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("DD.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "DD");
-		{
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			rewrite.markAsRemoved(methodDecl);
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-
-		proposal.apply(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class DD {\n");
-		buf.append("    // one line comment\n");
-		buf.append("\n");			
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	public void testBUG_38447() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-
-		buf.append("public class DD {\n");
-		buf.append("\n");		
-		buf.append("    private void foo(){\n");
-		buf.append("\n"); // missing closing bracket
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("DD.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "DD");
-		{
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			rewrite.markAsRemoved(methodDecl);
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-
-		proposal.apply(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class DD {\n");
-		buf.append("\n");			
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testMethodComments4() throws Exception {
-	
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-
-		buf.append("public class DD {\n");
-		buf.append("    // one line comment\n");
-		buf.append("\n");		
-		buf.append("    private void foo(){\n");
-		buf.append("    } // another\n");
-		buf.append("\n");
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("DD.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "DD");
-		{
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			ASTNode copy= rewrite.createCopy(methodDecl);
-			
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(copy, null);
-			
-			MethodDeclaration newMethodDecl= createNewMethod(astRoot.getAST(), "xoo", false);
-			rewrite.markAsReplaced(methodDecl, newMethodDecl);
-			
-			//MethodDeclaration methodDecl2= findMethodDeclaration(type, "foo1");
-			//rewrite.markAsReplaced(methodDecl2, copy);
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-
-		proposal.apply(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-
-		buf.append("public class DD {\n");
-		buf.append("    // one line comment\n");
-		buf.append("\n");		
-		buf.append("    private void xoo(String str) {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo2(){\n");
-		buf.append("    }\n");
-		buf.append("\n");	
-		buf.append("    private void foo(){\n");
-		buf.append("    } // another\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testInsertFieldAfter() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-
-		buf.append("public class DD {\n");
-		buf.append("    private int fCount1;\n");
-		buf.append("\n");	
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("DD.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "DD");
-		{
-			VariableDeclarationFragment frag= ast.newVariableDeclarationFragment();
-			frag.setName(ast.newSimpleName("fColor"));
-			FieldDeclaration newField= ast.newFieldDeclaration(frag);
-			newField.setType(ast.newPrimitiveType(PrimitiveType.CHAR));
-			newField.setModifiers(Modifier.PRIVATE);
-					
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertAt(newField, 1, null);
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-
-		proposal.apply(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-
-		buf.append("public class DD {\n");
-		buf.append("    private int fCount1;\n");
-		buf.append("    private char fColor;\n");
-		buf.append("\n");
-		buf.append("    /*\n");
-		buf.append("     *\n");
-		buf.append("     */\n");
-		buf.append("    private void foo1(){\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-	
-	
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingMoveCodeTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingMoveCodeTest.java
deleted file mode 100644
index 58b6b0d..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingMoveCodeTest.java
+++ /dev/null
@@ -1,1309 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 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.jdt.ui.tests.astrewrite;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.core.dom.*;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodeConstants;
-import org.eclipse.jdt.internal.corext.dom.NewASTRewrite;
-
-public class ASTRewritingMoveCodeTest extends ASTRewritingTest {
-	
-	private static final Class THIS= ASTRewritingMoveCodeTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ASTRewritingMoveCodeTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTRewritingMoveCodeTest("testCollapsedTargetNodes2"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	public void testMove() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    int x;\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		List bodyDecls= type.bodyDeclarations();
-		
-		ASTNode first= (ASTNode) bodyDecls.get(0);
-		ASTNode placeholder= rewrite.createMovePlaceholder(first);
-		
-		rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(placeholder, null);
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("    int x;\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}		
-	
-	public void testMoveDeclSameLevelCD() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("        i= 0;\n");
-		buf.append("        k= 9;\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // move inner type to the end of the type & move, copy statements from constructor to method
-			
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
-			TypeDeclaration innerType= (TypeDeclaration) members.get(0);
-			
-			rewrite.markAsRemoved(innerType);
-			ASTNode movedNode= rewrite.createCopyPlaceholder(innerType);
-
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(movedNode, null);
-			
-			Statement toMove;
-			Statement toCopy;
-			{
-				MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-				assertTrue("Cannot find Constructor E", methodDecl != null);
-				Block body= methodDecl.getBody();
-				assertTrue("No body", body != null);
-				List statements= body.statements();
-				assertTrue("Not expected number of statements", statements.size() == 4);
-				
-				toMove= (Statement) statements.get(1);
-				toCopy= (Statement) statements.get(3);
-				
-				rewrite.markAsRemoved(toMove);
-			}
-			{
-				MethodDeclaration methodDecl= findMethodDeclaration(type, "gee");
-				assertTrue("Cannot find gee()", methodDecl != null);
-				Block body= methodDecl.getBody();
-				assertTrue("No body", body != null);
-				List statements= body.statements();
-				assertTrue("Has statements", statements.isEmpty());
-				
-				ASTNode insertNodeForMove= rewrite.createCopyPlaceholder(toMove);
-				ASTNode insertNodeForCopy= rewrite.createCopyPlaceholder(toCopy);
-				
-				rewrite.getListRewrite(body, ASTNodeConstants.STATEMENTS).insertLast(insertNodeForCopy, null);
-				rewrite.getListRewrite(body, ASTNodeConstants.STATEMENTS).insertLast(insertNodeForMove, null);
-				
-			}	
-		}			
-					
-
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");		
-		buf.append("        k= 9;\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");		
-		buf.append("        i= 0;\n");
-		buf.append("    }\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("    }\n");			
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");		
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void testMoveDeclSameLevel() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("        i= 0;\n");
-		buf.append("        k= 9;\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // move inner type to the end of the type & move, copy statements from constructor to method
-			
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
-			TypeDeclaration innerType= (TypeDeclaration) members.get(0);
-			
-			ASTNode movedNode= rewrite.createMovePlaceholder(innerType);
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(movedNode, null);
-
-			
-			Statement toMove;
-			Statement toCopy;
-			{
-				MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-				assertTrue("Cannot find Constructor E", methodDecl != null);
-				Block body= methodDecl.getBody();
-				assertTrue("No body", body != null);
-				List statements= body.statements();
-				assertTrue("Not expected number of statements", statements.size() == 4);
-				
-				toMove= (Statement) statements.get(1);
-				toCopy= (Statement) statements.get(3);
-			}
-			{
-				MethodDeclaration methodDecl= findMethodDeclaration(type, "gee");
-				assertTrue("Cannot find gee()", methodDecl != null);
-				Block body= methodDecl.getBody();
-				assertTrue("No body", body != null);
-				List statements= body.statements();
-				assertTrue("Has statements", statements.isEmpty());
-				
-				ASTNode insertNodeForMove= rewrite.createMovePlaceholder(toMove);
-				ASTNode insertNodeForCopy= rewrite.createCopyPlaceholder(toCopy);
-				
-				rewrite.getListRewrite(body, ASTNodeConstants.STATEMENTS).insertLast(insertNodeForCopy, null);
-				rewrite.getListRewrite(body, ASTNodeConstants.STATEMENTS).insertLast(insertNodeForMove, null);
-			}	
-		}			
-					
-
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");		
-		buf.append("        k= 9;\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");		
-		buf.append("        i= 0;\n");
-		buf.append("    }\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("    }\n");			
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");		
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-
-	public void testMoveDeclDifferentLevelCD() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("        i= 0;\n");
-		buf.append("        k= 9;\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
-			TypeDeclaration innerType= (TypeDeclaration) members.get(0);
-			
-			List innerMembers= innerType.bodyDeclarations();
-			assertTrue("Not expected number of inner members", innerMembers.size() == 1);
-			
-			{ // move outer as inner of inner.
-				TypeDeclaration outerType= findTypeDeclaration(astRoot, "G");
-				assertTrue("G not found", outerType != null);
-				
-				rewrite.markAsRemoved(outerType);
-				
-				ASTNode insertNodeForCopy= rewrite.createCopyPlaceholder(outerType);
-				
-				rewrite.getListRewrite(innerType, ASTNodeConstants.BODY_DECLARATIONS).insertLast(insertNodeForCopy, null);
-
-				
-			}
-			{ // copy method of inner to main type
-				MethodDeclaration methodDecl= (MethodDeclaration) innerMembers.get(0);
-				ASTNode insertNodeForMove= rewrite.createCopyPlaceholder(methodDecl);
-				
-				rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(insertNodeForMove, null);
-
-			}
-			{ // nest body of constructor in a while statement
-				MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-				assertTrue("Cannot find Constructor E", methodDecl != null);
-
-				Block body= methodDecl.getBody();
-
-				WhileStatement whileStatement= ast.newWhileStatement();
-				whileStatement.setExpression(ast.newBooleanLiteral(true));
-				
-				Statement insertNodeForCopy= (Statement) rewrite.createCopyPlaceholder(body);
-				
-				whileStatement.setBody(insertNodeForCopy); // set existing body
-
-				Block newBody= ast.newBlock();
-				List newStatements= newBody.statements();				
-				newStatements.add(whileStatement);
-				
-				rewrite.markAsReplaced(body, newBody);
-			}			
-		}	
-					
-
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("\n");			
-		buf.append("        interface G {\n");
-		buf.append("        }\n");				
-		buf.append("    }\n");		
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        while (true) {\n");		
-		buf.append("            super();\n");
-		buf.append("            i= 0;\n");
-		buf.append("            k= 9;\n");
-		buf.append("            if (System.out == null) {\n");
-		buf.append("                gee(); // cool\n");
-		buf.append("            }\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("    public void xee() {\n");
-		buf.append("        /* does nothing */\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void testMoveDeclDifferentLevel() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("        i= 0;\n");
-		buf.append("        k= 9;\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
-			TypeDeclaration innerType= (TypeDeclaration) members.get(0);
-			
-			List innerMembers= innerType.bodyDeclarations();
-			assertTrue("Not expected number of inner members", innerMembers.size() == 1);
-			
-			{ // move outer as inner of inner.
-				TypeDeclaration outerType= findTypeDeclaration(astRoot, "G");
-				assertTrue("G not found", outerType != null);
-				
-				ASTNode insertNodeForCopy= rewrite.createMovePlaceholder(outerType);
-				
-				rewrite.getListRewrite(innerType, ASTNodeConstants.BODY_DECLARATIONS).insertLast(insertNodeForCopy, null);
-			}
-			{ // copy method of inner to main type
-				MethodDeclaration methodDecl= (MethodDeclaration) innerMembers.get(0);
-				ASTNode insertNodeForMove= rewrite.createCopyPlaceholder(methodDecl);
-				
-				rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(insertNodeForMove, null);
-			}
-			{ // nest body of constructor in a while statement
-				MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-				assertTrue("Cannot find Constructor E", methodDecl != null);
-
-				Block body= methodDecl.getBody();
-
-				WhileStatement whileStatement= ast.newWhileStatement();
-				whileStatement.setExpression(ast.newBooleanLiteral(true));
-				
-				Statement insertNodeForCopy= (Statement) rewrite.createCopyPlaceholder(body);
-				
-				whileStatement.setBody(insertNodeForCopy); // set existing body
-
-				Block newBody= ast.newBlock();
-				List newStatements= newBody.statements();				
-				newStatements.add(whileStatement);
-				
-				rewrite.markAsReplaced(body, newBody);
-			}			
-		}	
-					
-
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("\n");			
-		buf.append("        interface G {\n");
-		buf.append("        }\n");				
-		buf.append("    }\n");		
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        while (true) {\n");		
-		buf.append("            super();\n");
-		buf.append("            i= 0;\n");
-		buf.append("            k= 9;\n");
-		buf.append("            if (System.out == null) {\n");
-		buf.append("                gee(); // cool\n");
-		buf.append("            }\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("    public void xee() {\n");
-		buf.append("        /* does nothing */\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-
-	public void testMoveStatementsCD() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("        i= 0;\n");
-		buf.append("        k= 9;\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // move first statments inside an ifstatement, move second statment inside a new while statement
-		   // that is in the ifstatement
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-			assertTrue("Cannot find Constructor E", methodDecl != null);
-
-			Block body= methodDecl.getBody();
-			List statements= body.statements();
-			
-			assertTrue("Cannot find if statement", statements.get(3) instanceof IfStatement);
-			
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-			
-			Statement insertNodeForCopy1= (Statement) rewrite.createCopyPlaceholder((ASTNode) statements.get(1));
-			Statement insertNodeForCopy2= (Statement) rewrite.createCopyPlaceholder((ASTNode) statements.get(2));
-			
-			Block whileBody= ast.newBlock();
-			
-			WhileStatement whileStatement= ast.newWhileStatement();
-			whileStatement.setExpression(ast.newBooleanLiteral(true));
-			whileStatement.setBody(whileBody);
-			
-			List whileBodyStatements= whileBody.statements();
-			whileBodyStatements.add(insertNodeForCopy2);
-			
-			
-			assertTrue("if statement body not a block", ifStatement.getThenStatement() instanceof Block);
-			
-			
-			Block block= (Block)ifStatement.getThenStatement();
-			
-			rewrite.getListRewrite(block, ASTNodeConstants.STATEMENTS).insertFirst(whileStatement, null);
-			rewrite.getListRewrite(block, ASTNodeConstants.STATEMENTS).insertAfter(insertNodeForCopy1, whileStatement, null);
-			
-			rewrite.markAsRemoved((ASTNode) statements.get(1));
-			rewrite.markAsRemoved((ASTNode) statements.get(2));
-		}	
-					
-
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("            /* does nothing */\n");
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            while (true) {\n");
-		buf.append("                k= 9;\n");
-		buf.append("            }\n");		
-		buf.append("            i= 0;\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}	
-	
-	public void testMoveStatements() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("        i= 0;\n");
-		buf.append("        k= 9;\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // move first statments inside an ifstatement, move second statment inside a new while statement
-		   // that is in the ifstatement
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "E");
-			assertTrue("Cannot find Constructor E", methodDecl != null);
-
-			Block body= methodDecl.getBody();
-			List statements= body.statements();
-			
-			assertTrue("Cannot find if statement", statements.get(3) instanceof IfStatement);
-			
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-			
-			Statement insertNodeForCopy1= (Statement) rewrite.createMovePlaceholder((ASTNode) statements.get(1));
-			Statement insertNodeForCopy2= (Statement) rewrite.createMovePlaceholder((ASTNode) statements.get(2));
-			
-			Block whileBody= ast.newBlock();
-			
-			WhileStatement whileStatement= ast.newWhileStatement();
-			whileStatement.setExpression(ast.newBooleanLiteral(true));
-			whileStatement.setBody(whileBody);
-			
-			List whileBodyStatements= whileBody.statements();
-			whileBodyStatements.add(insertNodeForCopy2);
-			
-			
-			assertTrue("if statement body not a block", ifStatement.getThenStatement() instanceof Block);
-						
-			Block block= (Block) ifStatement.getThenStatement();
-			rewrite.getListRewrite(block, ASTNodeConstants.STATEMENTS).insertFirst(whileStatement, null);
-			rewrite.getListRewrite(block, ASTNodeConstants.STATEMENTS).insertAfter(insertNodeForCopy1, whileStatement, null);
-		}	
-					
-
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    private /* inner comment */ int i;\n");
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            while (true) {\n");
-		buf.append("                k= 9;\n");
-		buf.append("            }\n");		
-		buf.append("            i= 0;\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void tesCopyFromDeleted() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void goo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // delete method foo, but copy if statement to goo
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			assertTrue("Cannot find foo", methodDecl != null);
-			
-			rewrite.markAsRemoved(methodDecl);
-			
-			Block body= methodDecl.getBody();
-			List statements= body.statements();
-			assertTrue("Cannot find if statement", statements.size() == 1);
-			
-			ASTNode placeHolder= rewrite.createMovePlaceholder((ASTNode) statements.get(0));
-			
-			
-			MethodDeclaration methodGoo= findMethodDeclaration(type, "goo");
-			assertTrue("Cannot find goo", methodGoo != null);
-			
-			rewrite.getListRewrite(methodGoo.getBody(), ASTNodeConstants.STATEMENTS).insertLast(placeHolder, null);
-		}	
-					
-
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void goo() {\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee(); // cool\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-
-	public void testChangesInMoveCD() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee( /* cool */);\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void goo() {\n");
-		buf.append("        x= 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // replace statement in goo with moved ifStatement from foo. add a node to if statement
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			assertTrue("Cannot find foo", methodDecl != null);
-			
-			List fooStatements= methodDecl.getBody().statements();
-			assertTrue("Cannot find if statement", fooStatements.size() == 1);
-			
-			// prepare ifStatement to move
-			IfStatement ifStatement= (IfStatement) fooStatements.get(0);
-			rewrite.markAsRemoved(ifStatement);
-			
-			ASTNode placeHolder= rewrite.createCopyPlaceholder(ifStatement);
-			
-			// add return statement to ifStatement block
-			ReturnStatement returnStatement= ast.newReturnStatement();
-			Block then= (Block) ifStatement.getThenStatement();
-			rewrite.getListRewrite(then, ASTNodeConstants.STATEMENTS).insertLast(returnStatement, null);
-	
-			// replace statement in goo with moved ifStatement
-			MethodDeclaration methodGoo= findMethodDeclaration(type, "goo");
-			assertTrue("Cannot find goo", methodGoo != null);
-			
-			List gooStatements= methodGoo.getBody().statements();
-			assertTrue("Cannot find statement in goo", gooStatements.size() == 1);
-			
-			rewrite.markAsReplaced((ASTNode) gooStatements.get(0), placeHolder);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("    public void goo() {\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee( /* cool */);\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void testChangesInMove() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee( /* cool */);\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public void goo() {\n");
-		buf.append("        x= 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // replace statement in goo with moved ifStatement from foo. add a node to if statement
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			assertTrue("Cannot find foo", methodDecl != null);
-			
-			List fooStatements= methodDecl.getBody().statements();
-			assertTrue("Cannot find if statement", fooStatements.size() == 1);
-			
-			// prepare ifStatement to move
-			IfStatement ifStatement= (IfStatement) fooStatements.get(0);
-			
-			ASTNode placeHolder= rewrite.createMovePlaceholder(ifStatement);
-			
-			// add return statement to ifStatement block
-			ReturnStatement returnStatement= ast.newReturnStatement();
-
-			Block then= (Block) ifStatement.getThenStatement();
-			rewrite.getListRewrite(then, ASTNodeConstants.STATEMENTS).insertLast(returnStatement, null);
-
-	
-			// replace statement in goo with moved ifStatement
-			MethodDeclaration methodGoo= findMethodDeclaration(type, "goo");
-			assertTrue("Cannot find goo", methodGoo != null);
-			
-			List gooStatements= methodGoo.getBody().statements();
-			assertTrue("Cannot find statement in goo", gooStatements.size() == 1);
-			
-			rewrite.markAsReplaced((ASTNode) gooStatements.get(0), placeHolder);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("    public void goo() {\n");
-		buf.append("        if (System.out == null) {\n");
-		buf.append("            gee( /* cool */);\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-
-	public void testSwapCD() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(xoo(/*hello*/), k * 2);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // swap the two arguments
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			assertTrue("Cannot find foo", methodDecl != null);
-			
-			List fooStatements= methodDecl.getBody().statements();
-			assertTrue("More statements than expected", fooStatements.size() == 1);
-			
-			ExpressionStatement statement= (ExpressionStatement) fooStatements.get(0);
-			MethodInvocation invocation= (MethodInvocation) statement.getExpression();
-			
-			List arguments= invocation.arguments();
-			assertTrue("More arguments than expected", arguments.size() == 2);
-			
-			ASTNode arg0= (ASTNode) arguments.get(0);
-			ASTNode arg1= (ASTNode) arguments.get(1);
-			
-			ASTNode placeHolder0= rewrite.createCopyPlaceholder(arg0);
-			ASTNode placeHolder1= rewrite.createCopyPlaceholder(arg1);
-			
-			rewrite.markAsReplaced(arg0, placeHolder1);
-			rewrite.markAsReplaced(arg1, placeHolder0);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(k * 2, xoo(/*hello*/));\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void testSwap() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(xoo(/*hello*/), k * 2);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		
-		{ // swap the two arguments
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			assertTrue("Cannot find foo", methodDecl != null);
-			
-			List fooStatements= methodDecl.getBody().statements();
-			assertTrue("More statements than expected", fooStatements.size() == 1);
-			
-			ExpressionStatement statement= (ExpressionStatement) fooStatements.get(0);
-			MethodInvocation invocation= (MethodInvocation) statement.getExpression();
-			
-			List arguments= invocation.arguments();
-			assertTrue("More arguments than expected", arguments.size() == 2);
-			
-			ASTNode arg0= (ASTNode) arguments.get(0);
-			ASTNode arg1= (ASTNode) arguments.get(1);
-			
-			ASTNode placeHolder0= rewrite.createMovePlaceholder(arg0);
-			ASTNode placeHolder1= rewrite.createMovePlaceholder(arg1);
-			
-			rewrite.markAsReplaced(arg0, placeHolder1); // replace instead of remove
-			rewrite.markAsReplaced(arg1, placeHolder0); // replace instead of remove
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo(k * 2, xoo(/*hello*/));\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}	
-	
-	
-	public void testMultipleCopiesOfSameNode() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            foo();\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		{
-			List statements= methodDecl.getBody().statements();
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			List ifStatementBody= ((Block) ifStatement.getThenStatement()).statements();
-			
-			ASTNode node= (ASTNode) ifStatementBody.get(1);
-			ASTNode placeholder1= rewrite.createCopyPlaceholder(node);
-			rewrite.getListRewrite(methodDecl.getBody(), ASTNodeConstants.STATEMENTS).insertLast(placeholder1, null);
-
-			ASTNode placeholder2= rewrite.createCopyPlaceholder(node);
-			rewrite.markAsReplaced((ASTNode) ifStatementBody.get(0), placeholder2);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("        i++; // comment\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void testMultipleCopiesOfSameNodeAndMove() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            foo();\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		{
-			List statements= methodDecl.getBody().statements();
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			List ifStatementBody= ((Block) ifStatement.getThenStatement()).statements();
-			
-			ASTNode node= (ASTNode) ifStatementBody.get(1);
-			ASTNode placeholder1= rewrite.createCopyPlaceholder(node);
-			rewrite.getListRewrite(methodDecl.getBody(), ASTNodeConstants.STATEMENTS).insertLast(placeholder1, null);
-
-			ASTNode placeholder2= rewrite.createCopyPlaceholder(node);
-			rewrite.markAsReplaced((ASTNode) ifStatementBody.get(0), placeholder2);
-			
-			ASTNode placeholder3= rewrite.createMovePlaceholder(node);
-			rewrite.getListRewrite(methodDecl.getBody(), ASTNodeConstants.STATEMENTS).insertFirst(placeholder3, null);
-
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i++; // comment\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("        i++; // comment\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}	
-	
-	
-	
-	public void testMoveForStatementToForBlockCD() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for(int i= 0; i < 8; i++)\n");
-		buf.append("            foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		{
-			List statements= methodDecl.getBody().statements();
-			ForStatement forStatement= (ForStatement) statements.get(0);
-			Statement body= forStatement.getBody();
-			
-			ASTNode placeholder= rewrite.createCopyPlaceholder(body);
-			
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(body, newBody);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for(int i= 0; i < 8; i++) {\n");
-		buf.append("            foo();\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void testMoveForStatementToForBlock() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for(int i= 0; i < 8; i++)\n");
-		buf.append("            foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		assertTrue("Code has errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		{
-			List statements= methodDecl.getBody().statements();
-			ForStatement forStatement= (ForStatement) statements.get(0);
-			Statement body= forStatement.getBody();
-			
-			ASTNode placeholder= rewrite.createMovePlaceholder(body);
-			
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(body, newBody);
-		}	
-					
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for(int i= 0; i < 8; i++) {\n");
-		buf.append("            foo();\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}	
-		
-	public void testNestedCopies() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        int i= (String) o.indexOf('1');\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		NewASTRewrite rewrite= new NewASTRewrite(astRoot);
-		
-		TypeDeclaration typeDecl= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methDecl= findMethodDeclaration(typeDecl, "foo");
-		VariableDeclarationStatement varStat= (VariableDeclarationStatement) methDecl.getBody().statements().get(0);
-		
-		CastExpression expression= (CastExpression) ((VariableDeclarationFragment) varStat.fragments().get(0)).getInitializer();
-		MethodInvocation invocation= (MethodInvocation) expression.getExpression();
-		
-		CastExpression newCast= ast.newCastExpression();
-		newCast.setType((Type) rewrite.createCopyPlaceholder(expression.getType()));
-		newCast.setExpression((Expression) rewrite.createCopyPlaceholder(invocation.getExpression()));
-		ParenthesizedExpression parents= ast.newParenthesizedExpression();
-		parents.setExpression(newCast);
-		
-		ASTNode node= rewrite.createCopyPlaceholder(invocation);
-		rewrite.markAsReplaced(expression, node);
-		rewrite.markAsReplaced(invocation.getExpression(), parents);
-				
-		String preview= evaluateRewrite(cu, rewrite);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        int i= ((String) o).indexOf('1');\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();		
-
-		assertEqualString(preview, expected);
-	}
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingStatementsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingStatementsTest.java
deleted file mode 100644
index 37e2616..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingStatementsTest.java
+++ /dev/null
@@ -1,3493 +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.jdt.ui.tests.astrewrite;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.*;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodeConstants;
-import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory;
-import org.eclipse.jdt.internal.corext.dom.ASTRewrite;
-import org.eclipse.jdt.internal.corext.dom.NewASTRewrite;
-import org.eclipse.jdt.internal.corext.dom.NodeFinder;
-import org.eclipse.jdt.internal.ui.text.correction.ASTRewriteCorrectionProposal;
-
-public class ASTRewritingStatementsTest extends ASTRewritingTest {
-
-	private static final Class THIS= ASTRewritingStatementsTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ASTRewritingStatementsTest(String name) {
-		super(name);
-	}
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTRewritingStatementsTest("testDoStatement"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	public void testInsert1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		/* foo(): append a return statement */
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public Object foo() {\n");
-		buf.append("        if (this.equals(new Object())) {\n");
-		buf.append("            toString();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("No block" , block != null);	
-		
-		List statements= block.statements();
-		ReturnStatement returnStatement= block.getAST().newReturnStatement();
-		returnStatement.setExpression(ASTNodeFactory.newDefaultExpression(type.getAST(), methodDecl.getReturnType(), methodDecl.getExtraDimensions()));
-		statements.add(returnStatement);
-		rewrite.markAsInserted(returnStatement);
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public Object foo() {\n");
-		buf.append("        if (this.equals(new Object())) {\n");
-		buf.append("            toString();\n");
-		buf.append("        }\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testInsert2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		
-		/* insert a statement before */
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class D {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        Integer i= new Integer(3);\n");
-		buf.append("    }\n");
-		buf.append("    public void hoo(int p1, Object p2) {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("D.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "D");
-		
-		MethodDeclaration methodDeclGoo= findMethodDeclaration(type, "goo");
-		List bodyStatements= methodDeclGoo.getBody().statements();
-
-		ASTNode copy= rewrite.createCopy((ASTNode) bodyStatements.get(0));
-		
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "hoo");
-		Block block= methodDecl.getBody();
-		assertTrue("No block" , block != null);
-		
-		List statements= block.statements();
-		assertTrue("No statements in block", !statements.isEmpty());
-		assertTrue("No ReturnStatement", statements.get(0) instanceof ReturnStatement);
-		
-		statements.add(0, copy);
-		rewrite.markAsInserted(copy);
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class D {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        Integer i= new Integer(3);\n");
-		buf.append("    }\n");
-		buf.append("    public void hoo(int p1, Object p2) {\n");
-		buf.append("        Integer i= new Integer(3);\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());			
-		clearRewrite(rewrite);
-	}
-
-	public void testInsert3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-
-	  // add after comment 
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        i++; //comment\n");
-		buf.append("        i++; //comment\n");					
-		buf.append("        return new Integer(3);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		AST ast= astRoot.getAST();
-	
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "goo");
-		Block block= methodDecl.getBody();
-		assertTrue("No block" , block != null);
-		
-		MethodInvocation invocation1= ast.newMethodInvocation();
-		invocation1.setName(ast.newSimpleName("foo"));
-		ExpressionStatement statement1= ast.newExpressionStatement(invocation1);
-		
-		rewrite.markAsInserted(statement1);
-		
-		MethodInvocation invocation2= ast.newMethodInvocation();
-		invocation2.setName(ast.newSimpleName("foo"));
-		ExpressionStatement statement2= ast.newExpressionStatement(invocation2);
-		
-		rewrite.markAsInserted(statement2);		
-		
-		List statements= methodDecl.getBody().statements();
-		
-		rewrite.markAsRemoved((ASTNode) statements.get(1));
-		
-		statements.add(2, statement2);
-		statements.add(1, statement1);
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        i++; //comment\n");
-		buf.append("        foo();\n");
-		buf.append("        foo();\n");				
-		buf.append("        return new Integer(3);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());			
-		clearRewrite(rewrite);
-	}		
-	
-	public void testRemove1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);			
-		/* foo():  remove if... */
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public Object foo() {\n");
-		buf.append("        if (this.equals(new Object())) {\n");
-		buf.append("            toString();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("No block" , block != null);	
-		
-		List statements= block.statements();
-		assertTrue("No statements in block", !statements.isEmpty());
-		
-		rewrite.markAsRemoved((ASTNode) statements.get(0));
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public Object foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	public void testRemove2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);			
-	
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class D {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        return new Integer(3);\n");
-		buf.append("    }\n");
-		buf.append("    public void hoo(int p1, Object p2) {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("D.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "D");
-	
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "goo");
-		Block block= methodDecl.getBody();
-		assertTrue("No block" , block != null);
-		
-		List statements= block.statements();
-		assertTrue("No statements in block", !statements.isEmpty());
-		assertTrue("No ReturnStatement", statements.get(0) instanceof ReturnStatement);
-		
-		ReturnStatement returnStatement= (ReturnStatement) statements.get(0);
-		Expression expr= returnStatement.getExpression();
-		rewrite.markAsRemoved(expr);
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class D {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("    public void hoo(int p1, Object p2) {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());			
-		clearRewrite(rewrite);
-	}
-	public void testRemove3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);			
-	
-	  // delete 
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        i++; //comment\n");
-		buf.append("        i++; //comment\n");					
-		buf.append("        return new Integer(3);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-	
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "goo");
-		Block block= methodDecl.getBody();
-		assertTrue("No block" , block != null);
-		
-		List statements= methodDecl.getBody().statements();
-		rewrite.markAsRemoved((ASTNode) statements.get(0));
-		rewrite.markAsRemoved((ASTNode) statements.get(1));
-		rewrite.markAsRemoved((ASTNode) statements.get(2));
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());			
-		clearRewrite(rewrite);
-	}
-	
-	public void testReplace1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);		
-		/* foo(): if.. -> return; */
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public Object foo() {\n");
-		buf.append("        if (this.equals(new Object())) {\n");
-		buf.append("            toString();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "C");
-		
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("No block" , block != null);	
-		
-		List statements= block.statements();
-		assertTrue("No statements in block", !statements.isEmpty());
-		
-		ReturnStatement returnStatement= block.getAST().newReturnStatement();
-		rewrite.markAsReplaced((ASTNode) statements.get(0), returnStatement);
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public Object foo() {\n");
-		buf.append("        return;\n");			
-		buf.append("    }\n");
-		buf.append("}\n");
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testReplace2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);		
-		
-		/* goo(): new Integer(3) -> 'null' */
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class D {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        return new Integer(3);\n");
-		buf.append("    }\n");
-		buf.append("    public void hoo(int p1, Object p2) {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("D.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "D");
-	
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "goo");
-		Block block= methodDecl.getBody();
-		assertTrue("No block" , block != null);
-		
-		List statements= block.statements();
-		assertTrue("No statements in block", !statements.isEmpty());
-		assertTrue("No ReturnStatement", statements.get(0) instanceof ReturnStatement);
-		
-		ReturnStatement returnStatement= (ReturnStatement) statements.get(0);
-		Expression expr= returnStatement.getExpression();
-		Expression modified= ASTNodeFactory.newDefaultExpression(type.getAST(), methodDecl.getReturnType(), methodDecl.getExtraDimensions());
-
-		rewrite.markAsReplaced(expr, modified);
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class D {\n");
-		buf.append("    public Object goo() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("    public void hoo(int p1, Object p2) {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	
-	public void testBreakStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        break;\n");
-		buf.append("        break label;\n");
-		buf.append("        break label;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-		{ // insert label
-			BreakStatement statement= (BreakStatement) statements.get(0);
-			assertTrue("Has label", statement.getLabel() == null);
-			
-			SimpleName newLabel= ast.newSimpleName("label2");	
-			statement.setLabel(newLabel);
-			
-			rewrite.markAsInserted(newLabel);
-		}
-		{ // replace label
-			BreakStatement statement= (BreakStatement) statements.get(1);
-			
-			SimpleName label= statement.getLabel();
-			assertTrue("Has no label", label != null);
-			
-			SimpleName newLabel= ast.newSimpleName("label2");	
-
-			rewrite.markAsReplaced(label, newLabel);
-		}
-		{ // remove label
-			BreakStatement statement= (BreakStatement) statements.get(2);
-			
-			SimpleName label= statement.getLabel();
-			assertTrue("Has no label", label != null);
-			
-			rewrite.markAsRemoved(label);
-		}	
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        break label2;\n");
-		buf.append("        break label2;\n");
-		buf.append("        break;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testConstructorInvocation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(String e, String f) {\n");
-		buf.append("        this();\n");
-		buf.append("    }\n");
-		buf.append("    public E() {\n");
-		buf.append("        this(\"Hello\", true);\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration[] declarations= type.getMethods();
-		assertTrue("Number of statements not 2", declarations.length == 2);			
-
-		{ // add parameters
-			Block block= declarations[0].getBody();
-			List statements= block.statements();
-			assertTrue("Number of statements not 1", statements.size() == 1);
-			
-			ConstructorInvocation invocation= (ConstructorInvocation) statements.get(0);
-	
-			List arguments= invocation.arguments();
-			
-			StringLiteral stringLiteral1= ast.newStringLiteral();
-			stringLiteral1.setLiteralValue("Hello");
-			arguments.add(stringLiteral1);
-			rewrite.markAsInserted(stringLiteral1);
-			
-			StringLiteral stringLiteral2= ast.newStringLiteral();
-			stringLiteral2.setLiteralValue("World");
-			arguments.add(stringLiteral2);
-			rewrite.markAsInserted(stringLiteral2);
-		}
-		{ //remove parameters
-			Block block= declarations[1].getBody();
-			List statements= block.statements();
-			assertTrue("Number of statements not 1", statements.size() == 1);			
-			ConstructorInvocation invocation= (ConstructorInvocation) statements.get(0);
-	
-			List arguments= invocation.arguments();
-			
-			rewrite.markAsRemoved((ASTNode) arguments.get(0));
-			rewrite.markAsRemoved((ASTNode) arguments.get(1));
-		}		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(String e, String f) {\n");
-		buf.append("        this(\"Hello\", \"World\");\n");
-		buf.append("    }\n");
-		buf.append("    public E() {\n");
-		buf.append("        this();\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testContinueStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        continue;\n");
-		buf.append("        continue label;\n");
-		buf.append("        continue label;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-		{ // insert label
-			ContinueStatement statement= (ContinueStatement) statements.get(0);
-			assertTrue("Has label", statement.getLabel() == null);
-			
-			SimpleName newLabel= ast.newSimpleName("label2");	
-			statement.setLabel(newLabel);
-			
-			rewrite.markAsInserted(newLabel);
-		}
-		{ // replace label
-			ContinueStatement statement= (ContinueStatement) statements.get(1);
-			
-			SimpleName label= statement.getLabel();
-			assertTrue("Has no label", label != null);
-			
-			SimpleName newLabel= ast.newSimpleName("label2");	
-
-			rewrite.markAsReplaced(label, newLabel);
-		}
-		{ // remove label
-			ContinueStatement statement= (ContinueStatement) statements.get(2);
-			
-			SimpleName label= statement.getLabel();
-			assertTrue("Has no label", label != null);
-			
-			rewrite.markAsRemoved(label);
-		}	
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        continue label2;\n");
-		buf.append("        continue label2;\n");
-		buf.append("        continue;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testDoStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        do {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } while (i == j);\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-
-		{ // replace body and expression
-			DoStatement doStatement= (DoStatement) statements.get(0);
-			
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(doStatement.getBody(), newBody);
-
-			BooleanLiteral literal= ast.newBooleanLiteral(true);
-			rewrite.markAsReplaced(doStatement.getExpression(), literal);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        do {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        } while (true);\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testDoStatement1() throws Exception {
-		if (true) {
-			return;
-		}
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        do {\n");
-		buf.append("            foo();\n");		
-		buf.append("        } while (true);\n");	
-		buf.append("        do\n");
-		buf.append("            foo();\n");
-		buf.append("        while (true);\n");	
-		buf.append("        do {\n");
-		buf.append("            foo();\n");	
-		buf.append("        } while (true);\n");	
-		buf.append("        do\n");
-		buf.append("            foo();\n");
-		buf.append("        while (true);\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("Parse errors", (block.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace body block with statement
-			DoStatement doStatement= (DoStatement) statements.get(0);
-			
-			
-			TryStatement newTry= ast.newTryStatement();
-			newTry.getBody().statements().add(ast.newReturnStatement());
-			CatchClause newCatchClause= ast.newCatchClause();
-			SingleVariableDeclaration varDecl= ast.newSingleVariableDeclaration();
-			varDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			varDecl.setName(ast.newSimpleName("e"));
-			newCatchClause.setException(varDecl);
-			newTry.catchClauses().add(newCatchClause);
-			
-			rewrite.markAsReplaced(doStatement.getBody(), newTry);
-		}
-		{ // replace body statement with block
-			DoStatement doStatement= (DoStatement) statements.get(1);
-			
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(doStatement.getBody(), newBody);
-
-		}
-		{ // replace body block with block
-			DoStatement doStatement= (DoStatement) statements.get(2);
-			
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(doStatement.getBody(), newBody);
-
-		}		
-		{ // replace body statement with body
-			DoStatement doStatement= (DoStatement) statements.get(3);
-			
-			
-			TryStatement newTry= ast.newTryStatement();
-			newTry.getBody().statements().add(ast.newReturnStatement());
-			CatchClause newCatchClause= ast.newCatchClause();
-			SingleVariableDeclaration varDecl= ast.newSingleVariableDeclaration();
-			varDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			varDecl.setName(ast.newSimpleName("e"));
-			newCatchClause.setException(varDecl);
-			newTry.catchClauses().add(newCatchClause);
-			
-			rewrite.markAsReplaced(doStatement.getBody(), newTry);
-		}
-		
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        do\n");
-		buf.append("            try {\n");
-		buf.append("                return;\n");
-		buf.append("            } catch (Exception e) {\n");
-		buf.append("            }\n");
-		buf.append("        while (true);\n");	
-		buf.append("        do {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        } while (true);\n");	
-		buf.append("        do {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        } while (true);\n");	
-		buf.append("        do\n");
-		buf.append("            try {\n");
-		buf.append("                return;\n");
-		buf.append("            } catch (Exception e) {\n");
-		buf.append("            }\n");
-		buf.append("        while (true);\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}		
-	
-
-	public void testExpressionStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        i= 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("Parse errors", (block.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // replace expression
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			
-			Assignment assignment= (Assignment) stmt.getExpression();
-			Expression placeholder= (Expression) rewrite.createCopy(assignment);
-									
-			Assignment newExpression= ast.newAssignment();
-			newExpression.setLeftHandSide(ast.newSimpleName("x"));
-			newExpression.setRightHandSide(placeholder);
-			newExpression.setOperator(Assignment.Operator.ASSIGN);
-	
-			rewrite.markAsReplaced(stmt.getExpression(), newExpression);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        x = i= 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-
-	}
-	
-	public void testForStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for (int i= 0; i < len; i++) {\n");
-		buf.append("        }\n");
-		buf.append("        for (i= 0, j= 0; i < len; i++, j++) {\n");
-		buf.append("        }\n");
-		buf.append("        for (;;) {\n");
-		buf.append("        }\n");	
-		buf.append("        for (;;) {\n");
-		buf.append("        }\n");
-		buf.append("        for (i= 0; i < len; i++) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("Parse errors", (block.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		List statements= block.statements();
-		assertTrue("Number of statements not 5", statements.size() == 5);
-
-		{ // replace initializer, change expression, add updater, replace cody
-			ForStatement forStatement= (ForStatement) statements.get(0);
-			
-			List initializers= forStatement.initializers();
-			assertTrue("Number of initializers not 1", initializers.size() == 1);
-			
-			Assignment assignment= ast.newAssignment();
-			assignment.setLeftHandSide(ast.newSimpleName("i"));
-			assignment.setOperator(Assignment.Operator.ASSIGN);
-			assignment.setRightHandSide(ast.newNumberLiteral("3"));
-			
-			rewrite.markAsReplaced((ASTNode) initializers.get(0), assignment);
-			
-			Assignment assignment2= ast.newAssignment();
-			assignment2.setLeftHandSide(ast.newSimpleName("j"));
-			assignment2.setOperator(Assignment.Operator.ASSIGN);
-			assignment2.setRightHandSide(ast.newNumberLiteral("4"));
-			
-			rewrite.markAsInserted(assignment2);
-			
-			initializers.add(assignment2);
-			
-			BooleanLiteral literal= ast.newBooleanLiteral(true);
-			rewrite.markAsReplaced(forStatement.getExpression(), literal);
-			
-			// add updater
-			PrefixExpression prefixExpression= ast.newPrefixExpression();
-			prefixExpression.setOperand(ast.newSimpleName("j"));
-			prefixExpression.setOperator(PrefixExpression.Operator.INCREMENT);
-			
-			forStatement.updaters().add(prefixExpression);
-			
-			rewrite.markAsInserted(prefixExpression);
-			
-			// replace body		
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(forStatement.getBody(), newBody);
-		}
-		{ // remove initializers, expression and updaters
-			ForStatement forStatement= (ForStatement) statements.get(1);
-			
-			List initializers= forStatement.initializers();
-			assertTrue("Number of initializers not 2", initializers.size() == 2);
-			
-			rewrite.markAsRemoved((ASTNode) initializers.get(0));
-			rewrite.markAsRemoved((ASTNode) initializers.get(1));
-			
-			rewrite.markAsRemoved(forStatement.getExpression());
-			
-			List updaters= forStatement.updaters();
-			assertTrue("Number of initializers not 2", updaters.size() == 2);
-			
-			rewrite.markAsRemoved((ASTNode) updaters.get(0));
-			rewrite.markAsRemoved((ASTNode) updaters.get(1));
-		}
-		{ // insert updater
-			ForStatement forStatement= (ForStatement) statements.get(2);
-			
-			PrefixExpression prefixExpression= ast.newPrefixExpression();
-			prefixExpression.setOperand(ast.newSimpleName("j"));
-			prefixExpression.setOperator(PrefixExpression.Operator.INCREMENT);
-			
-			forStatement.updaters().add(prefixExpression);
-			
-			rewrite.markAsInserted(prefixExpression);
-		}
-		
-		{ // insert updater & initializer
-			ForStatement forStatement= (ForStatement) statements.get(3);
-			
-			Assignment assignment= ast.newAssignment();
-			assignment.setLeftHandSide(ast.newSimpleName("j"));
-			assignment.setOperator(Assignment.Operator.ASSIGN);
-			assignment.setRightHandSide(ast.newNumberLiteral("3"));
-			
-			forStatement.initializers().add(assignment);
-			
-			rewrite.markAsInserted(assignment);	
-			
-			PrefixExpression prefixExpression= ast.newPrefixExpression();
-			prefixExpression.setOperand(ast.newSimpleName("j"));
-			prefixExpression.setOperator(PrefixExpression.Operator.INCREMENT);
-			
-			forStatement.updaters().add(prefixExpression);
-			
-			rewrite.markAsInserted(prefixExpression);
-		}
-		
-		{ // replace initializer: turn assignement to var decl
-			ForStatement forStatement= (ForStatement) statements.get(4);
-			
-			Assignment assignment= (Assignment) forStatement.initializers().get(0);
-			SimpleName leftHandSide= (SimpleName) assignment.getLeftHandSide();
-			
-			VariableDeclarationFragment varFragment= ast.newVariableDeclarationFragment();
-			VariableDeclarationExpression varDecl= ast.newVariableDeclarationExpression(varFragment);
-			varFragment.setName(ast.newSimpleName(leftHandSide.getIdentifier()));
-			
-			Expression placeholder= (Expression) rewrite.createCopy(assignment.getRightHandSide());
-			varFragment.setInitializer(placeholder);
-			varDecl.setType(ast.newPrimitiveType(PrimitiveType.INT));
-
-			
-			rewrite.markAsReplaced(assignment, varDecl);
-		}	
-		
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for (i = 3, j = 4; true; i++, ++j) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        for (;;) {\n");
-		buf.append("        }\n");
-		buf.append("        for (;;++j) {\n");
-		buf.append("        }\n");		
-		buf.append("        for (j = 3;;++j) {\n");
-		buf.append("        }\n");
-		buf.append("        for (int i = 0; i < len; i++) {\n");
-		buf.append("        }\n");			
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testForStatement1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for (;;) {\n");
-		buf.append("            foo();\n");		
-		buf.append("        }\n");	
-		buf.append("        for (;;)\n");
-		buf.append("            foo();\n");	
-		buf.append("        for (;;) {\n");
-		buf.append("            foo();\n");	
-		buf.append("        }\n");	
-		buf.append("        for (;;)\n");
-		buf.append("            foo();\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("Parse errors", (block.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace body block with statement
-			ForStatement forStatement= (ForStatement) statements.get(0);
-			
-			
-			TryStatement newTry= ast.newTryStatement();
-			newTry.getBody().statements().add(ast.newReturnStatement());
-			CatchClause newCatchClause= ast.newCatchClause();
-			SingleVariableDeclaration varDecl= ast.newSingleVariableDeclaration();
-			varDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			varDecl.setName(ast.newSimpleName("e"));
-			newCatchClause.setException(varDecl);
-			newTry.catchClauses().add(newCatchClause);
-			
-			rewrite.markAsReplaced(forStatement.getBody(), newTry);
-		}
-		{ // replace body statement with block
-			ForStatement forStatement= (ForStatement) statements.get(1);
-			
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(forStatement.getBody(), newBody);
-
-		}
-		{ // replace body block with block
-			ForStatement forStatement= (ForStatement) statements.get(2);
-			
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(forStatement.getBody(), newBody);
-
-		}		
-		{ // replace body statement with body
-			ForStatement forStatement= (ForStatement) statements.get(3);
-			
-			
-			TryStatement newTry= ast.newTryStatement();
-			newTry.getBody().statements().add(ast.newReturnStatement());
-			CatchClause newCatchClause= ast.newCatchClause();
-			SingleVariableDeclaration varDecl= ast.newSingleVariableDeclaration();
-			varDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			varDecl.setName(ast.newSimpleName("e"));
-			newCatchClause.setException(varDecl);
-			newTry.catchClauses().add(newCatchClause);
-			
-			rewrite.markAsReplaced(forStatement.getBody(), newTry);
-		}
-		
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for (;;)\n");
-		buf.append("            try {\n");
-		buf.append("                return;\n");
-		buf.append("            } catch (Exception e) {\n");
-		buf.append("            }\n");	
-		buf.append("        for (;;) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");	
-		buf.append("        for (;;) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");	
-		buf.append("        for (;;)\n");
-		buf.append("            try {\n");
-		buf.append("                return;\n");
-		buf.append("            } catch (Exception e) {\n");
-		buf.append("            }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}		
-	
-	
-	public void testIfStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 2", statements.size() == 2);
-
-		{ // replace expression body and then body, remove else body
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			
-			BooleanLiteral literal= ast.newBooleanLiteral(true);
-			rewrite.markAsReplaced(ifStatement.getExpression(), literal);			
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			Block newBody= ast.newBlock();
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(ifStatement.getThenStatement(), newBody);
-			
-			rewrite.markAsRemoved(ifStatement.getElseStatement());
-		}
-		{ // add else body
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			Block newBody= ast.newBlock();
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsInserted(newBody);
-			
-			ifStatement.setElseStatement(newBody);
-		}		
-		
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (true) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatement1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            hoo(11);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 5", statements.size() == 3);
-
-		{ // replace then block by statement
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-	
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-		}
-		{ // replace then block by statement
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-	
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-		}
-		{ // replace then block by statement
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-	
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            hoo(11);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatement2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            hoo(11);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace then block by statement, add else statement
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-	
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-			
-			Statement returnStatement= ast.newReturnStatement();
-			rewrite.markAsInserted(returnStatement);
-			
-			ifStatement.setElseStatement(returnStatement);
-			
-		}
-		{ // replace then block by statement, remove else statement
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-	
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-			rewrite.markAsRemoved(ifStatement.getElseStatement());
-		}
-		{ // replace then block by statement, add else statement
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-	
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-			
-			Block newElseBlock= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newElseBlock.statements().add(returnStatement);
-			
-			rewrite.markAsInserted(newElseBlock);
-			
-			ifStatement.setElseStatement(newElseBlock);
-			
-		}
-		{ // replace then block by statement, remove else statement
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-	
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-			rewrite.markAsRemoved(ifStatement.getElseStatement());
-		}				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            return;\n");		
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatement3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            hoo(11);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-
-		{ // replace then block by statement
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-		}
-		{ // replace then block by statement
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-		}
-		{ // replace then block by statement
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            hoo(11);\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatement4() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            hoo(11);\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace then statement by block , add else statement
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			Statement returnStatement= ast.newReturnStatement();
-			rewrite.markAsInserted(returnStatement);
-			
-			ifStatement.setElseStatement(returnStatement);
-			
-		}
-		{ // replace then statement by block, remove else statement
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			rewrite.markAsRemoved(ifStatement.getElseStatement());
-		}
-		{ // replace then block by statement, add else statement
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			Block newElseBlock= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newElseBlock.statements().add(returnStatement);
-			
-			rewrite.markAsInserted(newElseBlock);
-			
-			ifStatement.setElseStatement(newElseBlock);
-			
-		}
-		{ // replace then block by statement, remove else statement
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			rewrite.markAsRemoved(ifStatement.getElseStatement());
-		}				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            return;\n");		
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatement5() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else if (true) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else if (true)\n");
-		buf.append("            hoo(11);\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace then statement by block , add else statement
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Block newBody2= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newBody2.statements().add(returnStatement);			
-
-			newElseBlock.setThenStatement(newBody2);
-			rewrite.markAsInserted(newElseBlock);
-						
-			ifStatement.setElseStatement(newElseBlock);
-			
-		}
-		{ // replace then statement by block, remove else statement
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			rewrite.markAsRemoved(ifStatement.getElseStatement());
-		}
-		{ // replace then block by statement, add else statement
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Statement returnStatement= ast.newReturnStatement();
-
-			newElseBlock.setThenStatement(returnStatement);
-			rewrite.markAsInserted(newElseBlock);
-						
-			ifStatement.setElseStatement(newElseBlock);
-		}
-		{ // replace then block by statement, remove else statement
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-	
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			ASTNode placeholder= rewrite.createMove(statement);
-			Block newBody= ast.newBlock();
-			newBody.statements().add(placeholder);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			rewrite.markAsRemoved(ifStatement.getElseStatement());
-		}				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else if (true) {\n");
-		buf.append("            return;\n");		
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else if (true)\n");
-		buf.append("            return;\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatement6() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 2", statements.size() == 2);
-
-		{ // replace then statement by a try statement
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			
-			TryStatement newTry= ast.newTryStatement();
-			newTry.getBody().statements().add(ast.newReturnStatement());
-			CatchClause newCatchClause= ast.newCatchClause();
-			SingleVariableDeclaration varDecl= ast.newSingleVariableDeclaration();
-			varDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			varDecl.setName(ast.newSimpleName("e"));
-			newCatchClause.setException(varDecl);
-			newTry.catchClauses().add(newCatchClause);
-			
-			rewrite.markAsReplaced(ifStatement.getThenStatement(), newTry);			
-		}
-		{ // replace then statement by a try statement
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-	
-			TryStatement newTry= ast.newTryStatement();
-			newTry.getBody().statements().add(ast.newReturnStatement());
-			CatchClause newCatchClause= ast.newCatchClause();
-			SingleVariableDeclaration varDecl= ast.newSingleVariableDeclaration();
-			varDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			varDecl.setName(ast.newSimpleName("e"));
-			newCatchClause.setException(varDecl);
-			newTry.catchClauses().add(newCatchClause);
-			
-			rewrite.markAsReplaced(ifStatement.getThenStatement(), newTry);	
-		}
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            try {\n");
-		buf.append("                return;\n");
-		buf.append("            } catch (Exception e) {\n");
-		buf.append("            }\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            try {\n");
-		buf.append("                return;\n");
-		buf.append("            } catch (Exception e) {\n");
-		buf.append("            }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatement_bug48988() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void doit() {\n");
-		buf.append("        int var;\n");
-		buf.append("        if (true)\n");
-		buf.append("            var = 17;\n");
-		buf.append("        else if (var == 18)\n");
-		buf.append("            if (1 < var && var < 17)\n");
-		buf.append("                var = 1;\n");
-		buf.append("            else\n");
-		buf.append("                var++;\n");
-		buf.append("        else\n");
-		buf.append("            return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		
-		String str= "if (1 < var && var < 17)";
-		int idx= buf.indexOf(str);
-		ASTNode node = NodeFinder.perform(astRoot, idx, str.length());
-		assertTrue(node instanceof IfStatement);
-		
-		{ // replace else statement by a block containing the old then statement
-			IfStatement ifStatement= (IfStatement) node;
-			ASTNode placeholder = rewrite.createMove(ifStatement);
-			Block newBlock = ast.newBlock();
-			newBlock.statements().add(placeholder);
-			rewrite.markAsReplaced(ifStatement, newBlock);
-		}
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void doit() {\n");
-		buf.append("        int var;\n");
-		buf.append("        if (true)\n");
-		buf.append("            var = 17;\n");
-		buf.append("        else if (var == 18) {\n");
-		buf.append("            if (1 < var && var < 17)\n");
-		buf.append("                var = 1;\n");
-		buf.append("            else\n");
-		buf.append("                var++;\n");
-		buf.append("        } else\n");
-		buf.append("            return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	public void testIfStatementReplaceElse1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            hoo(11);\n");			
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            hoo(11);\n");	
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace then statement by block , replace else statement
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			
-			Block newElseBlock= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newElseBlock.statements().add(returnStatement);			
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-			
-		}
-		{ // replace then statement by block, replace else statement
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-				
-			Block newElseBlock= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newElseBlock.statements().add(returnStatement);			
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-		}
-		{ // replace then block by statement, replace else statement
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-				
-			Statement returnStatement= ast.newReturnStatement();
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), returnStatement);
-			
-		}
-		{ // replace then block by statement, replace else statement
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-				
-			Statement returnStatement= ast.newReturnStatement();
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), returnStatement);
-		}				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");	
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            return;\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            return;\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	
-	public void testIfStatementReplaceElse2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            hoo(11);\n");			
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            hoo(11);\n");	
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace then statement by block , replace else statement
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			Block newBody= ast.newBlock();
-			ASTNode newStatement= rewrite.createMove(statement);
-			newBody.statements().add(newStatement);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			Block newElseBlock= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newElseBlock.statements().add(returnStatement);			
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-			
-		}
-		{ // replace then statement by block, replace else statement
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-			
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-				
-			Block newElseBlock= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newElseBlock.statements().add(returnStatement);			
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-		}
-		{ // replace then block by statement, replace else statement
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-			
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			Block newBody= ast.newBlock();
-			ASTNode newStatement= rewrite.createMove(statement);
-			newBody.statements().add(newStatement);
-			
-			rewrite.markAsReplaced(statement, newBody);				
-			
-			Statement returnStatement= ast.newReturnStatement();
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), returnStatement);
-			
-		}
-		{ // replace then block by statement, replace else statement
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-			
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-				
-			Statement returnStatement= ast.newReturnStatement();
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), returnStatement);
-		}				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");	
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            return;\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            return;\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatementReplaceElse3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            hoo(11);\n");			
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            hoo(11);\n");	
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace then statement by block , replace else with if statement (no block)
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			Block newBody= ast.newBlock();
-			ASTNode newStatement= rewrite.createMove(statement);
-			newBody.statements().add(newStatement);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Statement newBody2= (Statement) rewrite.createMove(ifStatement.getElseStatement());
-			newElseBlock.setThenStatement(newBody2);
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-		}
-		{ // replace then statement by block, replace else with if statement (no block)
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-			
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-				
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Statement newBody2= (Statement) rewrite.createMove(ifStatement.getElseStatement());
-			newElseBlock.setThenStatement(newBody2);
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-		}
-		{ // replace then block by statement, replace else with if statement (block)
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-			
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			Block newBody= ast.newBlock();
-			ASTNode newStatement= rewrite.createMove(statement);
-			newBody.statements().add(newStatement);
-			
-			rewrite.markAsReplaced(statement, newBody);				
-			
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Statement newBody2= (Statement) rewrite.createMove(ifStatement.getElseStatement());
-			newElseBlock.setThenStatement(newBody2);
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-			
-		}
-		{ // replace then block by statement, replace else with if statement (block)
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-			
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-				
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Statement newBody2= (Statement) rewrite.createMove(ifStatement.getElseStatement());
-			newElseBlock.setThenStatement(newBody2);
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-		}				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else if (true)\n");
-		buf.append("            hoo(11);\n");			
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else if (true)\n");
-		buf.append("            hoo(11);\n");	
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else if (true) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else if (true) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testIfStatementReplaceElse4() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else\n");
-		buf.append("            hoo(11);\n");			
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else\n");
-		buf.append("            hoo(11);\n");	
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-				
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace then statement by block , replace else with if statement (block)
-			IfStatement ifStatement= (IfStatement) statements.get(0);
-			
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			Block newBody= ast.newBlock();
-			ASTNode newStatement= rewrite.createMove(statement);
-			newBody.statements().add(newStatement);
-			
-			rewrite.markAsReplaced(statement, newBody);
-			
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Block newBody2= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newBody2.statements().add(returnStatement);			
-
-			newElseBlock.setThenStatement(newBody2);
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-		}
-		{ // replace then statement by block, replace else with if statement (block)
-			IfStatement ifStatement= (IfStatement) statements.get(1);
-			
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-				
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Block newBody2= ast.newBlock();
-			Statement returnStatement= ast.newReturnStatement();
-			newBody2.statements().add(returnStatement);	
-			
-			newElseBlock.setThenStatement(newBody2);
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-		}
-		{ // replace then block by statement, replace else with if statement (no block)
-			IfStatement ifStatement= (IfStatement) statements.get(2);
-			
-			ASTNode statement= ifStatement.getThenStatement();
-			
-			Block newBody= ast.newBlock();
-			ASTNode newStatement= rewrite.createMove(statement);
-			newBody.statements().add(newStatement);
-			
-			rewrite.markAsReplaced(statement, newBody);				
-			
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Statement newBody2= ast.newReturnStatement();
-			newElseBlock.setThenStatement(newBody2);
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-			
-		}
-		{ // replace then block by statement, replace else with if statement (no block)
-			IfStatement ifStatement= (IfStatement) statements.get(3);
-			
-			Block body= (Block) ifStatement.getThenStatement();
-			ASTNode statement= (ASTNode) body.statements().get(0);
-			
-			ASTNode newBody= rewrite.createMove(statement);
-			
-			rewrite.markAsReplaced(body, newBody);
-				
-			IfStatement newElseBlock= ast.newIfStatement();
-			newElseBlock.setExpression(ast.newBooleanLiteral(true));
-			
-			Statement newBody2= ast.newReturnStatement();
-			newElseBlock.setThenStatement(newBody2);
-
-			rewrite.markAsReplaced(ifStatement.getElseStatement(), newElseBlock);
-		}				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else if (true) {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");			
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else if (true) {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");		
-		buf.append("        if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        } else if (true)\n");
-		buf.append("            return;\n");	
-		buf.append("        if (i == 0)\n");
-		buf.append("            System.beep();\n");
-		buf.append("        else if (true)\n");
-		buf.append("            return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-	public void testLabeledStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        label: if (i == 0) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-
-		{ // replace label and statement
-			LabeledStatement labeledStatement= (LabeledStatement) statements.get(0);
-			
-			Name newLabel= ast.newSimpleName("newLabel");
-			
-			rewrite.markAsReplaced(labeledStatement.getLabel(), newLabel);
-						
-			Assignment newExpression= ast.newAssignment();
-			newExpression.setLeftHandSide(ast.newSimpleName("x"));
-			newExpression.setRightHandSide(ast.newNumberLiteral("1"));
-			newExpression.setOperator(Assignment.Operator.ASSIGN);
-			
-			Statement newStatement= ast.newExpressionStatement(newExpression);
-			
-			rewrite.markAsReplaced(labeledStatement.getBody(), newStatement);
-		}		
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        newLabel: x = 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}		
-	
-	public void testReturnStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        return;\n");
-		buf.append("        return 1;\n");
-		buf.append("        return 1;\n");
-		buf.append("        return 1 + 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-		{ // insert expression
-			ReturnStatement statement= (ReturnStatement) statements.get(0);
-			assertTrue("Has expression", statement.getExpression() == null);
-			
-			SimpleName newExpression= ast.newSimpleName("x");	
-			statement.setExpression(newExpression);
-			
-			rewrite.markAsInserted(newExpression);
-		}
-		{ // replace expression
-			ReturnStatement statement= (ReturnStatement) statements.get(1);
-			
-			Expression expression= statement.getExpression();
-			assertTrue("Has no label", expression != null);
-			
-			SimpleName newExpression= ast.newSimpleName("x");
-
-			rewrite.markAsReplaced(expression, newExpression);
-		}
-		{ // remove expression
-			ReturnStatement statement= (ReturnStatement) statements.get(2);
-			
-			Expression expression= statement.getExpression();
-			assertTrue("Has no label", expression != null);
-			
-			rewrite.markAsRemoved(expression);
-		}
-		{ // modify in expression (no change)
-			ReturnStatement statement= (ReturnStatement) statements.get(3);
-			
-			InfixExpression expression= (InfixExpression) statement.getExpression();
-			rewrite.markAsReplaced(expression.getLeftOperand(), ast.newNumberLiteral("9"));
-		}		
-		
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        return x;\n");
-		buf.append("        return x;\n");
-		buf.append("        return;\n");
-		buf.append("        return 9 + 2;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testSwitchStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        switch (i) {\n");
-		buf.append("        }\n");
-		buf.append("        switch (i) {\n");
-		buf.append("            case 1:\n");
-		buf.append("                i= 1;\n");
-		buf.append("                break;\n");	
-		buf.append("            case 2:\n");
-		buf.append("                i= 2;\n");
-		buf.append("                break;\n");			
-		buf.append("            default:\n");
-		buf.append("                i= 3;\n");		
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List blockStatements= block.statements();
-		assertTrue("Number of statements not 2", blockStatements.size() == 2);
-		{ // insert statements, replace expression
-			SwitchStatement switchStatement= (SwitchStatement) blockStatements.get(0);
-			
-			ASTNode expression= switchStatement.getExpression();
-			SimpleName newExpression= ast.newSimpleName("x");	
-			rewrite.markAsReplaced(expression, newExpression);
-			
-			List statements= switchStatement.statements();
-			assertTrue("Number of statements not 0", statements.size() == 0);
-			
-			SwitchCase caseStatement1= ast.newSwitchCase();
-			caseStatement1.setExpression(ast.newNumberLiteral("1"));
-			rewrite.markAsInserted(caseStatement1);
-			statements.add(caseStatement1);
-			
-			Statement statement1= ast.newReturnStatement();
-			rewrite.markAsInserted(statement1);
-			statements.add(statement1);
-			
-			SwitchCase caseStatement2= ast.newSwitchCase(); // default
-			caseStatement2.setExpression(null);
-			rewrite.markAsInserted(caseStatement2);
-			statements.add(caseStatement2);
-		}
-		
-		{ // insert, remove, replace statements, change case statements
-			SwitchStatement switchStatement= (SwitchStatement) blockStatements.get(1);
-			
-			List statements= switchStatement.statements();
-			assertTrue("Number of statements not 8", statements.size() == 8);
-			
-			// remove statements
-			
-			rewrite.markAsRemoved((ASTNode) statements.get(0));
-			rewrite.markAsRemoved((ASTNode) statements.get(1));
-			rewrite.markAsRemoved((ASTNode) statements.get(2));
-			
-			// change case statement
-			SwitchCase caseStatement= (SwitchCase) statements.get(3);
-			Expression newCaseExpression= ast.newNumberLiteral("10");
-			rewrite.markAsReplaced(caseStatement.getExpression(), newCaseExpression);
-			
-			{
-				// insert case statement
-				SwitchCase caseStatement2= ast.newSwitchCase();
-				caseStatement2.setExpression(ast.newNumberLiteral("11"));
-				rewrite.markAsInserted(caseStatement2);
-				statements.add(0, caseStatement2);
-	
-				// insert statement
-				Statement statement1= ast.newReturnStatement();
-				rewrite.markAsInserted(statement1);
-				statements.add(1, statement1);
-			}
-			
-			{
-				// insert case statement
-				SwitchCase caseStatement2= ast.newSwitchCase();
-				caseStatement2.setExpression(ast.newNumberLiteral("12"));
-				rewrite.markAsInserted(caseStatement2);
-				statements.add(caseStatement2);
-	
-				// insert statement
-				Statement statement1= ast.newReturnStatement();
-				rewrite.markAsInserted(statement1);
-				statements.add(statement1);
-			}			
-			
-
-		}		
-	
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        switch (x) {\n");
-		buf.append("            case 1 :\n");
-		buf.append("                return;\n");
-		buf.append("            default :\n");			
-		buf.append("        }\n");
-		buf.append("        switch (i) {\n");
-		buf.append("            case 11 :\n");
-		buf.append("                return;\n");
-		buf.append("            case 10:\n");		
-		buf.append("                i= 2;\n");
-		buf.append("                break;\n");			
-		buf.append("            default:\n");
-		buf.append("                i= 3;\n");
-		buf.append("            case 12 :\n");
-		buf.append("                return;\n");			
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testSynchronizedStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        synchronized(this) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-
-		{ // replace expression and body
-			SynchronizedStatement statement= (SynchronizedStatement) statements.get(0);
-			ASTNode newExpression= ast.newSimpleName("obj");
-			rewrite.markAsReplaced(statement.getExpression(), newExpression);
-			
-			Block newBody= ast.newBlock();
-						
-			Assignment assign= ast.newAssignment();
-			assign.setLeftHandSide(ast.newSimpleName("x"));
-			assign.setRightHandSide(ast.newNumberLiteral("1"));
-			assign.setOperator(Assignment.Operator.ASSIGN);
-			
-			newBody.statements().add(ast.newExpressionStatement(assign));
-			
-			rewrite.markAsReplaced(statement.getBody(), newBody);
-		}		
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        synchronized(obj) {\n");
-		buf.append("            x = 1;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testThrowStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        throw new Exception();\n");
-		buf.append("    }\n");
-		buf.append("    public void goo() {\n");
-		buf.append("        throw new Exception('d');\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		{ // replace expression
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-			Block block= methodDecl.getBody();
-			List statements= block.statements();
-			assertTrue("Number of statements not 1", statements.size() == 1);			
-			
-			ThrowStatement statement= (ThrowStatement) statements.get(0);
-			
-			ClassInstanceCreation creation= ast.newClassInstanceCreation();
-			creation.setName(ast.newSimpleName("NullPointerException"));
-			creation.arguments().add(ast.newSimpleName("x"));
-			
-			rewrite.markAsReplaced(statement.getExpression(), creation);
-		}
-		
-		{ // modify expression
-			MethodDeclaration methodDecl= findMethodDeclaration(type, "goo");
-			Block block= methodDecl.getBody();
-			List statements= block.statements();
-			assertTrue("Number of statements not 1", statements.size() == 1);			
-			
-			ThrowStatement statement= (ThrowStatement) statements.get(0);			
-			
-			ClassInstanceCreation creation= (ClassInstanceCreation) statement.getExpression();
-			
-			ASTNode newArgument= ast.newSimpleName("x");
-			rewrite.markAsReplaced((ASTNode) creation.arguments().get(0), newArgument);
-		}				
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        throw new NullPointerException(x);\n");
-		buf.append("    }\n");
-		buf.append("    public void goo() {\n");
-		buf.append("        throw new Exception(x);\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}		
-		
-	public void testTryStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        try {\n");	
-		buf.append("        } finally {\n");
-		buf.append("        }\n");		
-		buf.append("        try {\n");	
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");
-		buf.append("        try {\n");	
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");
-		buf.append("        try {\n");	
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List blockStatements= block.statements();
-		assertTrue("Number of statements not 4", blockStatements.size() == 4);
-		{ // add catch, replace finally
-			TryStatement tryStatement= (TryStatement) blockStatements.get(0);
-			
-			CatchClause catchClause= ast.newCatchClause();
-			SingleVariableDeclaration decl= ast.newSingleVariableDeclaration();
-			decl.setType(ast.newSimpleType(ast.newSimpleName("IOException")));
-			decl.setName(ast.newSimpleName("e"));
-			catchClause.setException(decl);
-			
-			rewrite.markAsInserted(catchClause);
-			
-			tryStatement.catchClauses().add(catchClause);
-			
-			Block body= ast.newBlock();
-			body.statements().add(ast.newReturnStatement());
-			
-			rewrite.markAsReplaced(tryStatement.getFinally(), body);
-		}
-		{ // replace catch, remove finally
-			TryStatement tryStatement= (TryStatement) blockStatements.get(1);
-			
-			List catchClauses= tryStatement.catchClauses();
-			
-			CatchClause catchClause= ast.newCatchClause();
-			SingleVariableDeclaration decl= ast.newSingleVariableDeclaration();
-			decl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			decl.setName(ast.newSimpleName("x"));
-			catchClause.setException(decl);
-			
-			rewrite.markAsReplaced((ASTNode) catchClauses.get(0), catchClause);
-					
-			rewrite.markAsRemoved(tryStatement.getFinally());
-		}
-		{ // remove catch, add finally
-			TryStatement tryStatement= (TryStatement) blockStatements.get(2);
-			
-			List catchClauses= tryStatement.catchClauses();
-			rewrite.markAsRemoved((ASTNode) catchClauses.get(0));
-			
-			
-			Block body= ast.newBlock();
-			body.statements().add(ast.newReturnStatement());
-			rewrite.markAsInserted(body);
-			
-			tryStatement.setFinally(body);
-		}
-		{ // insert catch before and after existing
-			TryStatement tryStatement= (TryStatement) blockStatements.get(3);
-			
-			CatchClause catchClause1= ast.newCatchClause();
-			SingleVariableDeclaration decl1= ast.newSingleVariableDeclaration();
-			decl1.setType(ast.newSimpleType(ast.newSimpleName("ParseException")));
-			decl1.setName(ast.newSimpleName("e"));
-			catchClause1.setException(decl1);
-			
-			rewrite.markAsInserted(catchClause1);
-			
-			tryStatement.catchClauses().add(0, catchClause1);
-			
-			CatchClause catchClause2= ast.newCatchClause();
-			SingleVariableDeclaration decl2= ast.newSingleVariableDeclaration();
-			decl2.setType(ast.newSimpleType(ast.newSimpleName("FooException")));
-			decl2.setName(ast.newSimpleName("e"));
-			catchClause2.setException(decl2);
-			
-			rewrite.markAsInserted(catchClause2);
-			
-			tryStatement.catchClauses().add(catchClause2);			
-		}				
-			
-	
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        try {\n");
-		buf.append("        } catch (IOException e) {\n");		
-		buf.append("        } finally {\n");
-		buf.append("            return;\n");				
-		buf.append("        }\n");		
-		buf.append("        try {\n");	
-		buf.append("        } catch (Exception x) {\n");
-		buf.append("        }\n");
-		buf.append("        try {\n");	
-		buf.append("        } finally {\n");
-		buf.append("            return;\n");		
-		buf.append("        }\n");
-		buf.append("        try {\n");
-		buf.append("        } catch (ParseException e) {\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } catch (FooException e) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testTypeDeclarationStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        class A {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("Parse errors", (block.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		{ // replace expression
-			TypeDeclarationStatement stmt= (TypeDeclarationStatement) statements.get(0);
-			
-			TypeDeclaration newDeclaration= ast.newTypeDeclaration();
-			newDeclaration.setName(ast.newSimpleName("X"));
-			newDeclaration.setInterface(true);
-				
-			rewrite.markAsReplaced(stmt.getTypeDeclaration(), newDeclaration);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        interface X {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testVariableDeclarationStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int i1= 1;\n");
-		buf.append("        int i2= 1, k2= 2, n2= 3;\n");
-		buf.append("        final int i3= 1, k3= 2, n3= 3;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "A");
-		
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("Parse errors", (block.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-		{	// add modifier, change type, add fragment
-			VariableDeclarationStatement decl= (VariableDeclarationStatement) statements.get(0);
-			
-			// add modifier
-			int newModifiers= Modifier.FINAL;
-			rewrite.markAsReplaced(decl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			PrimitiveType newType= ast.newPrimitiveType(PrimitiveType.BOOLEAN);
-			rewrite.markAsReplaced(decl.getType(), newType);
-			
-			List fragments= decl.fragments();
-			
-			VariableDeclarationFragment frag=	ast.newVariableDeclarationFragment();
-			frag.setName(ast.newSimpleName("k1"));
-			frag.setInitializer(null);
-			
-			rewrite.markAsInserted(frag);
-			
-			fragments.add(frag);
-		}
-		{	// add modifiers, remove first two fragments, replace last
-			VariableDeclarationStatement decl= (VariableDeclarationStatement) statements.get(1);
-			
-			// add modifier
-			int newModifiers= Modifier.FINAL;
-			rewrite.markAsReplaced(decl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			List fragments= decl.fragments();
-			assertTrue("Number of fragments not 3", fragments.size() == 3);
-			
-			rewrite.markAsRemoved((ASTNode) fragments.get(0));
-			rewrite.markAsRemoved((ASTNode) fragments.get(1));
-			
-			VariableDeclarationFragment frag=	ast.newVariableDeclarationFragment();
-			frag.setName(ast.newSimpleName("k2"));
-			frag.setInitializer(null);
-			
-			rewrite.markAsReplaced((ASTNode) fragments.get(2), frag);
-		}
-		{	// remove modifiers
-			VariableDeclarationStatement decl= (VariableDeclarationStatement) statements.get(2);
-			
-			// add modifiers
-			int newModifiers= 0;
-			rewrite.markAsReplaced(decl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo() {\n");		
-		buf.append("        final boolean i1= 1, k1;\n");
-		buf.append("        final int k2;\n");
-		buf.append("        int i3= 1, k3= 2, n3= 3;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");	
-		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testWhileStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (i == j) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-
-		{ // replace expression and body
-			WhileStatement whileStatement= (WhileStatement) statements.get(0);
-
-			BooleanLiteral literal= ast.newBooleanLiteral(true);
-			rewrite.markAsReplaced(whileStatement.getExpression(), literal);
-			
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(whileStatement.getBody(), newBody);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (true) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testWhileStatement1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (true) {\n");
-		buf.append("            foo();\n");		
-		buf.append("        }\n");	
-		buf.append("        while (true)\n");
-		buf.append("            foo();\n");	
-		buf.append("        while (true) {\n");
-		buf.append("            foo();\n");	
-		buf.append("        }\n");	
-		buf.append("        while (true)\n");
-		buf.append("            foo();\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		assertTrue("Parse errors", (block.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		List statements= block.statements();
-		assertTrue("Number of statements not 4", statements.size() == 4);
-
-		{ // replace body block with statement
-			WhileStatement whileStatement= (WhileStatement) statements.get(0);
-			
-			
-			TryStatement newTry= ast.newTryStatement();
-			newTry.getBody().statements().add(ast.newReturnStatement());
-			CatchClause newCatchClause= ast.newCatchClause();
-			SingleVariableDeclaration varDecl= ast.newSingleVariableDeclaration();
-			varDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			varDecl.setName(ast.newSimpleName("e"));
-			newCatchClause.setException(varDecl);
-			newTry.catchClauses().add(newCatchClause);
-			
-			rewrite.markAsReplaced(whileStatement.getBody(), newTry);
-		}
-		{ // replace body statement with block
-			WhileStatement whileStatement= (WhileStatement) statements.get(1);
-			
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(whileStatement.getBody(), newBody);
-
-		}
-		{ // replace body block with block
-			WhileStatement whileStatement= (WhileStatement) statements.get(2);
-			
-			Block newBody= ast.newBlock();
-			
-			MethodInvocation invocation= ast.newMethodInvocation();
-			invocation.setName(ast.newSimpleName("hoo"));
-			invocation.arguments().add(ast.newNumberLiteral("11"));
-			
-			newBody.statements().add(ast.newExpressionStatement(invocation));
-			
-			rewrite.markAsReplaced(whileStatement.getBody(), newBody);
-
-		}		
-		{ // replace body statement with body
-			WhileStatement whileStatement= (WhileStatement) statements.get(3);
-			
-			
-			TryStatement newTry= ast.newTryStatement();
-			newTry.getBody().statements().add(ast.newReturnStatement());
-			CatchClause newCatchClause= ast.newCatchClause();
-			SingleVariableDeclaration varDecl= ast.newSingleVariableDeclaration();
-			varDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception")));
-			varDecl.setName(ast.newSimpleName("e"));
-			newCatchClause.setException(varDecl);
-			newTry.catchClauses().add(newCatchClause);
-			
-			rewrite.markAsReplaced(whileStatement.getBody(), newTry);
-		}
-		
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (true)\n");
-		buf.append("            try {\n");
-		buf.append("                return;\n");
-		buf.append("            } catch (Exception e) {\n");
-		buf.append("            }\n");	
-		buf.append("        while (true) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");	
-		buf.append("        while (true) {\n");
-		buf.append("            hoo(11);\n");
-		buf.append("        }\n");	
-		buf.append("        while (true)\n");
-		buf.append("            try {\n");
-		buf.append("                return;\n");
-		buf.append("            } catch (Exception e) {\n");
-		buf.append("            }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}		
-	
-	
-	public void testInsertCode() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (i == j) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-	
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-
-		{ // replace while statement with comment, insert new statement
-			WhileStatement whileStatement= (WhileStatement) statements.get(0);
-			String comment= "//hello";
-			ASTNode placeHolder= rewrite.createPlaceholder(comment, NewASTRewrite.STATEMENT);
-			
-			rewrite.markAsReplaced(whileStatement, placeHolder);
-			
-			StringBuffer buf1= new StringBuffer();
-			buf1.append("if (i == 3) {\n");
-			buf1.append("    System.beep();\n");
-			buf1.append("}");
-			
-			ASTNode placeHolder2= rewrite.createPlaceholder(buf1.toString(), NewASTRewrite.STATEMENT);
-			rewrite.markAsInserted(placeHolder2);
-			
-			statements.add(placeHolder2);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        //hello\n");
-		buf.append("        if (i == 3) {\n");
-		buf.append("            System.beep();\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-}
-
-
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTest.java
deleted file mode 100644
index 1426597..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTest.java
+++ /dev/null
@@ -1,162 +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.jdt.ui.tests.astrewrite;
-
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.text.edits.MalformedTreeException;
-import org.eclipse.text.edits.TextEdit;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.Modifier;
-import org.eclipse.jdt.core.dom.PrimitiveType;
-import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.ASTRewrite;
-import org.eclipse.jdt.internal.corext.dom.NewASTRewrite;
-
-/**
-  */
-public class ASTRewritingTest extends TestCase {
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite();
-		suite.addTest(ASTRewritingExpressionsTest.allTests());
-		suite.addTest(ASTRewritingInsertBoundTest.allTests());
-		suite.addTest(ASTRewritingMethodDeclTest.allTests());
-		suite.addTest(ASTRewritingMoveCodeTest.allTests());
-		suite.addTest(ASTRewritingStatementsTest.allTests());
-		suite.addTest(ASTRewritingTrackingTest.allTests());
-		suite.addTest(ASTRewritingTypeDeclTest.allTests());
-		suite.addTest(SourceModifierTest.allTests());
-		suite.addTest(ASTRewritingCollapseTest.allTests());
-		
-		return new ProjectTestSetup(suite);
-	}
-
-	
-	public ASTRewritingTest(String name) {
-		super(name);
-	}
-	
-	/**
-	 * Returns the result of a rewrite.
-	 */
-	protected String evaluateRewrite(ICompilationUnit cu, NewASTRewrite rewrite) throws CoreException, MalformedTreeException, BadLocationException {
-		Document document= new Document(cu.getSource());
-		TextEdit res= rewrite.rewriteAST(document);
-		
-		res.apply(document);
-		return document.get();
-	}
-	
-	private static final int printRange= 6;
-	
-	public static void assertEqualString(String expected, String actual) {	
-		int len1= Math.min(expected.length(), actual.length());
-		
-		int diffPos= -1;
-		for (int i= 0; i < len1; i++) {
-			if (expected.charAt(i) != actual.charAt(i)) {
-				diffPos= i;
-				break;
-			}
-		}
-		if (diffPos == -1 && expected.length() != actual.length()) {
-			diffPos= len1;
-		}
-		if (diffPos != -1) {
-			int diffAhead= Math.max(0, diffPos - printRange);
-			int diffAfter= Math.min(expected.length(), diffPos + printRange);
-			
-			String diffStr= expected.substring(diffAhead, diffPos) + '^' + expected.substring(diffPos, diffAfter);
-			
-			// use detailed message
-			String message= "Content not as expected: is\n" + expected + "\nDiffers at pos " + diffPos + ": " + diffStr + "\nexpected:\n" + actual;  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-			
-			assertEquals(message, expected, actual);
-		}
-	}
-	
-	public static TypeDeclaration findTypeDeclaration(CompilationUnit astRoot, String simpleTypeName) {
-		List types= astRoot.types();
-		for (int i= 0; i < types.size(); i++) {
-			TypeDeclaration elem= (TypeDeclaration) types.get(i);
-			if (simpleTypeName.equals(elem.getName().getIdentifier())) {
-				return elem;
-			}
-		}
-		return null;
-	}
-	
-	public static MethodDeclaration findMethodDeclaration(TypeDeclaration typeDecl, String methodName) {
-		MethodDeclaration[] methods= typeDecl.getMethods();
-		for (int i= 0; i < methods.length; i++) {
-			if (methodName.equals(methods[i].getName().getIdentifier())) {
-				return methods[i];
-			}
-		}
-		return null;
-	}
-	
-	public static SingleVariableDeclaration createNewParam(AST ast, String name) {
-		SingleVariableDeclaration newParam= ast.newSingleVariableDeclaration();
-		newParam.setType(ast.newPrimitiveType(PrimitiveType.FLOAT));
-		newParam.setName(ast.newSimpleName(name));
-		return newParam;
-	}
-	
-	protected FieldDeclaration createNewField(AST ast, String name) {
-		VariableDeclarationFragment frag= ast.newVariableDeclarationFragment();
-		frag.setName(ast.newSimpleName(name));
-		FieldDeclaration newFieldDecl= ast.newFieldDeclaration(frag);
-		newFieldDecl.setModifiers(Modifier.PRIVATE);
-		newFieldDecl.setType(ast.newPrimitiveType(PrimitiveType.DOUBLE));
-		return newFieldDecl;
-	}
-	
-	protected MethodDeclaration createNewMethod(AST ast, String name, boolean isAbstract) {
-		MethodDeclaration decl= ast.newMethodDeclaration();
-		decl.setName(ast.newSimpleName(name));
-		decl.setReturnType(ast.newPrimitiveType(PrimitiveType.VOID));
-		decl.setModifiers(isAbstract ? (Modifier.ABSTRACT | Modifier.PRIVATE) : Modifier.PRIVATE);
-		SingleVariableDeclaration param= ast.newSingleVariableDeclaration();
-		param.setName(ast.newSimpleName("str"));
-		param.setType(ast.newSimpleType(ast.newSimpleName("String")));
-		decl.parameters().add(param);
-		decl.setBody(isAbstract ? null : ast.newBlock());
-		return decl;
-	}
-	
-	
-	protected void clearRewrite(ASTRewrite rewrite) {
-		rewrite.removeModifications();
-	}
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTrackingTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTrackingTest.java
deleted file mode 100644
index 8c79e0f..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTrackingTest.java
+++ /dev/null
@@ -1,609 +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.jdt.ui.tests.astrewrite;
-
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.text.edits.TextEditGroup;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.Block;
-import org.eclipse.jdt.core.dom.CastExpression;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.ExpressionStatement;
-import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.PrefixExpression;
-import org.eclipse.jdt.core.dom.ReturnStatement;
-import org.eclipse.jdt.core.dom.SimpleName;
-import org.eclipse.jdt.core.dom.TryStatement;
-import org.eclipse.jdt.core.dom.Type;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-import org.eclipse.jdt.core.dom.WhileStatement;
-
-import org.eclipse.jface.text.IRegion;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodeConstants;
-import org.eclipse.jdt.internal.corext.dom.ASTRewrite;
-import org.eclipse.jdt.internal.corext.refactoring.changes.CompilationUnitChange;
-
-import org.eclipse.jdt.internal.ui.text.correction.ASTRewriteCorrectionProposal;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-public class ASTRewritingTrackingTest extends ASTRewritingTest {
-
-	private static final Class THIS= ASTRewritingTrackingTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-	
-	
-
-	public ASTRewritingTrackingTest(String name) {
-		super(name);
-	}
-	
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (false) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTRewritingTrackingTest("testNamesWithPlaceholder"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	private TextEditGroup getDescription(List all, String name) {
-		TextEditGroup desc= new TextEditGroup(name);
-		all.add(desc);
-		return desc;
-	}
-	
-	
-	public void testNamesWithDelete() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            i--;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		ArrayList gd= new ArrayList();
-		
-		TypeDeclaration typeC= findTypeDeclaration(astRoot, "C");
-		rewrite.markAsTracked(typeC.getName(), getDescription(gd, "C"));
-		
-		List decls= typeC.bodyDeclarations();
-		
-		MethodDeclaration method= (MethodDeclaration) decls.get(1);
-		rewrite.markAsTracked(method.getName(), getDescription(gd, "foo"));
-		
-		FieldDeclaration field= (FieldDeclaration) decls.get(0);
-		rewrite.markAsRemoved(field);
-						
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		proposal.getCompilationUnitChange().setKeepExecutedTextEdits(true);
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            i--;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		String expected= buf.toString();
-		assertEqualString(cu.getSource(), expected);
-		
-		CompilationUnitChange change= proposal.getCompilationUnitChange();
-
-		
-		TextEditGroup[] descriptions= (TextEditGroup[]) gd.toArray(new TextEditGroup[gd.size()]);
-		for (int i= 0; i < descriptions.length; i++) {
-			String name= descriptions[i].getName();
-			IRegion range= change.getNewTextRange(descriptions[i].getTextEdits());
-			String string= expected.substring(range.getOffset(), range.getOffset() + range.getLength());
-			assertEqualString(string, name);
-		}
-		clearRewrite(rewrite);
-	}
-	
-	public void testNamesWithInsert() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            i--;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		ArrayList gd= new ArrayList();
-		
-		TypeDeclaration typeC= findTypeDeclaration(astRoot, "C");
-		rewrite.markAsTracked(typeC.getName(), getDescription(gd, "C"));
-		
-		List decls= typeC.bodyDeclarations();
-		
-		MethodDeclaration method= (MethodDeclaration) decls.get(1);
-		rewrite.markAsTracked(method.getName(), getDescription(gd, "foo"));
-		
-		FieldDeclaration field= (FieldDeclaration) decls.get(0);
-		List fragments= field.fragments();
-		VariableDeclarationFragment frag1= (VariableDeclarationFragment) fragments.get(0);
-		rewrite.markAsTracked(frag1.getName(),  getDescription(gd, "x1"));
-		
-		VariableDeclarationFragment newFrag= ast.newVariableDeclarationFragment();
-		newFrag.setName(ast.newSimpleName("newVariable"));
-		newFrag.setExtraDimensions(2);
-		rewrite.markAsInserted(newFrag);
-		fragments.add(0, newFrag);
-						
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		proposal.getCompilationUnitChange().setKeepExecutedTextEdits(true);
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public int newVariable[][], x1;\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            i--;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		String expected= buf.toString();
-		assertEqualString(cu.getSource(), expected);
-		
-		CompilationUnitChange change= proposal.getCompilationUnitChange();
-		
-		TextEditGroup[] descriptions= (TextEditGroup[]) gd.toArray(new TextEditGroup[gd.size()]);
-		for (int i= 0; i < descriptions.length; i++) {
-			String name= descriptions[i].getName();
-			IRegion range= change.getNewTextRange(descriptions[i].getTextEdits());
-			String string= expected.substring(range.getOffset(), range.getOffset() + range.getLength());
-			assertEqualString(string, name);
-		}
-		clearRewrite(rewrite);
-	}
-	
-	public void testNamesWithReplace() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            ++i;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		ArrayList gd= new ArrayList();
-		
-		// change type name
-		TypeDeclaration typeC= findTypeDeclaration(astRoot, "C");
-		SimpleName newName= ast.newSimpleName("XX");
-		rewrite.markAsReplaced(typeC.getName(), newName);
-		rewrite.markAsTracked(newName,  getDescription(gd, "XX"));
-		
-		List decls= typeC.bodyDeclarations();
-		
-		MethodDeclaration method= (MethodDeclaration) decls.get(1);
-		rewrite.markAsTracked(method.getName(), getDescription(gd, "foo"));
-		
-		WhileStatement whileStatement= (WhileStatement) method.getBody().statements().get(0);
-		PrefixExpression prefixExpression= (PrefixExpression) ((ExpressionStatement) ((Block) whileStatement.getBody()).statements().get(0)).getExpression();
-		rewrite.markAsTracked(prefixExpression.getOperand(),  getDescription(gd, "i"));
-				
-		FieldDeclaration field= (FieldDeclaration) decls.get(0);
-		List fragments= field.fragments();
-		VariableDeclarationFragment frag1= (VariableDeclarationFragment) fragments.get(0);
-		rewrite.markAsTracked(frag1.getName(),  getDescription(gd, "x1"));
-		
-		// change modifier
-		int newModifiers= Modifier.STATIC | Modifier.TRANSIENT | Modifier.PRIVATE;
-		rewrite.markAsReplaced(field, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-								
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		proposal.getCompilationUnitChange().setKeepExecutedTextEdits(true);
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class XX {\n");
-		buf.append("\n");
-		buf.append("    private static transient int x1;\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            ++i;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		String expected= buf.toString();
-		assertEqualString(cu.getSource(), expected);
-		
-		CompilationUnitChange change= proposal.getCompilationUnitChange();
-		
-		TextEditGroup[] descriptions= (TextEditGroup[]) gd.toArray(new TextEditGroup[gd.size()]);
-		for (int i= 0; i < descriptions.length; i++) {
-			String name= descriptions[i].getName();
-			IRegion range= change.getNewTextRange(descriptions[i].getTextEdits());
-			String string= expected.substring(range.getOffset(), range.getOffset() + range.getLength());
-			assertEqualString(string, name);
-		}
-		clearRewrite(rewrite);
-	}
-	
-	public void testNamesWithMove1() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            ++i;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		ArrayList gd= new ArrayList();
-		
-		// change type name
-		TypeDeclaration typeC= findTypeDeclaration(astRoot, "C");
-		rewrite.markAsTracked(typeC.getName(), getDescription(gd, "C"));
-		
-		List decls= typeC.bodyDeclarations();
-		
-		MethodDeclaration method= (MethodDeclaration) decls.get(1);
-		rewrite.markAsTracked(method.getName(), getDescription(gd, "foo"));
-		
-		WhileStatement whileStatement= (WhileStatement) method.getBody().statements().get(0);
-		PrefixExpression prefixExpression= (PrefixExpression) ((ExpressionStatement) ((Block) whileStatement.getBody()).statements().get(0)).getExpression();
-		rewrite.markAsTracked(prefixExpression.getOperand(),  getDescription(gd, "i"));
-					
-		FieldDeclaration field= (FieldDeclaration) decls.get(0);
-		List fragments= field.fragments();
-		VariableDeclarationFragment frag1= (VariableDeclarationFragment) fragments.get(0);
-		rewrite.markAsTracked(frag1.getName(),  getDescription(gd, "x1"));
-
-		// move method before field
-		ASTNode placeHolder= rewrite.createMove(method);
-		rewrite.markAsInserted(placeHolder);
-		decls.add(0, placeHolder);				
-								
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		proposal.getCompilationUnitChange().setKeepExecutedTextEdits(true);
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            ++i;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("}\n");	
-		String expected= buf.toString();
-		assertEqualString(cu.getSource(), expected);
-		
-		CompilationUnitChange change= proposal.getCompilationUnitChange();
-		
-		TextEditGroup[] descriptions= (TextEditGroup[]) gd.toArray(new TextEditGroup[gd.size()]);
-		for (int i= 0; i < descriptions.length; i++) {
-			String name= descriptions[i].getName();
-			IRegion range= change.getNewTextRange(descriptions[i].getTextEdits());
-			String string= expected.substring(range.getOffset(), range.getOffset() + range.getLength());
-			assertEqualString(string, name);
-		}
-		clearRewrite(rewrite);
-	}
-	
-	public void testNamesWithMove2() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            ++i;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		ArrayList gd= new ArrayList();
-		
-		// change type name
-		TypeDeclaration typeC= findTypeDeclaration(astRoot, "C");
-		rewrite.markAsTracked(typeC.getName(), getDescription(gd, "C"));
-		
-		List decls= typeC.bodyDeclarations();
-		
-		MethodDeclaration method= (MethodDeclaration) decls.get(0);
-		rewrite.markAsTracked(method.getName(), getDescription(gd, "foo"));
-		
-		WhileStatement whileStatement= (WhileStatement) method.getBody().statements().get(0);
-		PrefixExpression prefixExpression= (PrefixExpression) ((ExpressionStatement) ((Block) whileStatement.getBody()).statements().get(0)).getExpression();
-		rewrite.markAsTracked(prefixExpression.getOperand(),  getDescription(gd, "i"));
-					
-
-		// move method before field
-		ASTNode placeHolder= rewrite.createMove(whileStatement);
-		
-		TryStatement tryStatement= ast.newTryStatement();
-		tryStatement.getBody().statements().add(placeHolder);
-		tryStatement.setFinally(ast.newBlock());
-		rewrite.markAsReplaced(whileStatement, tryStatement);
-								
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		proposal.getCompilationUnitChange().setKeepExecutedTextEdits(true);
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("        try {\n");
-		buf.append("            while (i == 0) {\n");
-		buf.append("                ++i;\n");
-		buf.append("            }\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		String expected= buf.toString();
-		assertEqualString(cu.getSource(), expected);
-		
-		CompilationUnitChange change= proposal.getCompilationUnitChange();
-		
-		TextEditGroup[] descriptions= (TextEditGroup[]) gd.toArray(new TextEditGroup[gd.size()]);
-		for (int i= 0; i < descriptions.length; i++) {
-			String name= descriptions[i].getName();
-			IRegion range= change.getNewTextRange(descriptions[i].getTextEdits());
-			String string= expected.substring(range.getOffset(), range.getOffset() + range.getLength());
-			assertEqualString(string, name);
-		}
-		clearRewrite(rewrite);
-	}	
-	
-	public void testNamesWithMove3() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		ArrayList gd= new ArrayList();
-		
-		// change type name
-		TypeDeclaration typeC= findTypeDeclaration(astRoot, "C");
-		rewrite.markAsTracked(typeC.getName(), getDescription(gd, "C"));
-		
-		List decls= typeC.bodyDeclarations();
-		
-		MethodDeclaration method= (MethodDeclaration) decls.get(1);
-		rewrite.markAsTracked(method.getName(), getDescription(gd, "foo"));
-		
-		// move method before field
-		ASTNode placeHolder= rewrite.createMove(method);
-		rewrite.markAsInserted(placeHolder);
-		decls.add(0, placeHolder);				
-								
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		proposal.getCompilationUnitChange().setKeepExecutedTextEdits(true);
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("\n");
-		buf.append("    public void foo(String s, int i) {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public int x1;\n");
-		buf.append("}\n");	
-		String expected= buf.toString();
-		assertEqualString(cu.getSource(), expected);
-		
-		CompilationUnitChange change= proposal.getCompilationUnitChange();
-		
-		TextEditGroup[] descriptions= (TextEditGroup[]) gd.toArray(new TextEditGroup[gd.size()]);
-		for (int i= 0; i < descriptions.length; i++) {
-			String name= descriptions[i].getName();
-			IRegion range= change.getNewTextRange(descriptions[i].getTextEdits());
-			String string= expected.substring(range.getOffset(), range.getOffset() + range.getLength());
-			assertEqualString(string, name);
-		}
-		clearRewrite(rewrite);
-	}
-	public void testNamesWithPlaceholder() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public String foo(Object s) {\n");
-		buf.append("        return s;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		AST ast= astRoot.getAST();
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		ArrayList gd= new ArrayList();
-		
-		// change type name
-		TypeDeclaration typeC= findTypeDeclaration(astRoot, "C");
-		rewrite.markAsTracked(typeC.getName(), getDescription(gd, "C"));
-		
-		List decls= typeC.bodyDeclarations();
-		
-		MethodDeclaration method= (MethodDeclaration) decls.get(0);
-		rewrite.markAsTracked(method.getName(), getDescription(gd, "foo"));
-		
-		ReturnStatement returnStatement= (ReturnStatement) method.getBody().statements().get(0);
-		
-		CastExpression castExpression= ast.newCastExpression();
-		Type type= (Type) rewrite.createPlaceholder("String", ASTRewrite.TYPE);
-		Expression expression= (Expression) rewrite.createMove(returnStatement.getExpression());
-		castExpression.setType(type);
-		castExpression.setExpression(expression);
-		
-		rewrite.markAsReplaced(returnStatement.getExpression(), castExpression);
-		
-		rewrite.markAsTracked(type, getDescription(gd, "String"));
-		rewrite.markAsTracked(expression, getDescription(gd, "s"));
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		proposal.getCompilationUnitChange().setKeepExecutedTextEdits(true);
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    public String foo(Object s) {\n");
-		buf.append("        return (String) s;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		String expected= buf.toString();
-		assertEqualString(cu.getSource(), expected);
-		
-		CompilationUnitChange change= proposal.getCompilationUnitChange();
-		
-		TextEditGroup[] descriptions= (TextEditGroup[]) gd.toArray(new TextEditGroup[gd.size()]);
-		for (int i= 0; i < descriptions.length; i++) {
-			String name= descriptions[i].getName();
-			IRegion range= change.getNewTextRange(descriptions[i].getTextEdits());
-			String string= expected.substring(range.getOffset(), range.getOffset() + range.getLength());
-			assertEqualString(string, name);
-		}
-		clearRewrite(rewrite);
-	}	
-
-	
-}
-
-
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTypeDeclTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTypeDeclTest.java
deleted file mode 100644
index 9c12b9b..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/ASTRewritingTypeDeclTest.java
+++ /dev/null
@@ -1,1069 +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.jdt.ui.tests.astrewrite;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.*;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodeConstants;
-import org.eclipse.jdt.internal.corext.dom.ASTRewrite;
-import org.eclipse.jdt.internal.corext.dom.ListRewriter;
-import org.eclipse.jdt.internal.ui.text.correction.ASTRewriteCorrectionProposal;
-
-public class ASTRewritingTypeDeclTest extends ASTRewritingTest {
-	
-	private static final Class THIS= ASTRewritingTypeDeclTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ASTRewritingTypeDeclTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ASTRewritingTypeDeclTest("testVariableDeclarationFragment"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-		
-	public void testTypeDeclChanges() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");		
-		buf.append("    private int i;\n");	
-		buf.append("    private int k;\n");	
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("class F implements Runnable {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);			
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		
-		{  // rename type, rename supertype, rename first interface, replace inner class with field
-			TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-			SimpleName name= type.getName();
-			SimpleName newName= ast.newSimpleName("X");
-			
-			rewrite.markAsReplaced(name, newName);
-			
-			Name superClass= type.getSuperclass();
-			assertTrue("Has super type", superClass != null);
-			
-			SimpleName newSuperclass= ast.newSimpleName("Object");
-			rewrite.markAsReplaced(superClass, newSuperclass);
-
-			List superInterfaces= type.superInterfaces();
-			assertTrue("Has super interfaces", !superInterfaces.isEmpty());
-			
-			SimpleName newSuperinterface= ast.newSimpleName("Cloneable");
-			rewrite.markAsReplaced((ASTNode) superInterfaces.get(0), newSuperinterface);
-			
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			FieldDeclaration newFieldDecl= createNewField(ast, "fCount");
-			
-			rewrite.markAsReplaced((ASTNode) members.get(0), newFieldDecl);
-		}
-		{ // replace method in F, change to interface
-			TypeDeclaration type= findTypeDeclaration(astRoot, "F");
-			
-			// change flags
-			int newModifiers= 0;
-			rewrite.markAsReplaced(type, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-
-			// change to interface
-			rewrite.markAsReplaced(type, ASTNodeConstants.IS_INTERFACE, Boolean.TRUE, null);
-			
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", members.size() == 1);
-
-			MethodDeclaration methodDecl= createNewMethod(ast, "newFoo", true);
-
-			rewrite.markAsReplaced((ASTNode) members.get(0), methodDecl);
-		}
-		
-		{ // change to class, add supertype
-			TypeDeclaration type= findTypeDeclaration(astRoot, "G");
-			
-			// change flags
-			int newModifiers= 0;
-			rewrite.markAsReplaced(type, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-
-			// change to class
-			rewrite.markAsReplaced(type, ASTNodeConstants.IS_INTERFACE, Boolean.FALSE, null);
-			
-			
-			SimpleName newSuperclass= ast.newSimpleName("Object");
-			rewrite.markAsInsert(type, ASTNodeConstants.SUPERCLASS, newSuperclass, null);
-		}			
-					
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X extends Object implements Cloneable, Serializable {\n");
-		buf.append("    private double fCount;\n");
-		buf.append("    private int i;\n");	
-		buf.append("    private int k;\n");
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("interface F extends Runnable {\n");
-		buf.append("    private abstract void newFoo(String str);\n");
-		buf.append("}\n");				
-		buf.append("class G extends Object {\n");
-		buf.append("}\n");			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-
-	
-	public void testTypeDeclRemoves() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");		
-		buf.append("    private int i;\n");	
-		buf.append("    private int k;\n");	
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("class F implements Runnable {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);			
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		{ // change to interface, remove supertype, remove first interface, remove field
-			TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-			
-			// change flags
-			int newModifiers= 0;
-			rewrite.markAsReplaced(type, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-
-			// change to interface
-			rewrite.markAsReplaced(type, ASTNodeConstants.IS_INTERFACE, Boolean.TRUE, null);
-		
-			Name superClass= type.getSuperclass();
-			assertTrue("Has super type", superClass != null);
-			
-			rewrite.markAsRemoved(superClass);
-
-			List superInterfaces= type.superInterfaces();
-			assertTrue("Has super interfaces", !superInterfaces.isEmpty());
-			
-			rewrite.markAsRemoved((ASTNode) superInterfaces.get(0));
-			
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-					
-			rewrite.markAsRemoved((ASTNode) members.get(1));
-			
-			MethodDeclaration meth= findMethodDeclaration(type, "hee");
-			rewrite.markAsRemoved(meth);
-		}
-		{ // remove superinterface & method, change to interface & final
-			TypeDeclaration type= findTypeDeclaration(astRoot, "F");
-					
-			// change flags
-			int newModifiers= Modifier.FINAL;
-			rewrite.markAsReplaced(type, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-
-			// change to interface
-			rewrite.markAsReplaced(type, ASTNodeConstants.IS_INTERFACE, Boolean.TRUE, null);
-			
-			List superInterfaces= type.superInterfaces();
-			assertTrue("Has super interfaces", !superInterfaces.isEmpty());
-			rewrite.markAsRemoved((ASTNode) superInterfaces.get(0));
-			
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", members.size() == 1);
-
-			rewrite.markAsRemoved((ASTNode) members.get(0));			
-		}			
-		{ // remove class G
-			TypeDeclaration type= findTypeDeclaration(astRoot, "G");
-			rewrite.markAsRemoved(type);		
-		}				
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("interface E extends Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");		
-		buf.append("    private int k;\n");	
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("final interface F {\n");
-		buf.append("}\n");				
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testTypeDeclInserts() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");		
-		buf.append("    private int i;\n");	
-		buf.append("    private int k;\n");	
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("class F implements Runnable {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		buf.append("interface G {\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);			
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		assertTrue("Errors in AST", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		AST ast= astRoot.getAST();
-		{ // add interface & set to final
-			TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-					
-			// change flags
-			int newModifiers= Modifier.PUBLIC | Modifier.FINAL;
-			rewrite.markAsReplaced(type, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-				
-			SimpleName newSuperinterface= ast.newSimpleName("Cloneable");
-			
-			rewrite.getListRewrite(type, ASTNodeConstants.SUPER_INTERFACES).insertFirst(newSuperinterface, null);
-			
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			assertTrue("Cannot find inner class", members.get(0) instanceof TypeDeclaration);
-			TypeDeclaration innerType= (TypeDeclaration) members.get(0);
-
-/*		bug 22161
-			SimpleName newSuperclass= ast.newSimpleName("Exception");
-			innerType.setSuperclass(newSuperclass);
-			rewrite.markAsInserted(newSuperclass);
-*/
-
-			FieldDeclaration newField= createNewField(ast, "fCount");
-			
-			rewrite.getListRewrite(innerType, ASTNodeConstants.BODY_DECLARATIONS).insertFirst(newField, null);
-			
-			MethodDeclaration newMethodDecl= createNewMethod(ast, "newMethod", false);
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertAt(newMethodDecl, 4, null);
-		}
-		{ // add exception, add method
-			TypeDeclaration type= findTypeDeclaration(astRoot, "F");
-			
-			SimpleName newSuperclass= ast.newSimpleName("Exception");
-			rewrite.markAsInsert(type, ASTNodeConstants.SUPERCLASS, newSuperclass, null);
-					
-			MethodDeclaration newMethodDecl= createNewMethod(ast, "newMethod", false);
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(newMethodDecl, null);
-		}			
-		{ // insert interface
-			TypeDeclaration type= findTypeDeclaration(astRoot, "G");
-						
-			SimpleName newInterface= ast.newSimpleName("Runnable");
-			rewrite.getListRewrite(type, ASTNodeConstants.SUPER_INTERFACES).insertLast(newInterface, null);
-			
-			MethodDeclaration newMethodDecl= createNewMethod(ast, "newMethod", true);
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(newMethodDecl,  null);
-		}			
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public final class E extends Exception implements Cloneable, Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        private double fCount;\n");
-		buf.append("\n");				
-		buf.append("        public void xee() {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("    private int i;\n");	
-		buf.append("    private int k;\n");	
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    private void newMethod(String str) {\n");
-		buf.append("    }\n");		
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		buf.append("class F extends Exception implements Runnable {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void newMethod(String str) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");				
-		buf.append("interface G extends Runnable {\n");
-		buf.append("\n");		
-		buf.append("    private abstract void newMethod(String str);\n");		
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testTypeDeclInsertFields1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		buf.append("class F {\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);			
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		assertTrue("Errors in AST", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		AST ast= astRoot.getAST();
-		{ 	
-			TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-			
-			VariableDeclarationFragment frag= ast.newVariableDeclarationFragment();
-			frag.setName(ast.newSimpleName("x"));
-			
-			FieldDeclaration decl= ast.newFieldDeclaration(frag);
-			decl.setType(ast.newPrimitiveType(PrimitiveType.INT));
-
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertFirst(decl, null);
-			
-		}
-		{ 	
-			TypeDeclaration type= findTypeDeclaration(astRoot, "F");
-			
-			VariableDeclarationFragment frag1= ast.newVariableDeclarationFragment();
-			frag1.setName(ast.newSimpleName("x"));
-			
-			FieldDeclaration decl1= ast.newFieldDeclaration(frag1);
-			decl1.setType(ast.newPrimitiveType(PrimitiveType.INT));
-			
-			VariableDeclarationFragment frag2= ast.newVariableDeclarationFragment();
-			frag2.setName(ast.newSimpleName("y"));
-			
-			FieldDeclaration decl2= ast.newFieldDeclaration(frag2);
-			decl2.setType(ast.newPrimitiveType(PrimitiveType.INT));			
-						
-			ListRewriter listRewrite= rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS);
-			listRewrite.insertFirst(decl1, null);
-			listRewrite.insertAfter(decl2, decl1, null);
-		}				
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    int x;\n");
-		buf.append("}\n");
-		buf.append("class F {\n");
-		buf.append("\n");
-		buf.append("    int x;\n");
-		buf.append("    int y;\n");	
-		buf.append("}\n");		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-	public void testBug22161() throws Exception {
-	//	System.out.println(getClass().getName()+"::" + getName() +" disabled (bug 22161)");
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class T extends Exception implements Runnable, Serializable {\n");
-		buf.append("    public static class EInner {\n");
-		buf.append("        public void xee() {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("T.java", buf.toString(), false, null);				
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		assertTrue("Errors in AST", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		TypeDeclaration type= findTypeDeclaration(astRoot, "T");
-		assertTrue("Outer type not found", type != null);
-		
-		List members= type.bodyDeclarations();
-		assertTrue("Cannot find inner class", members.size() == 1 &&  members.get(0) instanceof TypeDeclaration);
-
-		TypeDeclaration innerType= (TypeDeclaration) members.get(0);
-		
-		SimpleName name= innerType.getName();
-		assertTrue("Name positions not correct", name.getStartPosition() != -1 && name.getLength() > 0);
-		
-	}
-	
-	public void testAnonymousClassDeclaration() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E2 {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("        };\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            int i= 8;\n");
-		buf.append("        };\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            int i= 8;\n");
-		buf.append("        };\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E2.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E2");
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 3", statements.size() == 3);
-		{	// insert body decl in AnonymousClassDeclaration
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(0);
-			ClassInstanceCreation creation= (ClassInstanceCreation) stmt.getExpression();
-			AnonymousClassDeclaration anonym= creation.getAnonymousClassDeclaration();
-			assertTrue("no anonym class decl", anonym != null);
-			
-			List decls= anonym.bodyDeclarations();
-			assertTrue("Number of bodyDeclarations not 0", decls.size() == 0);
-			
-			MethodDeclaration newMethod= createNewMethod(ast, "newMethod", false);
-			rewrite.getListRewrite(anonym, ASTNodeConstants.BODY_DECLARATIONS).insertFirst(newMethod, null);
-		}
-		{	// remove body decl in AnonymousClassDeclaration
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(1);
-			ClassInstanceCreation creation= (ClassInstanceCreation) stmt.getExpression();
-			AnonymousClassDeclaration anonym= creation.getAnonymousClassDeclaration();
-			assertTrue("no anonym class decl", anonym != null);
-			
-			List decls= anonym.bodyDeclarations();
-			assertTrue("Number of bodyDeclarations not 1", decls.size() == 1);
-
-			rewrite.markAsRemoved((ASTNode) decls.get(0));
-		}		
-		{	// replace body decl in AnonymousClassDeclaration
-			ExpressionStatement stmt= (ExpressionStatement) statements.get(2);
-			ClassInstanceCreation creation= (ClassInstanceCreation) stmt.getExpression();
-			AnonymousClassDeclaration anonym= creation.getAnonymousClassDeclaration();
-			assertTrue("no anonym class decl", anonym != null);
-			
-			List decls= anonym.bodyDeclarations();
-			assertTrue("Number of bodyDeclarations not 1", decls.size() == 1);
-			
-			MethodDeclaration newMethod= createNewMethod(ast, "newMethod", false);
-
-			rewrite.markAsReplaced((ASTNode) decls.get(0), newMethod);
-		}	
-					
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E2 {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("\n");
-		buf.append("            private void newMethod(String str) {\n");
-		buf.append("            }\n");	
-		buf.append("        };\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("        };\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            private void newMethod(String str) {\n");
-		buf.append("            }\n");	
-		buf.append("        };\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-			
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-			
-	public void testImportDeclaration() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.net.*;\n");
-		buf.append("import java.text.*;\n");					
-		buf.append("public class Z {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("Z.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		List imports= astRoot.imports();
-		assertTrue("Number of imports not 4", imports.size() == 4);
-		
-		{ // rename import
-			ImportDeclaration imp= (ImportDeclaration) imports.get(0);
-			
-			Name name= ast.newName(new String[] { "org", "eclipse", "X" });
-			rewrite.markAsReplaced(imp.getName(), name);
-		}
-		{ // change to import on demand
-			ImportDeclaration imp= (ImportDeclaration) imports.get(1);
-			
-			Name name= ast.newName(new String[] { "java", "util" });
-			rewrite.markAsReplaced(imp.getName(), name);
-			
-			rewrite.markAsReplaced(imp, ASTNodeConstants.IS_ON_DEMAND, Boolean.TRUE, null);
-		}
-		{ // change to single import
-			ImportDeclaration imp= (ImportDeclaration) imports.get(2);
-			
-			rewrite.markAsReplaced(imp, ASTNodeConstants.IS_ON_DEMAND, Boolean.FALSE, null);
-		}
-		{ // rename import
-			ImportDeclaration imp= (ImportDeclaration) imports.get(3);
-			
-			Name name= ast.newName(new String[] { "org", "eclipse" });
-			rewrite.markAsReplaced(imp.getName(), name);
-		}		
-		
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import org.eclipse.X;\n");
-		buf.append("import java.util.*;\n");
-		buf.append("import java.net;\n");
-		buf.append("import org.eclipse.*;\n");			
-		buf.append("public class Z {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testPackageDeclaration() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class Z {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("Z.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		{ // rename package
-			PackageDeclaration packageDeclaration= astRoot.getPackage();
-			
-			Name name= ast.newName(new String[] { "org", "eclipse" });
-			
-			rewrite.markAsReplaced(packageDeclaration.getName(), name);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package org.eclipse;\n");
-		buf.append("public class Z {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testCompilationUnit() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class Z {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("Z.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		{
-			PackageDeclaration packageDeclaration= astRoot.getPackage();
-			rewrite.markAsRemoved(packageDeclaration);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("\n");	
-		buf.append("public class Z {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testCompilationUnit2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Z {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("Z.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		
-		{
-			PackageDeclaration packageDeclaration= ast.newPackageDeclaration();
-			Name name= ast.newName(new String[] { "org", "eclipse" });
-			packageDeclaration.setName(name);
-			
-			rewrite.markAsInsert(astRoot, ASTNodeConstants.PACKAGE, packageDeclaration, null);
-		}
-				
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package org.eclipse;\n");
-		buf.append("public class Z {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-	public void testSingleVariableDeclaration() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i, final int[] k, int[] x[]) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		List arguments= methodDecl.parameters();
-		{ // add modifier, change type, change name, add extra dimension
-			SingleVariableDeclaration decl= (SingleVariableDeclaration) arguments.get(0);
-					
-			int newModifiers= Modifier.FINAL;
-			rewrite.markAsReplaced(decl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-
-			rewrite.markAsReplaced(decl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(1), null);
-			
-			ArrayType newVarType= ast.newArrayType(ast.newPrimitiveType(PrimitiveType.FLOAT), 2);
-			rewrite.markAsReplaced(decl.getType(), newVarType);
-			
-			Name newName= ast.newSimpleName("count");
-			rewrite.markAsReplaced(decl.getName(), newName);
-		}
-		{ // remove modifier, change type
-			SingleVariableDeclaration decl= (SingleVariableDeclaration) arguments.get(1);
-						
-			int newModifiers= 0;
-			rewrite.markAsReplaced(decl, ASTNodeConstants.MODIFIERS, new Integer(newModifiers), null);
-			
-			Type newVarType= ast.newPrimitiveType(PrimitiveType.FLOAT);
-			rewrite.markAsReplaced(decl.getType(), newVarType);
-		}
-		{ // remove extra dim
-			SingleVariableDeclaration decl= (SingleVariableDeclaration) arguments.get(2);
-			
-			rewrite.markAsReplaced(decl, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(0), null);
-		}			
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(final float[][] count[], float k, int[] x) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}	
-	
-	public void testVariableDeclarationFragment() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int i, j, k= 0, x[][], y[]= {0, 1};\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		
-		AST ast= astRoot.getAST();
-		
-		assertTrue("Parse errors", (astRoot.getFlags() & ASTNode.MALFORMED) == 0);
-		TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-
-		MethodDeclaration methodDecl= findMethodDeclaration(type, "foo");
-		Block block= methodDecl.getBody();
-		List statements= block.statements();
-		assertTrue("Number of statements not 1", statements.size() == 1);
-		
-		VariableDeclarationStatement variableDeclStatement= (VariableDeclarationStatement) statements.get(0);
-		List fragments= variableDeclStatement.fragments();
-		assertTrue("Number of fragments not 5", fragments.size() == 5);
-		
-		{ // rename var, add dimension
-			VariableDeclarationFragment fragment= (VariableDeclarationFragment) fragments.get(0);
-			
-			ASTNode name= ast.newSimpleName("a");
-			rewrite.markAsReplaced(fragment.getName(), name);
-			
-			rewrite.markAsReplaced(fragment, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(2), null);
-		}
-		
-		{ // add initializer
-			VariableDeclarationFragment fragment= (VariableDeclarationFragment) fragments.get(1);
-			
-			assertTrue("Has initializer", fragment.getInitializer() == null);
-			
-			Expression initializer= ast.newNumberLiteral("1");
-			rewrite.markAsInsert(fragment, ASTNodeConstants.INITIALIZER, initializer, null);
-		}
-		
-		{ // remove initializer
-			VariableDeclarationFragment fragment= (VariableDeclarationFragment) fragments.get(2);
-			
-			assertTrue("Has no initializer", fragment.getInitializer() != null);
-			rewrite.markAsRemoved(fragment.getInitializer());
-		}
-		{ // add dimension, add initializer
-			VariableDeclarationFragment fragment= (VariableDeclarationFragment) fragments.get(3);			
-			
-			rewrite.markAsReplaced(fragment, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(4), null);
-
-			assertTrue("Has initializer", fragment.getInitializer() == null);
-			
-			Expression initializer= ast.newNullLiteral();
-			rewrite.markAsInsert(fragment, ASTNodeConstants.INITIALIZER, initializer, null);
-		}
-		{ // remove dimension
-			VariableDeclarationFragment fragment= (VariableDeclarationFragment) fragments.get(4);			
-			
-			rewrite.markAsReplaced(fragment, ASTNodeConstants.EXTRA_DIMENSIONS, new Integer(0), null);
-		}					
-			
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int a[][], j = 1, k, x[][][][] = null, y= {0, 1};\n");		
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testTypeDeclSpacingMethods1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("\n");		
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);			
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		
-		{  // insert method
-			TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			MethodDeclaration newMethodDecl= createNewMethod(ast, "foo", false);
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertLast(newMethodDecl, null);
-			
-		}
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("\n");		
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("\n");		
-		buf.append("    private void foo(String str) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-
-	public void testTypeDeclSpacingMethods2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("\n");			
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);			
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		
-		{  // insert method at first position
-			TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			MethodDeclaration newMethodDecl= createNewMethod(ast, "foo", false);
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertFirst(newMethodDecl, null);
-		}
-		
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private void foo(String str) {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("\n");			
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("\n");
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}
-	
-	public void testTypeDeclSpacingFields() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int x;\n");
-		buf.append("    private int y;\n");
-		buf.append("\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("\n");			
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);			
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, false);
-		ASTRewrite rewrite= new ASTRewrite(astRoot);
-		AST ast= astRoot.getAST();
-		
-		{  // insert method at first position
-			TypeDeclaration type= findTypeDeclaration(astRoot, "E");
-			List members= type.bodyDeclarations();
-			assertTrue("Has declarations", !members.isEmpty());
-			
-			FieldDeclaration newField= createNewField(ast, "fCount");
-			rewrite.getListRewrite(type, ASTNodeConstants.BODY_DECLARATIONS).insertFirst(newField, null);
-		}
-
-		ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal("", cu, rewrite, 10, null);
-		proposal.getCompilationUnitChange().setSave(true);
-		
-		proposal.apply(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private double fCount;\n");
-		buf.append("    private int x;\n");
-		buf.append("    private int y;\n");
-		buf.append("\n");
-		buf.append("    public void gee() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("\n");			
-		buf.append("    public void hee() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-		clearRewrite(rewrite);
-	}		
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/SourceModifierTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/SourceModifierTest.java
deleted file mode 100644
index aeb00c8..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/astrewrite/SourceModifierTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 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.jdt.ui.tests.astrewrite;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.ReplaceEdit;
-
-import org.eclipse.jface.text.Document;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.dom.SourceModifier;
-
-/**
- *
- */
-public class SourceModifierTest extends ASTRewritingTest {
-	
-	private static final Class THIS= SourceModifierTest.class;
-	
-	private IJavaProject fJProject1;
-
-	public SourceModifierTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new SourceModifierTest("testCollapsedTargetNodes2"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-		
-		fJProject1= ProjectTestSetup.getProject();
-	}
-	
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	
-	
-	public void testRemoveIndents() throws Exception {
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            foo();\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-
-		Document buffer= new Document(buf.toString());
-		
-		int offset= buf.toString().indexOf("while");
-		int length= buf.toString().indexOf("return;") + "return;".length() - offset;
-		
-		String content= buffer.get(offset, length);
-		SourceModifier modifier= new SourceModifier(2, "    ", 4);
-		MultiTextEdit edit= new MultiTextEdit(0, content.length());
-		ReplaceEdit[] replaces= modifier.getModifications(content);
-		for (int i= 0; i < replaces.length; i++) {
-			edit.addChild(replaces[i]);
-		}
-		
-		Document innerBuffer= new Document(content);
-		edit.apply(innerBuffer);
-		
-		buffer.replace(offset, length, innerBuffer.get());
-				
-		String preview= buffer.get();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("        foo();\n");
-		buf.append("        i++; // comment\n");
-		buf.append("        i++;\n");
-		buf.append("    }\n");
-		buf.append("    return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		String expected= buf.toString();		
-
-		assertEqualString(preview, expected);
-	}
-	
-	public void testAddIndents() throws Exception {
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("            foo();\n");
-		buf.append("            i++; // comment\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-
-		Document buffer= new Document(buf.toString());
-		
-		int offset= buf.toString().indexOf("while");
-		int length= buf.toString().indexOf("return;") + "return;".length() - offset;
-		
-		String content= buffer.get(offset, length);
-		SourceModifier modifier= new SourceModifier(2, "            ", 4);
-		MultiTextEdit edit= new MultiTextEdit(0, content.length());
-		ReplaceEdit[] replaces= modifier.getModifications(content);
-		for (int i= 0; i < replaces.length; i++) {
-			edit.addChild(replaces[i]);
-		}
-		
-		Document innerBuffer= new Document(content);
-		edit.apply(innerBuffer);
-		
-		buffer.replace(offset, length, innerBuffer.get());
-		
-		String preview= buffer.get();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (i == 0) {\n");
-		buf.append("                foo();\n");
-		buf.append("                i++; // comment\n");
-		buf.append("                i++;\n");
-		buf.append("            }\n");
-		buf.append("            return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		String expected= buf.toString();		
-
-		assertEqualString(preview, expected);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/MockPluginView.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/MockPluginView.java
deleted file mode 100644
index 1bedaa1..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/MockPluginView.java
+++ /dev/null
@@ -1,252 +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.jdt.ui.tests.browsing;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-
-import org.eclipse.jdt.core.IJavaElement;
-
-import org.eclipse.jdt.internal.ui.browsing.PackagesView;
-import org.eclipse.jdt.internal.ui.viewsupport.ProblemTableViewer;
-import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer;
-
-
-public class MockPluginView extends PackagesView {
-
-	StructuredViewer fViewer;
-	private IContentProvider fContentProvider;
-	private boolean fRefreshHappened;
-	private boolean fRemoveHappened;
-	private boolean fAddHappened;
-	
-	private List fRemovedObject;
-	private List fAddedObject;
-	private List fAddedParentObject;
-	private List fRefreshedObject;
-
-	private boolean fListState;
-	
-	public MockPluginView() {
-		super();
-		fRefreshedObject= new ArrayList();
-		fAddedObject= new ArrayList();
-		fRemovedObject= new ArrayList();
-		fAddedParentObject= new ArrayList();
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-
-		//create viewer
-		//super.createViewer(parent);
-		fViewer= createViewer(parent);
-
-		//create my contentProvider
-		fContentProvider= super.createContentProvider();
-		fContentProvider.inputChanged(fViewer, null, null);
-
-		//set content provider
-		fViewer.setContentProvider(fContentProvider);
-
-	}
-	
-	/* Override so that tests can set layout state.
-	 * 
-	 * (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.ui.browsing.PackagesView#isInListState()
-	 */
-	protected boolean isInListState(){
-		return fListState;	
-	}
-	
-	/**
-	 * Set the view is in flat or hierarchical state.
-	 * @param state
-	 */
-	void setListState(boolean state){
-		fListState= state;	
-	}
-	
-	public void clear() {
-		fAddedObject.clear();
-		fRefreshedObject.clear();
-		fAddedParentObject.clear();
-		fRemovedObject.clear();
-	}
-
-	
-	protected StructuredViewer createViewer(Composite parent){
-		if(isInListState())
-			return new TestProblemTableViewer(parent, SWT.MULTI);
-		else
-			return new TestProblemTreeViewer(parent, SWT.MULTI);
-	}
-
-	public void dispose() {
-		if (fViewer != null) {
-			IContentProvider p = fViewer.getContentProvider();
-			if(p!=null)	
-				p.dispose();
-		}
-		
-		super.dispose();
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-	}
-	
-	public StructuredViewer getTreeViewer(){
-		return fViewer;
-	}
-	
-	/*
-	 * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#findElementToSelect(org.eclipse.jdt.core.IJavaElement)
-	 */
-	protected IJavaElement findElementToSelect(IJavaElement je) {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return null;
-	}
-
-	/*
-	 * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#isValidInput(java.lang.Object)
-	 */
-	protected boolean isValidInput(Object element) {
-		return false;
-	}
-	
-	
-	/**
-	 * Returns a list of objects refreshed in the viewer.
-	 * @return List
-	 */
-	public List getRefreshedObject() {
-		return fRefreshedObject;
-	}
-
-	/**
-	 * Returns true if a refresh action happened
-	 * @return boolean
-	 */
-	public boolean hasRefreshHappened() {
-		return fRefreshHappened;
-	}
-
-	/**
-	 * Returns a list of the parents of added objects
-	 * @return List
-	 */
-	public List getAddedParentObject() {
-		return fAddedParentObject;
-	}
-
-	/**
-	 * Returns a list of objects removed from the viewer
-	 * @return List
-	 */
-	public List getRemovedObject() {
-		return fRemovedObject;
-	}
-
-	/**
-	 * Returns true if a remove action happened
-     * @return boolean
-	 */
-	public boolean hasRemoveHappened() {
-		return fRemoveHappened;
-	}
-	
-	/**
-	 * Returns the object added to the viewer
-	 * @return List
-	 */
-	public List getAddedObject() {
-		return fAddedObject;
-	}
-	
-	/**
-	 * Returns true if an add action happened on the viewer
-	 * @return boolean
-	 */
-	public boolean hasAddHappened() {
-		return fAddHappened;
-	}
-
-
-	private class TestProblemTreeViewer extends ProblemTreeViewer {
-
-		public TestProblemTreeViewer(Composite parent, int flag) {
-			super(parent, flag);
-			super.setUseHashlookup(true);
-		}
-
-		public void refresh(Object object) {
-			fRefreshHappened= true;
-			fRefreshedObject.add(object);
-		}
-
-		public void remove(Object object) {
-			fRemoveHappened= true;
-			fRemovedObject.add(object);
-		}
-
-		public void add(Object parentObject, Object object) {
-			fAddHappened= true;
-			fAddedObject.add(object);
-			fAddedParentObject.add(parentObject);
-		}
-
-	}
-	
-	private class TestProblemTableViewer extends ProblemTableViewer {
-
-		public TestProblemTableViewer(Composite parent, int flag) {
-			super(parent, flag);
-			super.setUseHashlookup(true);
-		}
-
-		public void refresh(Object object) {
-			fRefreshHappened= true;
-			fRefreshedObject.add(object);
-			super.refresh(object);
-		}
-
-		public void remove(Object object) {
-			fRemoveHappened= true;
-			fRemovedObject.add(object);
-			super.remove(object);
-		}
-
-		public void add(Object object) {
-			fAddHappened= true;
-			fAddedObject.add(object);
-			super.add(object);
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewContentProviderTests.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewContentProviderTests.java
deleted file mode 100644
index eb5e2c2..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewContentProviderTests.java
+++ /dev/null
@@ -1,565 +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.jdt.ui.tests.browsing;
-
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.internal.ui.browsing.LogicalPackage;
-
-
-public class PackagesViewContentProviderTests extends TestCase {
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite("org.eclipse.jdt.ui.tests.PackagesViewContentProviderTests"); //$NON-NLS-1$
-		//$JUnit-BEGIN$
-		suite.addTestSuite(PackagesViewContentProviderTests.class);
-		//$JUnit-END$
-		return suite;
-	}
-
-	private IJavaProject fJProject1;
-	private IJavaProject fJProject2;
-	
-	private IPackageFragmentRoot fRoot1;
-	private IWorkspace fWorkspace;
-	private IWorkbench fWorkbench;
-	private MockPluginView fMyPart;
-	
-	private ITreeContentProvider fProvider;
-	private IPackageFragmentRoot fArchiveFragmentRoot;
-	private IPackageFragment fPackJunit;
-	private IPackageFragment fPackJunitSamples;
-	private IPackageFragment fPackJunitSamplesMoney;
-
-	private ICompilationUnit fCUIMoney;
-	private ICompilationUnit fCUMoney;
-	private ICompilationUnit fCUMoneyBag;
-	private ICompilationUnit fCUMoneyTest;
-	
-	private IWorkbenchPage page;
-	private IPackageFragmentRoot fRoot2;
-	private IPackageFragment fPack12;
-	private IPackageFragment fPack32;
-	private IPackageFragment fPack42;
-	private IPackageFragment fPack52;
-	private IPackageFragment fPack62;
-	private ICompilationUnit fCU12;
-	private ICompilationUnit fCU22;
-	private IPackageFragment fPack21;
-	private ICompilationUnit fCU11;
-	private ICompilationUnit fCU21;
-	private IPackageFragment fPack61;
-	private IPackageFragment fPack51;
-	private IPackageFragment fPack41;
-	private IPackageFragment fPack31;
-	private IPackageFragment fPackDefault1;
-	private IPackageFragment fPackDefault2;
-	private IPackageFragment fPack17;
-	private IPackageFragment fPack81;
-	private IPackageFragment fPack91;
-	private IPackageFragmentRoot fInternalJarRoot;
-	private IPackageFragment fInternalPackDefault;
-	private IPackageFragment fInternalPack3;
-	private IPackageFragment fInternalPack4;
-	private IPackageFragment fInternalPack5;
-	private IPackageFragment fInternalPack10;
-	private IPackageFragment fInternalPack6;
-	private IPackageFragment fInternalPackMetaInf;
-	private boolean fEnableAutoBuildAfterTesting;
-	
-	public PackagesViewContentProviderTests(String name) {
-		super(name);
-	}
-	
-	//---------Test for getChildren-------------------
-
-	public void testGetChildrenProjectWithSourceFolders() throws Exception{
-		
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp= new LogicalPackage(fPack31);
-		cp.add(fPack32);
-		cp.add(fInternalPack3);	
-	
-		//create a logical package for default package
-		LogicalPackage defaultCp= new LogicalPackage(fPackDefault1);
-		defaultCp.add(fPackDefault2);
-		defaultCp.add(fInternalPackDefault);
-		
-		Object[] expectedChildren= new Object[]{fPack21, fPack12, cp, defaultCp, fInternalPackMetaInf};
-		Object[] children= fProvider.getChildren(fJProject2);
-		assertTrue("Wrong children found for project", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	
-	public void testGetChildrentMidLevelFragmentNotLogicalPackage() throws Exception{
-		//initialise map
-		fProvider.getChildren(fJProject2);
-		
-		Object[] expectedChildren= new Object[]{fPack17};
-		Object[] children= fProvider.getChildren(fPack12);
-		assertTrue("Wrong children found for PackageFragment",compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{};
-		Object[] children= fProvider.getChildren(fPack21);
-		assertTrue("Wrong children found for PackageFragment",compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenLogicalPackage() throws Exception{
-		
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp= new LogicalPackage(fPack31);
-		cp.add(fPack32);
-		cp.add(fInternalPack3);
-		
-		//create a logical package for packages with name "pack3.pack4"
-		LogicalPackage ChildCp1= new LogicalPackage(fPack41);
-		ChildCp1.add(fPack42);
-		ChildCp1.add(fInternalPack4);
-		
-		//create a logical package for packages with name "pack3.pack5"
-		LogicalPackage ChildCp2= new LogicalPackage(fPack51);
-		ChildCp2.add(fPack52);
-		ChildCp2.add(fInternalPack5);
-
-		//initialize Map
-		fProvider.getChildren(fJProject2);	
-		
-		Object[] expectedChildren= new Object[]{fPack81, ChildCp1, ChildCp2};
-		Object[] children= fProvider.getChildren(cp);
-		assertTrue("Wrong children found for project", compareArrays(children, expectedChildren)); //$NON-NLS-1$  
-
-	}
-	
-	public void testGetChildrenLogicalPackage2() throws Exception{
-		
-		//create a logical package for packages with name "pack3.pack4"
-		LogicalPackage cp= new LogicalPackage(fPack41);
-		cp.add(fPack42);
-		cp.add(fInternalPack4);
-		
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);		
-		
-		fProvider.getChildren(fJProject2);
-		fProvider.getChildren(cp3);
-	
-		Object[] expectedChildren= new Object[]{fPack91, fInternalPack10};
-		Object[] children= fProvider.getChildren(cp);
-		assertTrue("Wrong children found for project", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	
-
-	public void testGetChildrenMidLevelFragmentInArchive() throws Exception{
-		//initialise map
-		fProvider.getChildren(fArchiveFragmentRoot);
-		fProvider.getChildren(fPackJunit);
-		
-		Object[] expectedChildren= new Object[]{fPackJunitSamplesMoney};
-		Object[] children= fProvider.getChildren(fPackJunitSamples);
-		assertTrue("wrong children found for a NON bottom PackageFragment in PackageFragmentRoot Archive", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-
-	public void testGetChildrenBottomLevelFragmentInArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{};
-		Object[] children= fProvider.getChildren(fPackJunitSamplesMoney);
-		assertTrue("wrong children found for a bottom PackageFragment in PackageFragmentRoot Archive", compareArrays(children, expectedChildren));	//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenSourceFolder() throws Exception {
-		Object[] expectedChildren = new Object[] {fPack21, fPack31, fPackDefault1};
-		Object[] children = fProvider.getChildren(fRoot1);
-		assertTrue("Wrong children found for PackageFragmentRoot", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenArchive(){
-		Object[] expectedChildren= new Object[]{fPackJunit, fArchiveFragmentRoot.getPackageFragment("")};//$NON-NLS-1$
-		Object[] children= fProvider.getChildren(fArchiveFragmentRoot);
-		assertTrue("Wrong child found for PackageFragmentRoot Archive", compareArrays(children,expectedChildren));//$NON-NLS-1$
-	}
-	
-	//---------------Get Parent Tests-----------------------------
-	
-	public void testGetParentArchive() throws Exception{
-		Object parent= fProvider.getParent(fArchiveFragmentRoot);
-		assertTrue("Wrong parent found for PackageFragmentRoot Archive", parent==null);//$NON-NLS-1$
-	}
-
-	public void testGetParentMidLevelFragmentInArchive() throws Exception{
-		
-		//initialise Map
-		fProvider.getChildren(fArchiveFragmentRoot);
-		fProvider.getChildren(fPackJunit);
-		fProvider.getChildren(fPackJunitSamples);
-		
-		Object expectedParent= fPackJunitSamples;
-		Object parent= fProvider.getParent(fPackJunitSamplesMoney);
-		assertTrue("Wrong parent found for a NON top level PackageFragment in an Archive", expectedParent.equals(parent));//$NON-NLS-1$
-	}	
-	
-	public void testGetParentTopLevelFragmentInArchive() throws Exception{
-		Object expectedParent= fPackJunit;
-		Object parent= fProvider.getParent(fPackJunitSamples);
-		assertTrue("Wrong parent found for a top level PackageFragment in an Archive", expectedParent.equals(parent));	//$NON-NLS-1$
-	}
-
-	public void testGetParentTopLevelLogicalPackage() throws Exception{
-	
-		LogicalPackage cp= new LogicalPackage(fPack31);
-		cp.add(fPack32);
-		cp.add(fInternalPack3);
-		
-		Object parent= fProvider.getParent(cp);
-		assertTrue("Wrong parent found for a top level LogicalPackage", fJProject2.equals(parent));//$NON-NLS-1$
-	}
-	
-	public void testGetParentPackageFragmentWithLogicalPackageParent() throws Exception{
-		
-		LogicalPackage cp= new LogicalPackage(fPack31);
-		cp.add(fPack32);
-		cp.add(fInternalPack3);
-		
-		//initialize map
-		fProvider.getChildren(fJProject2);
-		
-		Object parent= fProvider.getParent(fPack81);
-		assertTrue("Wrong parent found for a top level LogicalPackage", cp.equals(parent));//$NON-NLS-1$
-	}
-	
-	public void testGetParentOfLogicalPackagetWithLogicalPackageParent() throws Exception{
-		
-		LogicalPackage cp= new LogicalPackage(fPack41);
-		cp.add(fPack42);
-		cp.add(fInternalPack4);
-		
-		LogicalPackage parentCp= new LogicalPackage(fPack31);
-		parentCp.add(fPack32);
-		parentCp.add(fInternalPack3);
-		
-		//initialize map
-		fProvider.getChildren(fJProject2);
-		
-		Object parent= fProvider.getParent(cp);
-		assertTrue("Wrong parent found for a top level LogicalPackage", parentCp.equals(parent));//$NON-NLS-1$
-	}
-	
-//	public void testGetParentWithPFRootFocus(){
-//		//set up map
-//		Object[] children= fProvider.getChildren(fRoot1);
-//		for (int i= 0; i < children.length; i++) {
-//			Object object= children[i];
-//			fProvider.getChildren(object);
-//		}
-//		
-//		Object parent= fProvider.getParent(fPack41);	
-//		Object expectedParent= fPack31;
-//		assertTrue("Wrong parent found for a mid level Fragment with Root Focus", expectedParent.equals(parent));		//$NON-NLS-1$
-//	}
-	
-	public void testGetParentPFwithProjectFocus(){
-		Object[] children= fProvider.getChildren(fJProject2);
-		for (int i= 0; i < children.length; i++) {
-			Object object= children[i];
-			fProvider.getChildren(object);
-		}
-		
-		LogicalPackage cp= new LogicalPackage(fPack31);
-		cp.add(fPack32);
-		cp.add(fInternalPack3);	
-		
-		Object parent= fProvider.getParent(fPack41);	
-		assertTrue("Wrong parent found for a mid level Fragment with Root Focus", cp.equals(parent));		//$NON-NLS-1$
-	}
-	
-	public void testGetParentWithRootFocusAfterProjectFocus(){
-		//set up map with project focus
-		Object[] children= fProvider.getChildren(fJProject2);
-		for (int i= 0; i < children.length; i++) {
-			Object object= children[i];
-			fProvider.getChildren(object);
-		}
-		
-		LogicalPackage cp= new LogicalPackage(fPack31);
-		cp.add(fPack32);
-		cp.add(fInternalPack3);	
-	
-		//create a logical package for default package
-		LogicalPackage defaultCp= new LogicalPackage(fPackDefault1);
-		defaultCp.add(fPackDefault2);
-		defaultCp.add(fInternalPackDefault);
-		
-		Object[] expectedChildren= new Object[]{fPack21, fPack12, cp, defaultCp, fInternalPackMetaInf};
-		
-		assertTrue("expected children of project with focus", compareArrays(children, expectedChildren));//$NON-NLS-1$
-		
-		//set up map with root focus
-		children= fProvider.getChildren(fRoot1);
-		for (int i= 0; i < children.length; i++) {
-			Object object= children[i];
-			fProvider.getChildren(object);
-		}
-		
-//		Object parent= fProvider.getParent(fPack41);
-//		Object expectedParent= fPack31;	
-//		assertTrue("Wrong parent found for a mid level Fragment with Project Focus", expectedParent.equals(parent));//$NON-NLS-1$
-	}
-
-	public void testGetParentTopLevelFragment() throws Exception{
-		Object parent= fProvider.getParent(fPack21);
-		Object expectedParent= fRoot1;
-		assertTrue("Wrong parent found for a top level PackageFragment", expectedParent.equals(parent)); //$NON-NLS-1$  
-
-	}
-	
-	public void testGetParentMidLevelFragment() throws Exception{
-		Object expectedParent= fPack12;
-		Object parent= fProvider.getParent(fPack17);
-		assertTrue("Wrong parent found for a NON top level PackageFragment", expectedParent.equals(parent)); //$NON-NLS-1$  
-
-	}
-	
-
-	/*
-	 * @see TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		fWorkspace= ResourcesPlugin.getWorkspace();
-		assertNotNull(fWorkspace);	
-		
-		IWorkspaceDescription workspaceDesc= fWorkspace.getDescription();
-		fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding();
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(false);
-		
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		fJProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		
-		assertNotNull("project1 null", fJProject1);//$NON-NLS-1$
-		assertNotNull("project2 null", fJProject2);//$NON-NLS-1$
-		
-		
-		//------------set up project #1 : External Jar and zip file-------
-		
-		IPackageFragmentRoot jdk= JavaProjectHelper.addVariableRTJar(fJProject1, "JRE_LIB_TEST", null, null);//$NON-NLS-1$
-		assertTrue("jdk not found", jdk != null);//$NON-NLS-1$
-
-		
-		//---Create zip file-------------------
-
-		java.io.File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);		
-		
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());//$NON-NLS-1$
-
-		fArchiveFragmentRoot= JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);//$NON-NLS-1$
-		
-		fPackJunit= fArchiveFragmentRoot.getPackageFragment("junit");//$NON-NLS-1$
-		fPackJunitSamples= fArchiveFragmentRoot.getPackageFragment("junit.samples");//$NON-NLS-1$
-		fPackJunitSamplesMoney= fArchiveFragmentRoot.getPackageFragment("junit.samples.money");//$NON-NLS-1$
-		
-		assertNotNull("creating fPackJunit", fPackJunit);//$NON-NLS-1$
-		assertNotNull("creating fPackJunitSamples", fPackJunitSamples);//$NON-NLS-1$
-		assertNotNull("creating fPackJunitSamplesMoney",fPackJunitSamplesMoney);//$NON-NLS-1$
-		
-		fCUIMoney= fPackJunitSamplesMoney.getCompilationUnit("IMoney.java");//$NON-NLS-1$
-		fCUMoney= fPackJunitSamplesMoney.getCompilationUnit("Money.java");//$NON-NLS-1$
-		fCUMoneyBag= fPackJunitSamplesMoney.getCompilationUnit("MoneyBag.java");//$NON-NLS-1$
-		fCUMoneyTest= fPackJunitSamplesMoney.getCompilationUnit("MoneyTest.java");//$NON-NLS-1$
-		
-		//java.io.File mylibJar= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.MYLIB);
-		//assertTrue("lib not found", mylibJar != null && mylibJar.exists());//$NON-NLS-1$
-		//JavaProjectHelper.addLibraryWithImport(fJProject1, new Path(mylibJar.getPath()), null, null);
-
-		//----------------Set up internal jar----------------------------
-		File myInternalJar= JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/compoundtest.jar"));//$NON-NLS-1$
-		assertTrue("lib not found", myInternalJar != null && myInternalJar.exists());//$NON-NLS-1$
-		
-		fInternalJarRoot= JavaProjectHelper.addLibraryWithImport(fJProject2, new Path(myInternalJar.getPath()), null, null); //$NON-NLS-1$
-		
-		fInternalPackDefault= fInternalJarRoot.getPackageFragment("");//$NON-NLS-1$
-		fInternalPack3= fInternalJarRoot.getPackageFragment("pack3");//$NON-NLS-1$
-		fInternalPack4= fInternalJarRoot.getPackageFragment("pack3.pack4");//$NON-NLS-1$
-		fInternalPack5= fInternalJarRoot.getPackageFragment("pack3.pack5");//$NON-NLS-1$
-		fInternalPack6= fInternalJarRoot.getPackageFragment("pack3.pack5.pack6");//$NON-NLS-1$
-		fInternalPack10= fInternalJarRoot.getPackageFragment("pack3.pack4.pack10");//$NON-NLS-1$
-		fInternalPackMetaInf= fInternalJarRoot.getPackageFragment("META-INF");//$NON-NLS-1$
-		
-		//-----------------Set up source folder--------------------------
-
-		fRoot2= JavaProjectHelper.addSourceContainer(fJProject2, "src2");//$NON-NLS-1$
-		fPackDefault2= fRoot2.createPackageFragment("",true,null);//$NON-NLS-1$
-		fPack12= fRoot2.createPackageFragment("pack1", true, null);//$NON-NLS-1$
-		fPack17= fRoot2.createPackageFragment("pack1.pack7",true,null);//$NON-NLS-1$
-		fPack32= fRoot2.createPackageFragment("pack3",true,null);//$NON-NLS-1$
-		fPack42= fRoot2.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$
-		fPack52= fRoot2.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$
-		fPack62= fRoot2.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$
-		
-		fCU12= fPack12.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU22= fPack62.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$
-
-
-		//set up project #2: file system structure with in a source folder
-
-	//	JavaProjectHelper.addVariableEntry(fJProject2, new Path("JRE_LIB_TEST"), null, null);
-
-		//----------------Set up source folder--------------------------
-
-		fRoot1= JavaProjectHelper.addSourceContainer(fJProject2, "src1"); //$NON-NLS-1$  
-		fPackDefault1= fRoot1.createPackageFragment("",true,null); //$NON-NLS-1$  
-		fPack21= fRoot1.createPackageFragment("pack2", true, null);//$NON-NLS-1$
-		fPack31= fRoot1.createPackageFragment("pack3",true,null);//$NON-NLS-1$
-		fPack41= fRoot1.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$
-		fPack91= fRoot1.createPackageFragment("pack3.pack4.pack9",true,null);//$NON-NLS-1$
-		fPack51= fRoot1.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$
-		fPack61= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$
-		fPack81= fRoot1.createPackageFragment("pack3.pack8", true, null);//$NON-NLS-1$
-		
-		fCU11= fPack21.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU21= fPack61.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		
-		//set up the mock view
-		setUpMockView();
-	}
-	
-	public void setUpMockView() throws Exception{
-		
-		fWorkbench= PlatformUI.getWorkbench();
-		assertNotNull(fWorkbench);
-		
-		page= fWorkbench.getActiveWorkbenchWindow().getActivePage();
-		assertNotNull(page);
-		
-		//just testing to make sure my part can be created
-		IViewPart myPart= new MockPluginView();
-		((MockPluginView)myPart).setListState(false);
-		assertNotNull(myPart);
-		
-		myPart= page.showView("org.eclipse.jdt.ui.tests.browsing.MockPluginView");//$NON-NLS-1$
-		if (myPart instanceof MockPluginView) {
-			fMyPart= (MockPluginView) myPart;
-			fProvider= (ITreeContentProvider)fMyPart.getTreeViewer().getContentProvider();
-			//create map and set listener	
-			fProvider.inputChanged(null,null,fJProject2);
-		}else assertTrue("Unable to get view",false);//$NON-NLS-1$
-	
-		assertNotNull(fProvider);		
-	}
-
-	/*
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		
-		JavaProjectHelper.delete(fJProject1);
-		JavaProjectHelper.delete(fJProject2);
-		fProvider.inputChanged(null, null, null);
-		page.hideView(fMyPart);
-		fMyPart.dispose();
-		
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);
-
-		
-		super.tearDown();
-	}
-	
-	private boolean compareArrays(Object[] children, Object[] expectedChildren) {
-		if(children.length!=expectedChildren.length)
-			return false;
-		for (int i= 0; i < children.length; i++) {
-			Object child= children[i];
-			if (child instanceof IJavaElement) {
-				IJavaElement el= (IJavaElement) child;
-				if(!contains(el, expectedChildren))
-					return false;
-			} else if(child instanceof IResource){
-				IResource res = (IResource) child;	
-				if(!contains(res, expectedChildren)){
-					return false;	
-				}
-			} else if (child instanceof LogicalPackage){
-				if(!contains((LogicalPackage)child, expectedChildren))
-					return false;	
-			}
-		}
-		return true;
-	}
-	
-	private boolean contains(IResource res, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IResource) {
-				IResource expres= (IResource) object;
-				if(expres.equals(res))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean contains(IJavaElement fragment, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IJavaElement) {
-				IJavaElement expfrag= (IJavaElement) object;
-				if(expfrag.equals(fragment))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean contains(LogicalPackage lp, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof LogicalPackage) {
-				LogicalPackage explp= (LogicalPackage) object;
-				if (explp.equals(lp))
-					return true;
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewContentProviderTests2.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewContentProviderTests2.java
deleted file mode 100644
index c539fad..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewContentProviderTests2.java
+++ /dev/null
@@ -1,549 +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.jdt.ui.tests.browsing;
-
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.internal.ui.browsing.LogicalPackage;
-
-
-public class PackagesViewContentProviderTests2 extends TestCase {
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite("org.eclipse.jdt.ui.tests.PackagesViewContentProviderTests2"); //$NON-NLS-1$
-		//$JUnit-BEGIN$
-		suite.addTestSuite(PackagesViewContentProviderTests2.class);
-		//$JUnit-END$
-		return suite;
-	}
-
-	private IJavaProject fJProject1;
-	private IJavaProject fJProject2;
-	
-	private IPackageFragmentRoot fRoot1;
-	private IWorkspace fWorkspace;
-	private IWorkbench fWorkbench;
-	private MockPluginView fMyPart;
-	
-	private IStructuredContentProvider fProvider;
-	private IPackageFragmentRoot fArchiveFragmentRoot;
-	private IPackageFragment fPackJunit;
-	private IPackageFragment fPackJunitSamples;
-	private IPackageFragment fPackJunitSamplesMoney;
-
-	private ICompilationUnit fCUIMoney;
-	private ICompilationUnit fCUMoney;
-	private ICompilationUnit fCUMoneyBag;
-	private ICompilationUnit fCUMoneyTest;
-	
-	
-	private IWorkbenchPage fPage;
-	private IPackageFragmentRoot fRoot2;
-	private IPackageFragment fPack12;
-	private IPackageFragment fPack32;
-	private IPackageFragment fPack42;
-	private IPackageFragment fPack52;
-	private IPackageFragment fPack62;
-	private ICompilationUnit fCU12;
-	private ICompilationUnit fCU22;
-	private IPackageFragment fPack21;
-	private ICompilationUnit fCU11;
-	private ICompilationUnit fCU21;
-	private IPackageFragment fPack61;
-	private IPackageFragment fPack51;
-	private IPackageFragment fPack41;
-	private IPackageFragment fPack31;
-	private IPackageFragment fPackDefault1;
-	private IPackageFragment fPackDefault2;
-	private IPackageFragment fPack17;
-	private IPackageFragment fPack81;
-	private IPackageFragment fPack91;
-	private IPackageFragmentRoot fInternalJarRoot;
-	private IPackageFragment fInternalPackDefault;
-	private IPackageFragment fInternalPack3;
-	private IPackageFragment fInternalPack4;
-	private IPackageFragment fInternalPack5;
-	private IPackageFragment fInternalPack10;
-	private IPackageFragment fInternalPack6;
-	private IPackageFragment fInternalPackMetaInf;
-	private boolean fEnableAutoBuildAfterTesting;
-	private IPackageFragment fPack102;
-	
-	public PackagesViewContentProviderTests2(String name) {
-		super(name);
-	}
-	
-	//----------- getElement in flat view ------------------------------
-
-	public void testGetElementsPackageFragmentRoot() throws Exception {
-		Object[] children= fProvider.getElements(fRoot1);
-		Object[] expectedChildren= new Object[] { fPack21, fPack31, fPack41, fPack51, fPack61, fPack81, fPack91, fPackDefault1 };
-		assertTrue("Wrong children found for PackageFragment", compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-
-	public void testGetElementsProject() throws Exception {
-
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		LogicalPackage defaultCp= new LogicalPackage(fPackDefault1);
-		defaultCp.add(fPackDefault2);
-		defaultCp.add(fInternalPackDefault);
-
-		LogicalPackage cp4= new LogicalPackage(fPack41);
-		cp4.add(fPack42);
-		cp4.add(fInternalPack4);
-
-		LogicalPackage cp5= new LogicalPackage(fPack51);
-		cp5.add(fPack52);
-		cp5.add(fInternalPack5);
-
-		LogicalPackage cp6= new LogicalPackage(fPack61);
-		cp6.add(fPack62);
-		cp6.add(fInternalPack6);
-		
-		LogicalPackage cp10= new LogicalPackage(fPack102);
-		cp10.add(fInternalPack10);
-
-		Object[] children= fProvider.getElements(fJProject2);
-		Object[] expectedChildren= new Object[] { defaultCp, cp3, cp4, cp5, cp6, cp10, fInternalPackMetaInf, fPack21, fPack12, fPack91, fPack81, fPack17 };
-		assertTrue("Wrong children founf for PackageFragment", compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-
-	//---------------Delta Tests-----------------------------
-	public void testRemovePackageNotLogicalPackage() throws Exception {
-		//initialise Map
-		fProvider.getElements(fJProject2);
-
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.REMOVED, fPack12);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-
-		assertTrue("Remove happened", fMyPart.hasRemoveHappened()); //$NON-NLS-1$
-		assertTrue("Correct package removed", fMyPart.getRemovedObject().contains(fPack12)); //$NON-NLS-1$
-	}
-	
-	public void testRemovePackageInTwoPackageLogicalPackage() throws Exception {
-
-		//initialise map
-		fProvider.getElements(fJProject2);
-
-		//create CompoundElement containning
-		LogicalPackage cp10= new LogicalPackage(fInternalPack10);
-
-		fMyPart.clear();
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.REMOVED, fPack102);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		//assert remove happened (delta worked)
-		assertTrue("Refresh happened", fMyPart.hasRemoveHappened() && fMyPart.hasAddHappened()); //$NON-NLS-1$
-		Object addedObject= fMyPart.getAddedObject().get(0);
-		Object removedObject= fMyPart.getRemovedObject().get(0);
-		assertTrue("Correct guy removed", canFindEqualCompoundElement(cp10, new Object[] { removedObject })); //$NON-NLS-1$
-		assertTrue("Correct guy added", fInternalPack10.equals(addedObject)); //$NON-NLS-1$
-	}
-	
-	public void testRemovePackageFromLogicalPackage() throws Exception {
-
-		//initialise map
-		fProvider.getElements(fJProject2);
-
-		fMyPart.clear();
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.REMOVED, fPack62);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		//assert remove happened (delta worked)
-		assertTrue("Refresh did not happened", !fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-	}
-	
-	public void testRemoveCUFromPackageNotLogicalPackage() throws Exception {
-
-		//initialise Map
-		ICompilationUnit cu= fPack81.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-
-		//make sure parent is visible
-		fMyPart.fViewer.setInput(fJProject2);
-	
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[] { cu }, fPack81, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-		assertTrue("Correct package refreshed", fMyPart.getRefreshedObject().contains(fPack81)); //$NON-NLS-1$
-		assertEquals("Correct number of refreshes", 1, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-	
-	public void testAddCUFromPackageNotLogicalPackage() throws Exception {
-
-		ICompilationUnit cu= fPack81.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject2);
-
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[] { cu }, fPack81, IJavaElementDelta.ADDED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-		assertTrue("Correct package refreshed", fMyPart.getRefreshedObject().contains(fPack81)); //$NON-NLS-1$
-		assertEquals("Correct number of refreshes", 1, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-
-	public void testAddFragmentToLogicalPackage() throws Exception {
-	
-		//create package fragment to be added
-		IPackageFragment pack101= fRoot1.createPackageFragment("pack3.pack4.pack10", true, null);//$NON-NLS-1$
-	
-		//initialise map
-		fProvider.getElements(fJProject2);
-		
-		fMyPart.clear();
-	
-		//send delta
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.ADDED, pack101);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		//make sure no refresh happened
-		assertTrue("Refresh did not happened", !fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-	}
-
-	public void testAddPackageNotLogicalPackage() throws Exception {
-
-		//initialise Map
-		fProvider.getElements(fJProject2);
-
-		fMyPart.clear();
-
-		IPackageFragment test= fRoot1.createPackageFragment("pack3.test", true, null); //$NON-NLS-1$
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.ADDED, test);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Add happened", fMyPart.hasAddHappened()); //$NON-NLS-1$
-		assertTrue("Correct package added", fMyPart.getAddedObject().contains(test)); //$NON-NLS-1$
-	}
-
-	public void testAddPackageToCreateLogicalPackage() throws Exception {
-		//initialise map
-		fProvider.getElements(fJProject2);
-		
-		//create new package
-    	IPackageFragment pack11= fRoot1.createPackageFragment("pack1", true, null);//$NON-NLS-1$
-
-		//create a logical package for testing
-		LogicalPackage lp1= new LogicalPackage(fPack12);
-		lp1.add(pack11);
-
-		fMyPart.clear();
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.ADDED, pack11);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		//assert remove and add happened (delta worked)
-		assertTrue("Remove and add happened", fMyPart.hasRemoveHappened() && fMyPart.hasAddHappened()); //$NON-NLS-1$
-		Object addedObject= fMyPart.getAddedObject().get(0);
-		Object removedObject= fMyPart.getRemovedObject().get(0);
-		assertTrue("Correct guy removed", fPack12.equals(removedObject)); //$NON-NLS-1$
-		assertTrue("Correct guy added", lp1.equals(addedObject) ); //$NON-NLS-1$
-	}
-	
-
-
-	/*
-	 * @see TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		fWorkspace= ResourcesPlugin.getWorkspace();
-		assertNotNull(fWorkspace);	
-		
-		IWorkspaceDescription workspaceDesc= fWorkspace.getDescription();
-		fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding();
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(false);
-		
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		fJProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		
-		assertNotNull("project1 null", fJProject1);//$NON-NLS-1$
-		assertNotNull("project2 null", fJProject2);//$NON-NLS-1$
-		
-		
-		//------------set up project #1 : External Jar and zip file-------
-		
-		IPackageFragmentRoot jdk= JavaProjectHelper.addVariableRTJar(fJProject1, "JRE_LIB_TEST", null, null);//$NON-NLS-1$
-		assertTrue("jdk not found", jdk != null);//$NON-NLS-1$
-
-		
-		//---Create zip file-------------------
-
-		java.io.File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);		
-		
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());//$NON-NLS-1$
-
-		fArchiveFragmentRoot= JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);//$NON-NLS-1$
-		
-		fPackJunit= fArchiveFragmentRoot.getPackageFragment("junit");//$NON-NLS-1$
-		fPackJunitSamples= fArchiveFragmentRoot.getPackageFragment("junit.samples");//$NON-NLS-1$
-		fPackJunitSamplesMoney= fArchiveFragmentRoot.getPackageFragment("junit.samples.money");//$NON-NLS-1$
-		
-		assertNotNull("creating fPackJunit", fPackJunit);//$NON-NLS-1$
-		assertNotNull("creating fPackJunitSamples", fPackJunitSamples);//$NON-NLS-1$
-		assertNotNull("creating fPackJunitSamplesMoney",fPackJunitSamplesMoney);//$NON-NLS-1$
-		
-		fCUIMoney= fPackJunitSamplesMoney.getCompilationUnit("IMoney.java");//$NON-NLS-1$
-		fCUMoney= fPackJunitSamplesMoney.getCompilationUnit("Money.java");//$NON-NLS-1$
-		fCUMoneyBag= fPackJunitSamplesMoney.getCompilationUnit("MoneyBag.java");//$NON-NLS-1$
-		fCUMoneyTest= fPackJunitSamplesMoney.getCompilationUnit("MoneyTest.java");//$NON-NLS-1$
-		
-		//java.io.File mylibJar= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.MYLIB);
-		//assertTrue("lib not found", mylibJar != null && mylibJar.exists());//$NON-NLS-1$
-		//JavaProjectHelper.addLibraryWithImport(fJProject1, new Path(mylibJar.getPath()), null, null);
-
-		//----------------Set up internal jar----------------------------
-		//File myInternalJar= JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/compoundtest.jar"));//$NON-NLS-1$
-		//assertTrue("lib not found", myInternalJar != null && myInternalJar.exists());//$NON-NLS-1$
-		
-		fInternalJarRoot= JavaProjectHelper.addLibraryWithImport(fJProject2, new Path("testresources/compoundtest.jar"), null, null); //$NON-NLS-1$
-		
-		fInternalPackDefault= fInternalJarRoot.getPackageFragment("");//$NON-NLS-1$
-		fInternalPack3= fInternalJarRoot.getPackageFragment("pack3");//$NON-NLS-1$
-		fInternalPack4= fInternalJarRoot.getPackageFragment("pack3.pack4");//$NON-NLS-1$
-		fInternalPack5= fInternalJarRoot.getPackageFragment("pack3.pack5");//$NON-NLS-1$
-		fInternalPack6= fInternalJarRoot.getPackageFragment("pack3.pack5.pack6");//$NON-NLS-1$
-		fInternalPack10= fInternalJarRoot.getPackageFragment("pack3.pack4.pack10");//$NON-NLS-1$
-		fInternalPackMetaInf= fInternalJarRoot.getPackageFragment("META-INF");//$NON-NLS-1$
-		
-		//-----------------Set up source folder--------------------------
-
-		fRoot2= JavaProjectHelper.addSourceContainer(fJProject2, "src2");//$NON-NLS-1$
-		fPackDefault2= fRoot2.createPackageFragment("",true,null);//$NON-NLS-1$
-		fPack12= fRoot2.createPackageFragment("pack1", true, null);//$NON-NLS-1$
-		fPack17= fRoot2.createPackageFragment("pack1.pack7",true,null);//$NON-NLS-1$
-		fPack32= fRoot2.createPackageFragment("pack3",true,null);//$NON-NLS-1$
-		fPack42= fRoot2.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$
-		fPack52= fRoot2.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$
-		fPack62= fRoot2.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$
-		fPack102=fRoot2.createPackageFragment("pack3.pack4.pack10", true, null);//$NON-NLS-1$
-		
-		fCU12= fPack12.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU22= fPack62.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$
-
-
-		//set up project #2: file system structure with in a source folder
-
-	//	JavaProjectHelper.addVariableEntry(fJProject2, new Path("JRE_LIB_TEST"), null, null);
-
-		//----------------Set up source folder--------------------------
-
-		fRoot1= JavaProjectHelper.addSourceContainer(fJProject2, "src1"); //$NON-NLS-1$  
-		fPackDefault1= fRoot1.createPackageFragment("",true,null); //$NON-NLS-1$  
-		fPack21= fRoot1.createPackageFragment("pack2", true, null);//$NON-NLS-1$
-		fPack31= fRoot1.createPackageFragment("pack3",true,null);//$NON-NLS-1$
-		fPack41= fRoot1.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$
-		fPack91= fRoot1.createPackageFragment("pack3.pack4.pack9",true,null);//$NON-NLS-1$
-		fPack51= fRoot1.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$
-		fPack61= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$
-		fPack81= fRoot1.createPackageFragment("pack3.pack8", true, null);//$NON-NLS-1$
-		
-		fCU11= fPack21.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU21= fPack61.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		
-		//set up the mock view
-		setUpMockView();
-	}
-	
-	public void setUpMockView() throws Exception{
-		
-		fWorkbench= PlatformUI.getWorkbench();
-		assertNotNull(fWorkbench);
-		
-		fPage= fWorkbench.getActiveWorkbenchWindow().getActivePage();
-		assertNotNull(fPage);
-		
-		//just testing to make sure my part can be created
-		IViewPart myPart= new MockPluginView();
-		((MockPluginView)myPart).setListState(true);
-
-		myPart= fPage.showView("org.eclipse.jdt.ui.tests.browsing.MockPluginView");//$NON-NLS-1$
-		if (myPart instanceof MockPluginView) {
-			fMyPart= (MockPluginView) myPart;
-			
-			fProvider= (IStructuredContentProvider)fMyPart.getTreeViewer().getContentProvider();
-			//create map and set listener	
-			fProvider.inputChanged(null,null,fJProject2);
-			JavaCore.removeElementChangedListener((IElementChangedListener) fProvider);
-		} else assertTrue("Unable to get view",false);//$NON-NLS-1$
-	
-		assertNotNull(fProvider);		
-	}
-
-	/*
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		
-		JavaProjectHelper.delete(fJProject1);
-		JavaProjectHelper.delete(fJProject2);
-		fProvider.inputChanged(null, null, null);
-		fPage.hideView(fMyPart);
-		fMyPart.dispose();
-		
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);
-
-		
-		super.tearDown();
-	}
-	
-	private boolean compareArrays(Object[] children, Object[] expectedChildren) {
-		if(children.length!=expectedChildren.length)
-			return false;
-		for (int i= 0; i < children.length; i++) {
-			Object child= children[i];
-			if (child instanceof IJavaElement) {
-				IJavaElement el= (IJavaElement) child;
-				if(!contains(el, expectedChildren))
-					return false;
-			} else if(child instanceof IResource){
-				IResource res = (IResource) child;	
-				if(!contains(res, expectedChildren)){
-					return false;	
-				}
-			} else if (child instanceof LogicalPackage){
-				if(!canFindEqualCompoundElement((LogicalPackage)child, expectedChildren))
-					return false;	
-			}
-		}
-		return true;
-	}
-	
-	private boolean canFindEqualCompoundElement(LogicalPackage compoundElement, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if(object instanceof LogicalPackage){
-				LogicalPackage el= (LogicalPackage) object;
-				if(el.getElementName().equals(compoundElement.getElementName()) && (el.getJavaProject().equals(compoundElement.getJavaProject()))){
-					if(compareArrays(el.getFragments(), compoundElement.getFragments()))
-						return true;	
-				}
-			}
-		}
-		return false;
-	}
-	
-	private boolean contains(IResource res, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IResource) {
-				IResource expres= (IResource) object;
-				if(expres.equals(res))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean contains(IJavaElement fragment, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IJavaElement) {
-				IJavaElement expfrag= (IJavaElement) object;
-				if(expfrag.equals(fragment))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private void pushDisplay() {
-		boolean moreToDispatch= true;
-		while (moreToDispatch) {
-			Control ctrl= fMyPart.getTreeViewer().getControl();
-			if (ctrl != null && !ctrl.isDisposed()) {
-				moreToDispatch= fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch();
-			} else
-				moreToDispatch= false;
-		}
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewDeltaTests.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewDeltaTests.java
deleted file mode 100644
index b674aac..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/PackagesViewDeltaTests.java
+++ /dev/null
@@ -1,650 +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.jdt.ui.tests.browsing;
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.jdt.internal.ui.browsing.LogicalPackage;
-
-/**
- * @author jthorsley
- */
-public class PackagesViewDeltaTests extends TestCase {
-	
-	public static Test suite() {
-		TestSuite suite= new TestSuite("org.eclipse.jdt.ui.tests.PackagesViewDeltaTests");//$NON-NLS-1$
-		//$JUnit-BEGIN$
-		suite.addTestSuite(PackagesViewDeltaTests.class);
-		//$JUnit-END$
-		return suite;
-	}
-	
-	private IJavaProject fJProject;
-	
-	private IPackageFragmentRoot fRoot1;
-	private IWorkspace fWorkspace;
-	private IWorkbench fWorkbench;
-	private MockPluginView fMyPart;
-	
-	private ITreeContentProvider fProvider;
-
-	private IWorkbenchPage fPage;
-	private IPackageFragmentRoot fRoot2;
-	private IPackageFragment fPack12;
-	private IPackageFragment fPack32;
-	private IPackageFragment fPack42;
-	private IPackageFragment fPack52;
-	private IPackageFragment fPack62;
-	private ICompilationUnit fCU12;
-	private ICompilationUnit fCU22;
-	private IPackageFragment fPack21;
-	private ICompilationUnit fCU11;
-	private ICompilationUnit fCU21;
-	private IPackageFragment fPack61;
-	private IPackageFragment fPack51;
-	private IPackageFragment fPack41;
-	private IPackageFragment fPack31;
-	private IPackageFragment fPackDefault1;
-	private IPackageFragment fPackDefault2;
-	private IPackageFragment fPack17;
-	private IPackageFragment fPack81;
-	private IPackageFragment fPack91;
-	private IPackageFragmentRoot fInternalJarRoot;
-	private IPackageFragment fInternalPackDefault;
-	private IPackageFragment fInternalPack3;
-	private IPackageFragment fInternalPack4;
-	private IPackageFragment fInternalPack5;
-	private IPackageFragment fInternalPack10;
-	private IPackageFragment fInternalPack6;
-	private IPackageFragment fInternalPackMetaInf;
-	private IPackageFragment fPack102;
-	private ICompilationUnit fCU33;
-	private ICompilationUnit fCU43;
-	private boolean fEnableAutoBuildAfterTesting;
-	
-	public PackagesViewDeltaTests(String name) {
-		super(name);
-	}
-	
-	//-----------------Remove delta test cases------------------
-	
-	public void testRemoveTopLevelFragmentNotLogicalPackage() throws Exception {
-
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject);
-		fProvider.getChildren(cp3);
-
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.REMOVED, fPack12);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-
-		assertTrue("Remove happened", fMyPart.hasRemoveHappened()); //$NON-NLS-1$
-		assertTrue("Correct package removed", fMyPart.getRemovedObject().contains(fPack12)); //$NON-NLS-1$
-	}
-
-	public void testRemoveBottomLevelFragmentNotLogicalPackage() throws Exception {
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject);
-
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.REMOVED, fPack42);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("No remove happened, in Logical Package", !fMyPart.hasRemoveHappened()); //$NON-NLS-1$
-	}
-
-	//This is a bogus test because this situation could never occure
-	//while fPack42 exists you cannot remove fPack32 still it tests 
-	//correct delta handeling.
-	public void testRemoveFragmentInMultiFragmentLogicalPackage() throws Exception {
-
-		//initialise the map
-		fMyPart.fViewer.setInput(fJProject);
-		Object[] children= fProvider.getChildren(fJProject);
-		for (int i= 0; i < children.length; i++) {
-			Object object= children[i];
-			fProvider.getChildren(object);
-		}
-
-		//create a logical package with name "pack3"
-		LogicalPackage expectedParent= new LogicalPackage(fPack31);
-		expectedParent.add(fInternalPack3);
-
-		//create a logical package with name "pack3.pack4"
-		LogicalPackage ChildCp1= new LogicalPackage(fPack41);
-		ChildCp1.add(fPack42);
-		ChildCp1.add(fInternalPack4);
-
-		fMyPart.clear();
-
-		//delete a fragment
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.REMOVED, fPack32);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		//assert remove happened
-		assertTrue("Refresh happened", !fMyPart.hasRemoveHappened() && !fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-
-		//test life cycle of Logical Package
-		Object parent= fProvider.getParent(ChildCp1);
-		if (!(parent instanceof LogicalPackage)) {
-			assertTrue("wrong parent found for logical package after remove", false); //$NON-NLS-1$
-		}
-
-		LogicalPackage lp= (LogicalPackage) parent;
-		assertTrue("PackageFragment removed from logical package", lp.equals(expectedParent)); //$NON-NLS-1$
-
-	}
-
-	public void testRemoveBottomLevelFragmentInMultiFragmentLogicalPackage() throws Exception {
-
-		//delete a fragment
-		fPack62.delete(true, null);
-
-		//create a logical package child of cp with name "pack3.pack5.pack6"
-		LogicalPackage expectedChild= new LogicalPackage(fPack61);
-		expectedChild.add(fInternalPack6);
-
-		//create a logical package child of cp with name "pack3.pack5"
-		LogicalPackage ParentCp5= new LogicalPackage(fPack51);
-		ParentCp5.add(fPack52);
-		ParentCp5.add(fInternalPack5);
-
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		//initialise map
-		fProvider.getChildren(fJProject);
-		fProvider.getChildren(cp3);
-		fProvider.getChildren(ParentCp5);
-
-		fMyPart.clear();
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.REMOVED, fPack62);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		//assert delta correct (no remove or refresh, only change to logicalpackage)
-		assertTrue("Refresh happened", !fMyPart.hasRefreshHappened() && !fMyPart.hasRemoveHappened()); //$NON-NLS-1$
-
-		//test life cycle of LogicalPackage
-		Object[] child= fProvider.getChildren(ParentCp5);
-		
-		if ((child.length != 1) || (!(child[0] instanceof LogicalPackage))) {
-			assertTrue("wrong parent found for logical package after remove", false); //$NON-NLS-1$
-		}
-
-		LogicalPackage lp= (LogicalPackage) child[0];
-		assertTrue("PackageFragment removed from logical package", lp.equals(expectedChild)); //$NON-NLS-1$
-	}
-
-	public void testRemoveFragmentInTwoFragmentLogicalPackage() throws Exception {
-
-		//create a logical package child of cp
-		LogicalPackage ParentCp4= new LogicalPackage(fPack41);
-		ParentCp4.add(fPack42);
-		ParentCp4.add(fInternalPack4);
-
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		//initialise map
-		fProvider.getChildren(fJProject);
-		fProvider.getChildren(cp3);
-		fProvider.getChildren(ParentCp4);
-
-		//create logical package with name "pack3.pack4.pack10"
-		LogicalPackage cp10= new LogicalPackage(fInternalPack10);
-
-		//delete fragment
-		fPack102.delete(true, null);
-
-		fMyPart.clear();
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.REMOVED, fPack102);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		pushDisplay();
-
-		//assert remove happened (delta worked)
-		assertTrue("Refresh happened", fMyPart.hasRemoveHappened() && fMyPart.hasAddHappened()); //$NON-NLS-1$
-		Object addedObject= fMyPart.getAddedObject().get(0);
-		Object removedObject= fMyPart.getRemovedObject().get(0);
-		assertTrue("Correct guy removed", cp10.equals(removedObject)); //$NON-NLS-1$
-		assertTrue("Correct guy added", fInternalPack10.equals(addedObject)); //$NON-NLS-1$
-
-		//assert correct children gotten
-		Object[] children= fProvider.getChildren(ParentCp4);
-		assertTrue("PackageFragment removed from logial package", compareArrays(children, new Object[] { fPack91, fInternalPack10 })); //$NON-NLS-1$
-	}
-
-	//-----------------------Add delta test cases----------------------------------
-	public void testAddTopLevelFragmentNotLogicalPackage() throws Exception {
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject);
-
-		fMyPart.clear();
-
-		IPackageFragment test= fRoot1.createPackageFragment("pack3.test", true, null); //$NON-NLS-1$
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.ADDED, test);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Add happened", fMyPart.hasAddHappened()); //$NON-NLS-1$
-		assertTrue("Correct package added", fMyPart.getAddedObject().contains(test)); //$NON-NLS-1$
-	}
-	
-	public void testAddFragmentToLogicalPackage() throws Exception {
-
-		//create a logical package with name "pack3.pack4"
-		LogicalPackage cp4= new LogicalPackage(fPack41);
-		cp4.add(fPack42);
-		cp4.add(fInternalPack4);
-		  
-		//initialise Map  
-		fProvider.getChildren(cp4);
-
-		//send delta
-		IPackageFragment pack101= fRoot1.createPackageFragment("pack3.pack4.pack10", true, null); //$NON-NLS-1$
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.ADDED, pack101);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-		
-		//force events from display
-		pushDisplay();
-		
-		//make sure no refresh happened
-		assertTrue("Refresh did not happened", !fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-	}
-
-	public void testAddCUFromFragmentNotLogicalPackageVisible() throws Exception {
-
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		ICompilationUnit cu= fPack81.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject);
-		fProvider.getChildren(cp3);
-
-		fMyPart.fViewer.reveal(fPack81);
-
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[] { cu }, fPack81, IJavaElementDelta.ADDED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-		assertTrue("Correct package refreshed", fMyPart.getRefreshedObject().contains(fPack81)); //$NON-NLS-1$
-		assertEquals("Correct number of refreshes", 1, fMyPart.getRefreshedObject().size());//$NON-NLS-1$
-	}
-	
-	public void testAddCUFromFragmentNotLogicalPackageNotVisible() throws Exception {
-
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		ICompilationUnit cu= fPack81.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject);
-		fProvider.getChildren(cp3);
-
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[] { cu }, fPack81, IJavaElementDelta.ADDED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-		assertTrue("Correct package refreshed", fMyPart.getRefreshedObject().contains(cp3)); //$NON-NLS-1$
-		assertEquals("Correct number of refreshes", 1, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-	
-	public void testRemoveCUFromFragmentNotLogicalPackage() throws Exception {
-
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject);
-		fProvider.getChildren(cp3);
-
-		ICompilationUnit cu= fPack81.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-
-		//make sure parent is visible
-		fMyPart.fViewer.setInput(fJProject);
-		fMyPart.fViewer.reveal(fPack81);		
-		
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[] { cu }, fPack81, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-		assertTrue("Correct package refreshed", fMyPart.getRefreshedObject().contains(fPack81)); //$NON-NLS-1$
-		assertEquals("Correct number of refreshes", 1, fMyPart.getRefreshedObject().size());//$NON-NLS-1$
-	}
-	
-	public void testRemoveCUFromFragmentNotLogicalPackageWithParentNotVisible() throws Exception {
-
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject);
-		fProvider.getChildren(cp3);
-
-		ICompilationUnit cu= fPack81.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-
-		fMyPart.clear();
-
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[] { cu }, fPack81, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-		assertTrue("Correct package refreshed", fMyPart.getRefreshedObject().contains(cp3)); //$NON-NLS-1$
-		assertEquals("Correct number of refreshes", 1, fMyPart.getRefreshedObject().size());//$NON-NLS-1$
-	}
-	
-	public void testAddBottomLevelFragmentNotLogicalPackage() throws Exception {
-
-		//create a logical package for packages with name "pack3"
-		LogicalPackage cp3= new LogicalPackage(fPack31);
-		cp3.add(fPack32);
-		cp3.add(fInternalPack3);
-
-		//initialise Map
-		fMyPart.fViewer.setInput(fJProject);
-		fProvider.getChildren(cp3);
-
-		fMyPart.clear();
-
-		IPackageFragment test= fRoot1.createPackageFragment("pack3.pack5.test", true, null); //$NON-NLS-1$
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= new TestDelta(IJavaElementDelta.ADDED, test);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		pushDisplay();
-		
-		assertTrue("Add happened", fMyPart.hasAddHappened()); //$NON-NLS-1$
-		assertTrue("Corrent package added", fMyPart.getAddedObject().contains(test)); //$NON-NLS-1$
-	}
-	/*
-	 * @see TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		fWorkspace= ResourcesPlugin.getWorkspace();
-		assertNotNull(fWorkspace);
-		
-		IWorkspaceDescription workspaceDesc= fWorkspace.getDescription();
-		fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding();
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(false);
-
-		//------------set up project ------------------------------
-		fJProject= JavaProjectHelper.createJavaProject("TestProject2", "bin"); //$NON-NLS-1$//$NON-NLS-2$
-		assertNotNull("project null", fJProject); //$NON-NLS-1$
-
-		//----------------Set up internal jar----------------------------
-		File myInternalJar= JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/compoundtest.jar")); //$NON-NLS-1$
-		assertTrue("lib not found", myInternalJar != null && myInternalJar.exists()); //$NON-NLS-1$
-		fInternalJarRoot= JavaProjectHelper.addLibraryWithImport(fJProject, new Path(myInternalJar.getPath()), null, null);
-		fInternalPackDefault= fInternalJarRoot.getPackageFragment(""); //$NON-NLS-1$
-		fInternalPack3= fInternalJarRoot.getPackageFragment("pack3"); //$NON-NLS-1$
-		fInternalPack4= fInternalJarRoot.getPackageFragment("pack3.pack4"); //$NON-NLS-1$
-		fInternalPack5= fInternalJarRoot.getPackageFragment("pack3.pack5"); //$NON-NLS-1$
-		fInternalPack6= fInternalJarRoot.getPackageFragment("pack3.pack5.pack6"); //$NON-NLS-1$
-		fInternalPack10= fInternalJarRoot.getPackageFragment("pack3.pack4.pack10"); //$NON-NLS-1$
-		fInternalPackMetaInf= fInternalJarRoot.getPackageFragment("meta-inf"); //$NON-NLS-1$
-
-		//-----------------Set up source folder--------------------------
-
-		fRoot2= JavaProjectHelper.addSourceContainer(fJProject, "src2"); //$NON-NLS-1$
-		fPackDefault2= fRoot2.createPackageFragment("", true, null); //$NON-NLS-1$
-		fPack12= fRoot2.createPackageFragment("pack1", true, null); //$NON-NLS-1$
-		fPack17= fRoot2.createPackageFragment("pack1.pack7", true, null); //$NON-NLS-1$
-		fPack32= fRoot2.createPackageFragment("pack3", true, null); //$NON-NLS-1$
-		fPack42= fRoot2.createPackageFragment("pack3.pack4", true, null); //$NON-NLS-1$
-		fPack52= fRoot2.createPackageFragment("pack3.pack5", true, null); //$NON-NLS-1$
-		fPack62= fRoot2.createPackageFragment("pack3.pack5.pack6", true, null); //$NON-NLS-1$
-		fPack102= fRoot2.createPackageFragment("pack3.pack4.pack10", true, null); //$NON-NLS-1$
-
-		fCU12= fPack12.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-		fCU22= fPack62.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-		//so that fPack52 won't get deleted when we delete fPack62 in certain tests
-		fCU33= fPack52.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-		//so that fPack42 won't get deleted when we delete fPack102 in certain tests
-		fCU43= fPack42.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-
-		//set up project #2: file system structure with in a source folder
-
-		//	JavaProjectHelper.addVariableEntry(fJProject2, new Path("JRE_LIB_TEST"), null, null);
-
-		//----------------Set up source folder--------------------------
-
-		fRoot1= JavaProjectHelper.addSourceContainer(fJProject, "src1"); //$NON-NLS-1$
-		fPackDefault1= fRoot1.createPackageFragment("", true, null); //$NON-NLS-1$
-		fPack21= fRoot1.createPackageFragment("pack2", true, null); //$NON-NLS-1$
-		fPack31= fRoot1.createPackageFragment("pack3", true, null); //$NON-NLS-1$
-		fPack41= fRoot1.createPackageFragment("pack3.pack4", true, null); //$NON-NLS-1$
-		fPack91= fRoot1.createPackageFragment("pack3.pack4.pack9", true, null); //$NON-NLS-1$
-		fPack51= fRoot1.createPackageFragment("pack3.pack5", true, null); //$NON-NLS-1$
-		fPack61= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null); //$NON-NLS-1$
-		fPack81= fRoot1.createPackageFragment("pack3.pack8", true, null); //$NON-NLS-1$
-
-		fCU11= fPack21.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-		fCU21= fPack61.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$//$NON-NLS-2$
-
-		//set up the mock view
-		setUpMockView();
-	}
-	public void setUpMockView() throws Exception {
-
-		fWorkbench= PlatformUI.getWorkbench();
-		assertNotNull(fWorkbench);
-
-		fPage= fWorkbench.getActiveWorkbenchWindow().getActivePage();
-		assertNotNull(fPage);
-
-		//just testing to make sure my part can be created
-		IViewPart myPart= new MockPluginView();
-		assertNotNull(myPart);
-
-		myPart= fPage.showView("org.eclipse.jdt.ui.tests.browsing.MockPluginView"); //$NON-NLS-1$
-		if (myPart instanceof MockPluginView) {
-			fMyPart= (MockPluginView) myPart;
-			fProvider= (ITreeContentProvider) fMyPart.getTreeViewer().getContentProvider();
-			JavaCore.removeElementChangedListener((IElementChangedListener) fProvider);
-		} else
-			assertTrue("Unable to get view", false); //$NON-NLS-1$
-
-		assertNotNull(fProvider);
-	}
-
-	/*
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-
-		JavaProjectHelper.delete(fJProject);
-		fProvider.inputChanged(null, null, null);
-		fPage.hideView(fMyPart);
-		fMyPart.dispose();
-
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);
-
-		super.tearDown();
-	}
-		
-	/**
-	 * Method compareArrays. Both arrays must be of IPackageFragments or compare will fail.
-	 * @param children 
-	 * @param expectedChildren
-	 * @return boolean returns true if the arrays contain the same elements
-	 */
-	private boolean compareArrays(Object[] children, Object[] expectedChildren) {
-		if (children.length != expectedChildren.length)
-			return false;
-		for (int i= 0; i < children.length; i++) {
-			Object child= children[i];
-			if (child instanceof IJavaElement) {
-				IJavaElement el= (IJavaElement) child;
-				if (!contains(el, expectedChildren))
-					return false;
-			} else if (child instanceof IResource) {
-				IResource res= (IResource) child;
-				if (!contains(res, expectedChildren)) {
-					return false;
-				}
-			} else if (child instanceof LogicalPackage) {
-				if (!contains((LogicalPackage) child, expectedChildren))
-					return false;
-			}
-		}
-		return true;
-	}
-
-	private boolean contains(IResource res, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IResource) {
-				IResource expres= (IResource) object;
-				if (expres.equals(res))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	private boolean contains(IJavaElement fragment, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IJavaElement) {
-				IJavaElement expfrag= (IJavaElement) object;
-				if (expfrag.equals(fragment))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	private boolean contains(LogicalPackage lp, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof LogicalPackage) {
-				LogicalPackage explp= (LogicalPackage) object;
-				if (explp.equals(lp))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	private void pushDisplay() {
-		Control ctrl= fMyPart.getTreeViewer().getControl();
-		while (ctrl != null && !ctrl.isDisposed() && fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch())
-			ctrl= fMyPart.getTreeViewer().getControl();
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/TestDelta.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/TestDelta.java
deleted file mode 100644
index 1d5bec4..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/browsing/TestDelta.java
+++ /dev/null
@@ -1,165 +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.jdt.ui.tests.browsing;
-
-import org.eclipse.core.resources.IResourceDelta;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-
-/**
- * A faux  delta for testing
- */
-public class TestDelta implements IJavaElementDelta {
-
-	private int fKind;
-	private IJavaElement fElement;
-
-	private IJavaElementDelta[] fAffectedChildren;
-
-	public TestDelta(int kind, IJavaElement element) {
-		fKind= kind;
-		fElement= element;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getAddedChildren()
-	 */
-	public IJavaElementDelta[] getAddedChildren() {
-		return null;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getAffectedChildren()
-	 */
-	public IJavaElementDelta[] getAffectedChildren() {
-		if (fAffectedChildren == null)
-			return new IJavaElementDelta[0];
-		else
-			return fAffectedChildren;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getChangedChildren()
-	 */
-	public IJavaElementDelta[] getChangedChildren() {
-		return null;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getElement()
-	 */
-	public IJavaElement getElement() {
-		return fElement;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getFlags()
-	 */
-	public int getFlags() {
-		return 0;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getKind()
-	 */
-	public int getKind() {
-		return fKind;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getMovedFromElement()
-	 */
-	public IJavaElement getMovedFromElement() {
-		return null;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getMovedToElement()
-	 */
-	public IJavaElement getMovedToElement() {
-		return null;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getRemovedChildren()
-	 */
-	public IJavaElementDelta[] getRemovedChildren() {
-		return null;
-	}
-	/*
-	 * @see org.eclipse.jdt.core.IJavaElementDelta#getResourceDeltas()
-	 */
-	public IResourceDelta[] getResourceDeltas() {
-		return null;
-	}
-
-	/**
-	 * Set the affected children of this Delta.
-	 * @param children
-	 */
-	public void setAffectedChildren(IJavaElementDelta[] children) {
-		fAffectedChildren= children;
-	}
-
-	/**
-	 * Create the parent deltas for an IPackageFragment.
-	 * 
-	 * @param frag
-	 * @param delta
-	 * @return TestDelta
-	 */
-	public static TestDelta createParentDeltas(IPackageFragment frag, TestDelta delta) {
-		IJavaElement root= frag.getParent();
-		TestDelta rootDelta= new TestDelta(IJavaElementDelta.CHANGED, root);
-
-		IJavaProject proj= root.getJavaProject();
-		TestDelta projectDelta= new TestDelta(IJavaElementDelta.CHANGED, proj);
-
-		IJavaModel model= proj.getJavaModel();
-		TestDelta modelDelta= new TestDelta(IJavaElementDelta.CHANGED, model);
-
-		//set affected children
-		modelDelta.setAffectedChildren(new IJavaElementDelta[] { projectDelta });
-		projectDelta.setAffectedChildren(new IJavaElementDelta[] { rootDelta });
-		rootDelta.setAffectedChildren(new IJavaElementDelta[] { delta });
-		return modelDelta;
-	}
-
-	/**
-	 * Create a delta for a list of ICompilationUnits, all the parent deltas
-	 * from the JavaModel down are created as well.
-	 * 
-	 * @param cu
-	 * @param parent
-	 * @param action
-	 * @return IJavaElementDelta
-	 */
-	public static IJavaElementDelta createCUDelta(ICompilationUnit[] cu, IPackageFragment parent, int action) {
-		TestDelta fragmentDelta= new TestDelta(IJavaElementDelta.CHANGED, parent);
-
-		TestDelta[] deltas= new TestDelta[cu.length];
-		for (int i= 0; i < cu.length; i++) {
-			deltas[i]= new TestDelta(action, cu[i]);
-		}
-
-		fragmentDelta.setAffectedChildren(deltas);
-		return createParentDeltas(parent, fragmentDelta);
-	}
-
-	/**
-	 * Creates a delta for a PackageFragment from the JavaModel down.
-	 * 
-	 * @param frag
-	 * @param action
-	 * @return IJavaElementDelta
-	 */
-	public static IJavaElementDelta createDelta(IPackageFragment frag, int action) {
-		TestDelta delta= new TestDelta(action, frag);
-		return createParentDeltas(frag, delta);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/callhierarchy/CallHierarchyContentProviderTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/callhierarchy/CallHierarchyContentProviderTest.java
deleted file mode 100644
index 2e95b6d..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/callhierarchy/CallHierarchyContentProviderTest.java
+++ /dev/null
@@ -1,284 +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:
- *   Jesper Kamstrup Linnet (eclipse@kamstrup-linnet.dk) - initial API and implementation
- *             (report 36180: Callers/Callees view)
- ******************************************************************************/
-package org.eclipse.jdt.ui.tests.callhierarchy;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.internal.ui.callhierarchy.CallHierarchyContentProvider;
-import org.eclipse.jdt.internal.ui.callhierarchy.CallHierarchyUI;
-import org.eclipse.jdt.internal.ui.callhierarchy.TreeRoot;
-
-import org.eclipse.jdt.internal.corext.callhierarchy.CallHierarchy;
-import org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper;
-
-public class CallHierarchyContentProviderTest extends TestCase {
-    private static final int DEFAULT_MAX_DEPTH= 10;
-
-    private static final Class THIS= CallHierarchyContentProviderTest.class;
-
-    private CallHierarchyTestHelper helper;
-
-    private CallHierarchyContentProvider fProvider;
-    public CallHierarchyContentProviderTest(String name) {
-        super(name);
-    }
-
-    public static Test suite() {
-        if (true) {
-            return new TestSuite(THIS);
-        } else {
-            TestSuite suite= new TestSuite();
-            suite.addTest(new CallHierarchyContentProviderTest("test1"));
-
-            return suite;
-        }
-    }
-
-    protected void setUp() throws Exception {
-        helper= new CallHierarchyTestHelper();
-        helper.setUp();
-
-        fProvider= new CallHierarchyContentProvider();
-
-        CallHierarchyUI.getDefault().setMaxCallDepth(DEFAULT_MAX_DEPTH);
-    }
-
-    protected void tearDown() throws Exception {
-        helper.tearDown();
-        helper= null;
-
-        CallHierarchyUI.getDefault().setMaxCallDepth(DEFAULT_MAX_DEPTH);
-    }
-
-    /**
-     * Tests getChildren and hasChildren on an "ordinary" callee tree.
-     * 
-     * @throws JavaModelException
-     * @throws CoreException
-     */
-    public void testGetChildrenOfCalleeRoot() throws JavaModelException, CoreException {
-        helper.createSimpleClasses();
-
-        TreeRoot root= wrapCalleeRoot(helper.getMethod4());
-        Object[] children= fProvider.getChildren(root);
-        assertEquals("Wrong number of children", 1, children.length);
-        helper.assertCalls(new IMember[] { helper.getMethod4()}, children);
-        assertEquals("Wrong method", helper.getMethod4(), ((MethodWrapper) children[0]).getMember());
-        assertEquals("root's hasChildren", true, fProvider.hasChildren(root));
-
-        Object[] secondLevelChildren= fProvider.getChildren(children[0]);
-        helper.assertCalls(new IMember[] { helper.getMethod3()}, secondLevelChildren);
-        assertCalleeMethodWrapperChildren(secondLevelChildren);
-        assertEquals("second level hasChildren", true, fProvider.hasChildren(children[0]));
-
-        Object[] thirdLevelChildren= fProvider.getChildren(secondLevelChildren[0]);
-        helper.assertCalls(new IMember[] { helper.getMethod1(), helper.getMethod2()}, thirdLevelChildren);
-        assertCalleeMethodWrapperChildren(thirdLevelChildren);
-        assertEquals("third level hasChildren", true, fProvider.hasChildren(secondLevelChildren[0]));
-
-        MethodWrapper fourthLevelMethodWrapper= helper.findMethodWrapper(helper.getMethod1(), thirdLevelChildren);
-        assertNotNull("method1 not found", fourthLevelMethodWrapper);
-        assertEquals(
-            "Wrong number of fourth level children",
-            0,
-            fProvider.getChildren(fourthLevelMethodWrapper).length);
-        // hasChildren should be true even if the node doesn't have children (for performance reasons)
-        assertEquals("fourth level hasChildren", true, fProvider.hasChildren(fourthLevelMethodWrapper));
-    }
-
-    /**
-     * Tests getChildren and hasChildren on an "ordinary" callers tree.
-     * 
-     * @throws JavaModelException
-     * @throws CoreException
-     */
-    public void testGetChildrenOfCallerRoot() throws JavaModelException, CoreException {
-        helper.createSimpleClasses();
-
-        TreeRoot root= wrapCallerRoot(helper.getMethod1());
-        Object[] children= fProvider.getChildren(root);
-        helper.assertCalls(new IMember[] { helper.getMethod1()}, children);
-        assertEquals("root's hasChildren", true, fProvider.hasChildren(root));
-
-        Object[] secondLevelChildren= fProvider.getChildren(children[0]);
-        helper.assertCalls(new IMember[] { helper.getMethod2(), helper.getMethod3()}, secondLevelChildren);
-        assertCallerMethodWrapperChildren(secondLevelChildren);
-        assertEquals("second level hasChildren", true, fProvider.hasChildren(children[0]));
-
-        MethodWrapper thirdLevelMethodWrapper= helper.findMethodWrapper(helper.getMethod3(), secondLevelChildren);
-        assertNotNull("method3() not found", thirdLevelMethodWrapper);
-        Object[] thirdLevelChildren= fProvider.getChildren(thirdLevelMethodWrapper);
-        helper.assertCalls(new IMember[] { helper.getMethod4()}, thirdLevelChildren);
-        assertCallerMethodWrapperChildren(thirdLevelChildren);
-        assertEquals("third level hasChildren", true, fProvider.hasChildren(thirdLevelMethodWrapper));
-
-        assertEquals("Wrong number of fourth level children", 0, fProvider.getChildren(thirdLevelChildren[0]).length);
-        // hasChildren should be true even if the node doesn't have children (for performance reasons)
-        assertEquals("fourth level hasChildren", true, fProvider.hasChildren(thirdLevelChildren[0]));
-    }
-
-    /**
-     * Tests getChildren and hasChildren on an callers tree which exceeds the max call depth.
-     * 
-     * @throws JavaModelException
-     * @throws CoreException
-     */
-    public void testGetChildrenOfCallerMaxDepth() throws JavaModelException, CoreException {
-        helper.createSimpleClasses();
-
-        CallHierarchyUI.getDefault().setMaxCallDepth(2);
-
-        TreeRoot root= wrapCallerRoot(helper.getMethod1());
-        Object[] children= fProvider.getChildren(root);
-        helper.assertCalls(new IMember[] { helper.getMethod1()}, children);
-        assertEquals("root's hasChildren", true, fProvider.hasChildren(root));
-
-        Object[] secondLevelChildren= fProvider.getChildren(children[0]);
-        helper.assertCalls(new IMember[] { helper.getMethod2(), helper.getMethod3()}, secondLevelChildren);
-        assertCallerMethodWrapperChildren(secondLevelChildren);
-        assertEquals("second level hasChildren", true, fProvider.hasChildren(children[0]));
-
-        MethodWrapper thirdLevelMethodWrapper= helper.findMethodWrapper(helper.getMethod3(), secondLevelChildren);
-        assertNotNull("method3() not found", thirdLevelMethodWrapper);
-        Object[] thirdLevelChildren= fProvider.getChildren(thirdLevelMethodWrapper);
-        helper.assertCalls(new IMember[] { helper.getMethod4()}, thirdLevelChildren);
-        assertCallerMethodWrapperChildren(thirdLevelChildren);
-        assertEquals("third level hasChildren", true, fProvider.hasChildren(thirdLevelMethodWrapper));
-
-        assertEquals("Wrong number of fourth level children", 0, fProvider.getChildren(thirdLevelChildren[0]).length);
-        // hasChildren should be false since the maximum depth has been reached
-        assertEquals("fourth level hasChildren", false, fProvider.hasChildren(thirdLevelChildren[0]));
-    }
-
-    /**
-     * Tests getChildren and hasChildren on an callee tree which exceeds the max call depth.
-     * 
-     * @throws JavaModelException
-     * @throws CoreException
-     */
-    public void testGetChildrenOfCalleeMaxDepth() throws JavaModelException, CoreException {
-        helper.createSimpleClasses();
-
-        CallHierarchyUI.getDefault().setMaxCallDepth(2);
-
-        TreeRoot root= wrapCalleeRoot(helper.getMethod4());
-        Object[] children= fProvider.getChildren(root);
-        assertEquals("Wrong number of children", 1, children.length);
-        helper.assertCalls(new IMember[] { helper.getMethod4()}, children);
-        assertEquals("Wrong method", helper.getMethod4(), ((MethodWrapper) children[0]).getMember());
-        assertEquals("root's hasChildren", true, fProvider.hasChildren(root));
-
-        Object[] secondLevelChildren= fProvider.getChildren(children[0]);
-        helper.assertCalls(new IMember[] { helper.getMethod3()}, secondLevelChildren);
-        assertCalleeMethodWrapperChildren(secondLevelChildren);
-        assertEquals("second level hasChildren", true, fProvider.hasChildren(children[0]));
-
-        Object[] thirdLevelChildren= fProvider.getChildren(secondLevelChildren[0]);
-        helper.assertCalls(new IMember[] { helper.getMethod1(), helper.getMethod2()}, thirdLevelChildren);
-        assertCalleeMethodWrapperChildren(thirdLevelChildren);
-        assertEquals("third level hasChildren", true, fProvider.hasChildren(secondLevelChildren[0]));
-
-        MethodWrapper fourthLevelMethodWrapper= helper.findMethodWrapper(helper.getMethod1(), thirdLevelChildren);
-        assertNotNull("method1 not found", fourthLevelMethodWrapper);
-        assertEquals(
-            "Wrong number of fourth level children",
-            0,
-            fProvider.getChildren(fourthLevelMethodWrapper).length);
-        // hasChildren should be false since the maximum depth has been reached
-        assertEquals("fourth level hasChildren", false, fProvider.hasChildren(thirdLevelChildren[0]));
-    }
-
-    /**
-    * Tests getChildren and hasChildren on an callers tree with recursion.
-    * 
-    * @throws JavaModelException
-    * @throws CoreException
-    */
-    public void testGetChildrenOfCalleeRecursive() throws JavaModelException, CoreException {
-        helper.createSimpleClasses();
-
-        TreeRoot root= wrapCalleeRoot(helper.getRecursiveMethod1());
-        Object[] children= fProvider.getChildren(root);
-        helper.assertCalls(new IMember[] { helper.getRecursiveMethod1()}, children);
-        assertEquals("root's hasChildren", true, fProvider.hasChildren(root));
-
-        Object[] secondLevelChildren= fProvider.getChildren(children[0]);
-        helper.assertCalls(new IMember[] { helper.getRecursiveMethod2()}, secondLevelChildren);
-        assertCalleeMethodWrapperChildren(secondLevelChildren);
-        assertEquals("second level hasChildren", true, fProvider.hasChildren(children[0]));
-
-        MethodWrapper thirdLevelMethodWrapper= (MethodWrapper) secondLevelChildren[0];
-        Object[] thirdLevelChildren= fProvider.getChildren(thirdLevelMethodWrapper);
-        helper.assertCalls(new IMember[] { helper.getRecursiveMethod1()}, thirdLevelChildren);
-        assertCalleeMethodWrapperChildren(thirdLevelChildren);
-
-        // A recursion should have occurred, resulting in hasChildren = false 
-        assertEquals("third level hasChildren", false, fProvider.hasChildren(thirdLevelChildren[0]));
-    }
-
-    /**
-     * Tests getChildren and hasChildren on an callees tree with recursion.
-     * 
-     * @throws JavaModelException
-     * @throws CoreException
-     */
-    public void testGetChildrenOfCallerRecursive() throws JavaModelException, CoreException {
-        helper.createSimpleClasses();
-
-        TreeRoot root= wrapCallerRoot(helper.getRecursiveMethod1());
-        Object[] children= fProvider.getChildren(root);
-        helper.assertCalls(new IMember[] { helper.getRecursiveMethod1()}, children);
-        assertEquals("root's hasChildren", true, fProvider.hasChildren(root));
-
-        Object[] secondLevelChildren= fProvider.getChildren(children[0]);
-        helper.assertCalls(new IMember[] { helper.getRecursiveMethod2()}, secondLevelChildren);
-        assertCallerMethodWrapperChildren(secondLevelChildren);
-        assertEquals("second level hasChildren", true, fProvider.hasChildren(children[0]));
-
-        MethodWrapper thirdLevelMethodWrapper= (MethodWrapper) secondLevelChildren[0];
-        Object[] thirdLevelChildren= fProvider.getChildren(thirdLevelMethodWrapper);
-        helper.assertCalls(new IMember[] { helper.getRecursiveMethod1()}, thirdLevelChildren);
-        assertCallerMethodWrapperChildren(thirdLevelChildren);
-
-        // A recursion should have occurred, resulting in hasChildren = false 
-        assertEquals("third level hasChildren", false, fProvider.hasChildren(thirdLevelChildren[0]));
-    }
-
-    private void assertCalleeMethodWrapperChildren(Object[] children) {
-        for (int i= 0; i < children.length; i++) {
-            assertTrue("Wrong class returned", children[i].getClass().getName().endsWith(".CalleeMethodWrapper"));
-        }
-    }
-
-    private void assertCallerMethodWrapperChildren(Object[] children) {
-        for (int i= 0; i < children.length; i++) {
-            assertTrue("Wrong class returned", children[i].getClass().getName().endsWith(".CallerMethodWrapper"));
-        }
-    }
-
-    private TreeRoot wrapCalleeRoot(IMethod method) {
-        return new TreeRoot(CallHierarchy.getDefault().getCalleeRoot(method));
-    }
-
-    private TreeRoot wrapCallerRoot(IMethod method) {
-        return new TreeRoot(CallHierarchy.getDefault().getCallerRoot(method));
-    }
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/callhierarchy/CallHierarchyTestHelper.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/callhierarchy/CallHierarchyTestHelper.java
deleted file mode 100644
index 5e5b653..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/callhierarchy/CallHierarchyTestHelper.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddImportTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddImportTest.java
deleted file mode 100644
index 3bce6fd..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddImportTest.java
+++ /dev/null
@@ -1,239 +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.jdt.ui.tests.core;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.internal.corext.codemanipulation.ImportsStructure;
-
-public class AddImportTest extends CoreTests {
-	
-	private static final Class THIS= AddImportTest.class;
-	
-	private IJavaProject fJProject1;
-
-	public AddImportTest(String name) {
-		super(name);
-	}
-	
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new AddImportTest("testAddImports_bug25113"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-
-	protected void setUp() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		JavaProjectHelper.addRequiredProject(fJProject1, ProjectTestSetup.getProject());
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.delete(fJProject1);
-	}
-	
-	public void testAddImports1() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("import pack.List2;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		String[] order= new String[] { "java", "com", "pack" };
-		
-		ImportsStructure imports= new ImportsStructure(cu, order, 2, true);
-		imports.addImport("java.net.Socket");
-		imports.addImport("p.A");
-		imports.addImport("com.something.Foo");
-		
-		imports.create(true, null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.net.Socket;\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("import com.something.Foo;\n");
-		buf.append("\n");
-		buf.append("import p.A;\n");
-		buf.append("\n");		
-		buf.append("import pack.List;\n");
-		buf.append("import pack.List2;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-
-	public void testAddImports2() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		String[] order= new String[] { "java", "java.util", "com", "pack" };
-
-		ImportsStructure imports= new ImportsStructure(cu, order, 2, true);
-		imports.addImport("java.x.Socket");
-
-		imports.create(true, null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.x.Socket;\n");
-		buf.append("\n");		
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testAddImports_bug23078() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import p.A.*;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		String[] order= new String[] { };
-
-		ImportsStructure imports= new ImportsStructure(cu, order, 2, true);
-		imports.addImport("p.Inner");
-
-		imports.create(true, null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import p.Inner;\n");
-		buf.append("import p.A.*;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testAddImports_bug25113() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.awt.Panel;\n");
-		buf.append("\n");
-		buf.append("import java.math.BigInteger;\n");
-		buf.append("\n");		
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		String[] order= new String[] { "java.awt", "java" };
-
-		ImportsStructure imports= new ImportsStructure(cu, order, 99, true);
-		imports.addImport("java.applet.Applet");
-
-		imports.create(true, null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.awt.Panel;\n");
-		buf.append("\n");
-		buf.append("import java.applet.Applet;\n");
-		buf.append("import java.math.BigInteger;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testAddImports_bug42637() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.lang.System;\n");
-		buf.append("\n");		
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		String[] order= new String[] { "java" };
-
-		ImportsStructure imports= new ImportsStructure(cu, order, 99, true);
-		imports.addImport("java.io.Exception");
-
-		imports.create(true, null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.io.Exception;\n");
-		buf.append("import java.lang.System;\n");
-		buf.append("\n");		
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}		
-
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddUnimplementedConstructorsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddUnimplementedConstructorsTest.java
deleted file mode 100644
index 627b42e..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddUnimplementedConstructorsTest.java
+++ /dev/null
@@ -1,1106 +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.jdt.ui.tests.core;
-
-import java.io.IOException;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.Modifier;
-
-import org.eclipse.jdt.internal.corext.codemanipulation.AddUnimplementedConstructorsOperation;
-import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
-import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility;
-import org.eclipse.jdt.internal.corext.template.CodeTemplates;
-import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
-
-
-public class AddUnimplementedConstructorsTest extends CoreTests {
-
-	private static final Class THIS= AddUnimplementedConstructorsTest.class;
-	
-	private IJavaProject fJavaProject;
-	private IPackageFragment fPackage;
-	private IType fClassA, fClassB, fClassC;
-	private boolean fOldFormatter;
-
-	private CodeGenerationSettings fSettings;
-
-	public AddUnimplementedConstructorsTest(String name) {
-		super(name);
-		fOldFormatter= false;
-	}
-	
-	
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new AddUnimplementedConstructorsTest("testOneConstructorWithImportStatement"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-	/**
-	 * Creates a new test Java project.
-	 */	
-	protected void setUp() throws Exception {
-		initCodeTemplates();		
-	}	
-	
-	private void initCodeTemplates() {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		options.put(JavaCore.FORMATTER_LINE_SPLIT, "999");
-		JavaCore.setOptions(options);		
-
-		StringBuffer comment= new StringBuffer();
-		comment.append("/** Constructor Comment\n");
-		comment.append(" * ${tags}\n");
-		comment.append(" */");
-		
-		CodeTemplates.getCodeTemplate(CodeTemplates.CONSTRUCTORCOMMENT).setPattern(comment.toString());
-		CodeTemplates.getCodeTemplate(CodeTemplates.CONSTRUCTORSTUB).setPattern("${body_statement}\n// TODO");	
-		fSettings= JavaPreferencesSettings.getCodeGenerationSettings();
-		fSettings.createComments= true;
-	}
-
-	/**
-	 * Removes the test java project.
-	 */
-	protected void tearDown () throws Exception {
-		JavaProjectHelper.delete(fJavaProject);
-		fJavaProject= null;
-		fPackage= null;
-		fClassA= null;
-	}
-	
-	/*
-	 * basic test: test with one constructor
-	 */
-	public void testOneConstructorToOverride() throws Exception {
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= fPackage.createCompilationUnit("A.java", "package ibm.util;\n\n", true, null);
-		fClassA= cu.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java"); //$NON-NLS-1$
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null); //$NON-NLS-1$
-	
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] { "A" }, constructorMethods); //$NON-NLS-1$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(false);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] { "Test1" }, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		checkDefaultConstructorWithCommentWithSuper(createdMethods[0].getSource());
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * \n");
-		buf.append("     */\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        super();\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-		compareSource(buf.toString(), testClass.getSource());
-	}
-	
-	/*
-	 * basic test: test with 2 constructors to override
-	 */
-	public void testTwoConstructorsToOverride() throws Exception {
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= fPackage.getCompilationUnit("A.java");
-		fClassA= cu.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		fClassA.createMethod("public A(int a) {super();}\n", null, true, null);
-		
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-	
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] { "A", "A" }, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(false);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] { "Test1", "Test1" }, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		checkDefaultConstructorWithCommentWithSuper(createdMethods[0].getSource());
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * \n");
-		buf.append("     */\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        super();\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a) {\n");
-		buf.append("        super(a);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}
-	
-	/*
-	 * basic test: test with 3 constructors to override
-	 */
-	public void testThreeConstructorsToOverride() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= fPackage.getCompilationUnit("A.java");
-		fClassA= cu.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		fClassA.createMethod("public A(int a) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo) {super();}\n", null, true, null);
-		
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-	
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] { "A", "A", "A" }, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] { "Test1", "Test1", "Test1" }, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		checkDefaultConstructorWithCommentNoSuper(createdMethods[0].getSource());
-
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * \n");
-		buf.append("     */\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a) {\n");
-		buf.append("        super(a);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo) {\n");
-		buf.append("        super(a, boo);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}
-	
-	/*
-	 * basic test: test with default constructor only
-	 */
-	public void testDefaultConstructorToOverride() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= fPackage.getCompilationUnit("A.java");
-		fClassA= cu.createType("public class A {\n}\n", null, true, null);	
-		
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-	
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] { "Object" }, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-				
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(false);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] { "Test1" }, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		checkDefaultConstructorWithCommentWithSuper(createdMethods[0].getSource());
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * \n");
-		buf.append("     */\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        super();\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}	
-	
-	/*
-	 * basic test: test with nothing to override
-	 */
-	public void testNoConstructorsToOverrideAvailable() throws Exception {
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= fPackage.getCompilationUnit("A.java");
-		fClassA= cu.createType("public class A {\n}\n", null, true, null);		
-		
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-		testClass.createMethod("public Test1(){}\n", null, true, null);
-	
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] {}, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(false);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] existingMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1"}, existingMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("public Test1(){}\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}	
-	
-	/*
-	 * basic test: test an Interface to make sure no exception is thrown
-	 */
-	public void testNoConstructorsToOverrideWithInterface() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= fPackage.getCompilationUnit("A.java");
-		fClassA= cu.createType("public interface A {\n}\n", null, true, null);		
-		
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 implements A {\n}\n", null, true, null);
-		testClass.createMethod("public Test1(){}\n", null, true, null);
-		
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] {}, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(false);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] existingMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1"}, existingMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 implements A {\n");
-		buf.append("public Test1(){}\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}	
-	
-	/*
-	 * basic test: test with 8 constructors to override
-	 */
-	public void testEightConstructorsToOverride() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= fPackage.getCompilationUnit("A.java");
-		fClassA= cu.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		fClassA.createMethod("public A(int a) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf, char a) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf, char a, double c) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString) {super();}\n", null, true, null);
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-	
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] { "A", "A", "A", "A", "A", "A", "A", "A" }, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		fSettings.createComments= false;
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1", "Test1"}, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		checkDefaultConstructorNoCommentNoSuper(createdMethods[0].getSource());	
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    public Test1(int a) {\n");
-		buf.append("        super(a);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString) {\n");
-		buf.append("        super(a, boo, fooString);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf) {\n");
-		buf.append("        super(a, boo, fooString, buf);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a) {\n");
-		buf.append("        super(a, boo, fooString, buf, a);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c, d);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c, d, secondString);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}
-	
-	/*
-	 * basic test: test with 4 constructors to override. Class B extends Class A.
-	 */
-	public void testFourConstructorsToOverride() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cuA= fPackage.getCompilationUnit("A.java");
-		fClassA= cuA.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		fClassA.createMethod("public A(int a) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf) {super();}\n", null, true, null);
-
-		ICompilationUnit cuB= fPackage.getCompilationUnit("B.java");
-		fClassB= cuB.createType("public class B extends A{\n}\n", null, true, null);		
-		fClassB.createMethod("public B(int a, boolean boo, String fooString, StringBuffer buf, char a) {super();}\n", null, true, null);
-		fClassB.createMethod("public B(int a, boolean boo, String fooString, StringBuffer buf, char a, double c) {super();}\n", null, true, null);
-		fClassB.createMethod("public B(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d) {super();}\n", null, true, null);
-		fClassB.createMethod("public B(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString) {super();}\n", null, true, null);
-
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends B {\n}\n", null, true, null);
-	
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] { "B", "B", "B", "B" }, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1", "Test1", "Test1", "Test1" }, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends B {\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a) {\n");
-		buf.append("        super(a, boo, fooString, buf, a);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param c\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param c\n");
-		buf.append("     * @param d\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c, d);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param c\n");
-		buf.append("     * @param d\n");
-		buf.append("     * @param secondString\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c, d, secondString);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-		compareSource(buf.toString(), testClass.getSource());
-	}
-	
-	/*
-	 * basic test: test with 5 constructors to override. Class C extends B extends Class A.
-	 */
-	public void testFiveConstructorsToOverrideWithTwoLevelsOfInheritance() throws Exception {
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cuA= fPackage.getCompilationUnit("A.java");
-		fClassA= cuA.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		fClassA.createMethod("public A(int a) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf) {super();}\n", null, true, null);
-
-		ICompilationUnit cuB= fPackage.getCompilationUnit("B.java");
-		fClassB= cuB.createType("public class B extends A{\n}\n", null, true, null);		
-		fClassB.createMethod("public B(int a, boolean boo, String fooString, StringBuffer buf, char a) {super();}\n", null, true, null);
-		fClassB.createMethod("public B(int a, boolean boo, String fooString, StringBuffer buf, char a, double c) {super();}\n", null, true, null);
-		fClassB.createMethod("public B(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d) {super();}\n", null, true, null);
-		fClassB.createMethod("public B(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString) {super();}\n", null, true, null);
-
-		ICompilationUnit cuC= fPackage.getCompilationUnit("C.java");
-		fClassC= cuC.createType("public class C extends B{\n}\n", null, true, null);		
-		fClassC.createMethod("public C(int a, boolean boo, String fooString, StringBuffer buf, char a) {super();}\n", null, true, null);
-		fClassC.createMethod("public C(int a, boolean boo, String fooString, StringBuffer buf, char a, double c) {super();}\n", null, true, null);
-		fClassC.createMethod("public C(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d) {super();}\n", null, true, null);
-		fClassC.createMethod("public C(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString) {super();}\n", null, true, null);
-		fClassC.createMethod("public C(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString, int xxx) {super();}\n", null, true, null);
-		
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends C {\n}\n", null, true, null);
-	
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] { "C", "C", "C", "C", "C" }, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1", "Test1", "Test1", "Test1", "Test1" }, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends C {\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a) {\n");
-		buf.append("        super(a, boo, fooString, buf, a);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param c\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param c\n");
-		buf.append("     * @param d\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c, d);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param c\n");
-		buf.append("     * @param d\n");
-		buf.append("     * @param secondString\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c, d, secondString);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param c\n");
-		buf.append("     * @param d\n");
-		buf.append("     * @param secondString\n");
-		buf.append("     * @param xxx\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf, char a, double c, float d, String secondString, int xxx) {\n");
-		buf.append("        super(a, boo, fooString, buf, a, c, d, secondString, xxx);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}
-
-	/*
-	 * nothing found with default constructor
-	 */
-	public void testNoConstructorsToOverrideWithOneExistingConstructors() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cuA= fPackage.getCompilationUnit("A.java");
-		fClassA= cuA.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-	
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-		testClass.createMethod("public Test1() {\nsuper();}\n", null, true, null);
-
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] {}, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1"}, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("public Test1() {\n");
-		buf.append("super();}\n");
-		buf.append("}\n");
-
-		
-		compareSource(buf.toString(), testClass.getSource());
-	}
-
-
-	/*
-	 * nothing found with 3 constructors
-	 */
-	public void testNoConstructorsToOverrideWithThreeExistingConstructors() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cuA= fPackage.getCompilationUnit("A.java");
-		fClassA= cuA.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		fClassA.createMethod("public A(int a) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-		testClass.createMethod("public Test1() {\nsuper();}\n", null, true, null);
-		testClass.createMethod("public Test1(int a) {super();}\n", null, true, null);
-		testClass.createMethod("public Test1(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] {}, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] existingMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1", "Test1", "Test1"}, existingMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("public Test1() {\n");
-		buf.append("super();}\n");
-		buf.append("public Test1(int a) {super();}\n");
-		buf.append("public Test1(int a, boolean boo, String fooString) {super();}\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}
-
-	/*
-	 * found 2 with 5 constructors, 3 already overriden
-	 */
-	public void testTwoConstructorsToOverrideWithThreeExistingConstructors() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cuA= fPackage.getCompilationUnit("A.java");
-		fClassA= cuA.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		fClassA.createMethod("public A(int a) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, int bologna) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf) {super();}\n", null, true, null);
-
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-		testClass.createMethod("public Test1(int a, boolean boo, String fooString, StringBuffer buf) {\nsuper();}\n", null, true, null);
-		testClass.createMethod("public Test1(int a) {super();}\n", null, true, null);
-		testClass.createMethod("public Test1(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] {"A", "A"}, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		fSettings.createComments= false;
-		op.setOmitSuper(false);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1", "Test1", "Test1", "Test1", "Test1" }, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-
-		checkDefaultConstructorNoCommentWithSuper(createdMethods[3].getSource());
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("public Test1(int a, boolean boo, String fooString, StringBuffer buf) {\n");
-		buf.append("super();}\n");
-		buf.append("public Test1(int a) {super();}\n");
-		buf.append("public Test1(int a, boolean boo, String fooString) {super();}\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        super();\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, int bologna) {\n");
-		buf.append("        super(a, boo, fooString, bologna);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-
-
-
-		compareSource(buf.toString(), testClass.getSource());
-	}
-
-	/*
-	 * found 4 with 5 constructors, 1 already overriden
-	 */
-	public void testFourConstructorsToOverrideWithOneExistingConstructor() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cuA= fPackage.getCompilationUnit("A.java");
-		fClassA= cuA.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A() {\nsuper();}\n", null, true, null);
-		fClassA.createMethod("public A(int a) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, int bologna) {super();}\n", null, true, null);
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf) {super();}\n", null, true, null);
-
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-		testClass.createMethod("public Test1(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] {"A", "A", "A", "A"}, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		checkMethods(new String[] {"Test1", "Test1", "Test1", "Test1", "Test1" }, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("public Test1(int a, boolean boo, String fooString) {super();}\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * \n");
-		buf.append("     */\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a) {\n");
-		buf.append("        super(a);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param bologna\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, int bologna) {\n");
-		buf.append("        super(a, boo, fooString, bologna);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf) {\n");
-		buf.append("        super(a, boo, fooString, buf);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-
-		compareSource(buf.toString(), testClass.getSource());
-	}
-
-	/*
-	 * found one with constructor which isn't default or the same as existing
-	 */
-	public void testOneConstructorToOverrideNotDefault() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cuA= fPackage.getCompilationUnit("A.java");
-		fClassA= cuA.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A(int a, boolean boo, String fooString, StringBuffer buf) {super();}\n", null, true, null);
-
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-		testClass.createMethod("public Test1(int a, boolean boo, String fooString) {super();}\n", null, true, null);
-		
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] {"A"}, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		
-		checkMethods(new String[] {"Test1", "Test1"}, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class Test1 extends A {\n");
-		buf.append("public Test1(int a, boolean boo, String fooString) {super();}\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param boo\n");
-		buf.append("     * @param fooString\n");
-		buf.append("     * @param buf\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(int a, boolean boo, String fooString, StringBuffer buf) {\n");
-		buf.append("        super(a, boo, fooString, buf);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-
-
-		compareSource(buf.toString(), testClass.getSource());
-	}
-
-	/*
-	 * found one with constructor needs import statement
-	 */
-	public void testOneConstructorWithImportStatement() throws Exception {	
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util.bogus", true, null);
-		
-		ICompilationUnit cuA= fPackage.getCompilationUnit("A.java");
-		fClassA= cuA.createType("public class A {\n}\n", null, true, null);		
-		fClassA.createMethod("public A(java.util.Vector v, int a) {super();}\n", null, true, null);
-
-		ICompilationUnit cu2= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu2.createType("public class Test1 extends A {\n}\n", null, true, null);
-		
-		IMethod[] constructorMethods= StubUtility.getOverridableConstructors(testClass);
-		
-		checkMethods(new String[] {"A"}, constructorMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-		
-		AddUnimplementedConstructorsOperation op= new AddUnimplementedConstructorsOperation(testClass, fSettings, constructorMethods, true, null);
-		
-		op.setOmitSuper(true);
-		op.setVisbility(Modifier.PUBLIC);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] createdMethods= testClass.getMethods();
-		String fullSource= testClass.getCompilationUnit().getSource();
-		
-		checkMethods(new String[] {"Test1"}, createdMethods);	 //$NON-NLS-1$ //$NON-NLS-2$
-
-		StringBuffer buf= new StringBuffer();
-		buf.append("package ibm.util.bogus;\n");
-		buf.append("\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class Test1 extends A {\n");
-		buf.append("    /** Constructor Comment\n");
-		buf.append("     * @param v\n");
-		buf.append("     * @param a\n");
-		buf.append("     */\n");
-		buf.append("    public Test1(Vector v, int a) {\n");
-		buf.append("        super(v, a);\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		if (fOldFormatter) buf.append("\n");
-		buf.append("}\n");
-
-
-		compareSource(buf.toString(), fullSource);
-	}
-	
-	private void checkMethods(String[] expected, IMethod[] methods) {
-		int nMethods= methods.length;
-		int nExpected= expected.length;
-		assertTrue("" + nExpected + " methods expected, is " + nMethods, nMethods == nExpected);
-		for (int i= 0; i < nExpected; i++) {
-			String methName= expected[i];
-			assertTrue("method " + methName + " expected", nameContained(methName, methods));
-		}
-	}			
-		
-	private boolean nameContained(String methName, IJavaElement[] methods) {
-		for (int i= 0; i < methods.length; i++) {
-			if (methods[i].getElementName().equals(methName)) {
-				return true;
-			}
-		}
-		return false;
-	}			
-	
-	private void checkDefaultConstructorNoCommentNoSuper(String con) throws IOException {
-		StringBuffer buf= new StringBuffer();
-		buf.append("public Test1() {\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		compareSource(buf.toString(), con);
-	}
-	
-	private void checkDefaultConstructorWithCommentNoSuper(String con) throws IOException {
-		StringBuffer buf= new StringBuffer();
-		buf.append("/** Constructor Comment\n");
-		buf.append("     * \n");
-		buf.append("     */\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		compareSource(buf.toString(), con);
-	}
-	
-	private void checkDefaultConstructorNoCommentWithSuper(String con) throws IOException {
-		StringBuffer buf= new StringBuffer();
-		buf.append("public Test1() {\n");
-		buf.append("        super();\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		String constructor= buf.toString();
-		compareSource(constructor, con);
-	}
-	
-	private void checkDefaultConstructorWithCommentWithSuper(String con) throws IOException {
-		StringBuffer buf= new StringBuffer();
-		buf.append("/** Constructor Comment\n");
-		buf.append("     * \n");
-		buf.append("     */\n");
-		buf.append("    public Test1() {\n");
-		buf.append("        super();\n");
-		buf.append("        // TODO\n");
-		buf.append("    }\n");
-		String constructor= buf.toString();
-		compareSource(constructor, con);
-	}
-
-	private void compareSource(String expected, String actual) throws IOException {
-		assertEqualStringIgnoreDelim(actual, expected);
-	}
-	/*
-	private String writeSource(String str) {
-		StringBuffer buf= new StringBuffer();
-		buf.append("\t\tStringBuffer buf= new StringBuffer();\n");
-		
-		String[] lines= Strings.convertIntoLines(str);
-		for (int i= 0; i < lines.length; i++) {
-			buf.append("\t\tbuf.append(\"").append(lines[i]).append("\\n\");\n");
-		}
-		return buf.toString();
-	}*/
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddUnimplementedMethodsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddUnimplementedMethodsTest.java
deleted file mode 100644
index 6ada7db..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AddUnimplementedMethodsTest.java
+++ /dev/null
@@ -1,231 +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.jdt.ui.tests.core;
-
-import java.util.ArrayList;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.internal.corext.codemanipulation.AddUnimplementedMethodsOperation;
-import org.eclipse.jdt.internal.corext.codemanipulation.CodeGenerationSettings;
-import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility;
-import org.eclipse.jdt.internal.corext.util.JdtFlags;
-
-public class AddUnimplementedMethodsTest extends TestCase {
-	
-	private static final Class THIS= AddUnimplementedMethodsTest.class;
-	
-	private IJavaProject fJavaProject;
-	private IPackageFragment fPackage;
-	private IType fClassA, fInterfaceB, fClassC, fClassD, fInterfaceE;
-
-
-	public AddUnimplementedMethodsTest(String name) {
-		super(name);
-	}
-		
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new AddUnimplementedMethodsTest("test1"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-	
-	/**
-	 * Creates a new test Java project.
-	 */	
-	protected void setUp() throws Exception {
-		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar(fJavaProject));
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
-		fPackage= root.createPackageFragment("ibm.util", true, null);
-		
-		ICompilationUnit cu= fPackage.getCompilationUnit("A.java");
-		fClassA= cu.createType("public abstract class A {\n}\n", null, true, null);
-		fClassA.createMethod("public abstract void a();\n", null, true, null);
-		fClassA.createMethod("public abstract void b(java.util.Vector v);\n", null, true, null);
-		
-		cu= fPackage.getCompilationUnit("B.java");
-		fInterfaceB= cu.createType("public interface B {\n}\n", null, true, null);
-		fInterfaceB.createMethod("void c(java.util.Hashtable h);\n", null, true, null);
-		
-		cu= fPackage.getCompilationUnit("C.java");
-		fClassC= cu.createType("public abstract class C {\n}\n", null, true, null);
-		fClassC.createMethod("public void c(java.util.Hashtable h) {\n}\n", null, true, null);
-		fClassC.createMethod("public abstract java.util.Enumeration d(java.util.Hashtable h) {\n}\n", null, true, null);
-
-
-		cu= fPackage.getCompilationUnit("D.java");
-		fClassD= cu.createType("public abstract class D extends C {\n}\n", null, true, null);
-		fClassD.createMethod("public abstract void c(java.util.Hashtable h);\n", null, true, null);
-		
-		cu= fPackage.getCompilationUnit("E.java");
-		fInterfaceE= cu.createType("public interface E {\n}\n", null, true, null);
-		fInterfaceE.createMethod("void c(java.util.Hashtable h);\n", null, true, null);
-		fInterfaceE.createMethod("void e() throws java.util.NoSuchElementException;\n", null, true, null);	
-	}
-
-
-	/**
-	 * Removes the test java project.
-	 */
-	protected void tearDown () throws Exception {
-		JavaProjectHelper.delete(fJavaProject);
-		fJavaProject= null;
-		fPackage= null;
-		fClassA= null;
-		fInterfaceB= null;
-		fClassC= null;
-		fClassD= null;
-		fInterfaceE= null;
-	}
-	
-	private IMethod[] getSelected(IType type) throws JavaModelException {
-		IMethod[] inheritedMethods= StubUtility.getOverridableMethods(type, type.newSupertypeHierarchy(null), false);
-		
-		ArrayList toImplement= new ArrayList();
-		for (int i= 0; i < inheritedMethods.length; i++) {
-			IMethod curr= inheritedMethods[i];
-			if (JdtFlags.isAbstract(curr)) {
-				toImplement.add(curr);
-			}
-		}
-		return (IMethod[]) toImplement.toArray(new IMethod[toImplement.size()]);
-	}
-	
-				
-	/*
-	 * basic test: extend an abstract class and an interface
-	 */
-	public void test1() throws Exception {	
-		ICompilationUnit cu= fPackage.getCompilationUnit("Test1.java");
-		IType testClass= cu.createType("public class Test1 extends A implements B {\n}\n", null, true, null);
-	
-		AddUnimplementedMethodsOperation op= new AddUnimplementedMethodsOperation(testClass, new CodeGenerationSettings(), getSelected(testClass), true, null);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] methods= testClass.getMethods();
-		checkMethods(new String[] { "a", "b", "c" }, methods);
-		
-		IImportDeclaration[] imports= cu.getImports();
-		checkImports(new String[] { "java.util.Hashtable", "java.util.Vector" }, imports);	
-	}	
-	
-	/*
-	 * method c() of interface B is already implemented by class C
-	 */
-	public void test2() throws Exception {
-			
-		ICompilationUnit cu= fPackage.getCompilationUnit("Test2.java");
-		IType testClass= cu.createType("public class Test2 extends C implements B {\n}\n", null, true, null);
-		
-		AddUnimplementedMethodsOperation op= new AddUnimplementedMethodsOperation(testClass, new CodeGenerationSettings(), getSelected(testClass), true, null);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] methods= testClass.getMethods();
-		checkMethods(new String[] { "d" }, methods);
-		
-		IImportDeclaration[] imports= cu.getImports();
-		checkImports(new String[] { "java.util.Enumeration", "java.util.Hashtable" }, imports);
-	}	
-
-
-	/*
-	 * method c() is implemented in C but made abstract again in class D
-	 */
-	public void test3() throws Exception {
-		ICompilationUnit cu= fPackage.getCompilationUnit("Test3.java");
-		IType testClass= cu.createType("public class Test3 extends D {\n}\n", null, true, null);
-		
-		AddUnimplementedMethodsOperation op= new AddUnimplementedMethodsOperation(testClass, new CodeGenerationSettings(), getSelected(testClass), true, null);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] methods= testClass.getMethods();
-		checkMethods(new String[] { "c", "d" }, methods);
-		
-		IImportDeclaration[] imports= cu.getImports();
-		checkImports(new String[] { "java.util.Hashtable", "java.util.Enumeration" }, imports);
-		
-	}
-	
-	/*
-	 * method c() defined in both interfaces B and E
-	 */
-	public void test4() throws Exception {
-		ICompilationUnit cu= fPackage.getCompilationUnit("Test4.java");
-		IType testClass= cu.createType("public class Test4 implements B, E {\n}\n", null, true, null);
-		
-		AddUnimplementedMethodsOperation op= new AddUnimplementedMethodsOperation(testClass, new CodeGenerationSettings(), getSelected(testClass), true, null);
-		op.run(new NullProgressMonitor());
-		
-		IMethod[] methods= testClass.getMethods();
-		checkMethods(new String[] { "c", "e" }, methods);
-		
-		IImportDeclaration[] imports= cu.getImports();
-		checkImports(new String[] { "java.util.Hashtable", "java.util.NoSuchElementException" }, imports);
-	}
-	
-	private void checkMethods(String[] expected, IMethod[] methods) {
-		int nMethods= methods.length;
-		int nExpected= expected.length;
-		assertTrue("" + nExpected + " methods expected, is " + nMethods, nMethods == nExpected);
-		for (int i= 0; i < nExpected; i++) {
-			String methName= expected[i];
-			assertTrue("method " + methName + " expected", nameContained(methName, methods));
-		}
-	}			
-	
-	private void checkImports(String[] expected, IImportDeclaration[] imports) {
-		int nImports= imports.length;
-		int nExpected= expected.length;
-		assertTrue("" + nExpected + " imports expected, is " + nImports, nImports == nExpected);
-		for (int i= 0; i < nExpected; i++) {
-			String impName= expected[i];
-			assertTrue("import " + impName + " expected", nameContained(impName, imports));
-		}
-	}
-
-
-	private boolean nameContained(String methName, IJavaElement[] methods) {
-		for (int i= 0; i < methods.length; i++) {
-			if (methods[i].getElementName().equals(methName)) {
-				return true;
-			}
-		}
-		return false;
-	}	
-
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AllTypesCacheTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AllTypesCacheTest.java
deleted file mode 100644
index 35e6336..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AllTypesCacheTest.java
+++ /dev/null
@@ -1,321 +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.jdt.ui.tests.core;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jface.text.IDocument;
-
-import org.eclipse.ui.IEditorPart;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.ui.JavaUI;
-
-import org.eclipse.jdt.internal.corext.util.AllTypesCache;
-import org.eclipse.jdt.internal.corext.util.TypeInfo;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-
-
-public class AllTypesCacheTest extends TestCase {
-	
-	private static final Class THIS= AllTypesCacheTest.class;
-	
-	private IJavaProject fJProject1;
-	private IJavaProject fJProject2;
-	
-	private IPackageFragmentRoot fLibrary;
-	private IPackageFragmentRoot fSourceFolder;
-
-	private boolean fWasAutobuild;
-	
-	public AllTypesCacheTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (false) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new AllTypesCacheTest("testClasspathChange"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-
-	protected void setUp() throws Exception {
-		fWasAutobuild= JavaProjectHelper.setAutoBuilding(false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		File lib= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.MYLIB);
-		assertTrue("lib does not exist",  lib != null && lib.exists());
-		fLibrary= JavaProjectHelper.addLibrary(fJProject1, new Path(lib.getPath())); // add library to proj1
-		
-		
-		fJProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin");
-		assertNotNull("jre is null", JavaProjectHelper.addRTJar(fJProject2));
-		
-		// add Junit source to project 2
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("Junit source", junitSrcArchive != null && junitSrcArchive.exists());
-
-		fSourceFolder= JavaProjectHelper.addSourceContainerWithImport(fJProject2, "src", junitSrcArchive);
-		
-	}
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-		JavaProjectHelper.delete(fJProject2);		
-		JavaProjectHelper.setAutoBuilding(fWasAutobuild);
-	}
-
-	public void testDifferentScopes() throws Exception {
-		IJavaSearchScope workspaceScope= SearchEngine.createWorkspaceScope();
-		IJavaSearchScope proj1Scope= SearchEngine.createJavaSearchScope(new IJavaElement[] { fJProject1 });
-		IJavaSearchScope proj2Scope= SearchEngine.createJavaSearchScope(new IJavaElement[] { fJProject2 });
-		
-		ArrayList res1= new ArrayList();
-		
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-		assertTrue("542 types in workspace expected, is " + res1.size(), res1.size() == 542);
-		
-		int nFlushes= AllTypesCache.getNumberOfCacheFlushes();
-		
-		res1.clear();		
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.INTERFACE, null, res1);
-		assertTrue("73 interfaces in workspace expected, is " + res1.size(), res1.size() == 73);
-		
-		assertTrue("unnecessary flush of cache", AllTypesCache.getNumberOfCacheFlushes() == nFlushes);	
-		
-		res1.clear();
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.CLASS, null, res1);
-		assertTrue("469 classes in workspace expected, is " + res1.size(), res1.size() == 469);
-		
-		assertTrue("unnecessary flush of cache", AllTypesCache.getNumberOfCacheFlushes() == nFlushes);
-		
-		res1.clear();
-		AllTypesCache.getTypes(proj1Scope, IJavaSearchConstants.TYPE, null, res1);
-		assertTrue("471 types in proj1 expected, is " + res1.size(), res1.size() == 471);
-		
-		assertTrue("unnecessary flush of cache", AllTypesCache.getNumberOfCacheFlushes() == nFlushes);
-		
-		res1.clear();		
-		AllTypesCache.getTypes(proj1Scope, IJavaSearchConstants.INTERFACE, null, res1);
-		assertTrue("65 interfaces in proj1 expected, is " + res1.size(), res1.size() == 65);
-		
-		assertTrue("unnecessary flush of cache", AllTypesCache.getNumberOfCacheFlushes() == nFlushes);
-		
-		res1.clear();
-		AllTypesCache.getTypes(proj1Scope, IJavaSearchConstants.CLASS, null, res1);
-		assertTrue("406 classes in proj1 expected, is " + res1.size(), res1.size() == 406);
-		
-		assertTrue("unnecessary flush of cache", AllTypesCache.getNumberOfCacheFlushes() == nFlushes);
-		
-		res1.clear();
-		AllTypesCache.getTypes(proj2Scope, IJavaSearchConstants.TYPE, null, res1);
-		assertTrue("539 types in proj2 expected, is " + res1.size(), res1.size() == 539);
-		
-		assertTrue("unnecessary flush of cache", AllTypesCache.getNumberOfCacheFlushes() == nFlushes);
-		
-		res1.clear();		
-		AllTypesCache.getTypes(proj2Scope, IJavaSearchConstants.INTERFACE, null, res1);
-		assertTrue("73 interfaces in proj2 expected, is " + res1.size(), res1.size() == 73);
-		
-		assertTrue("unnecessary flush of cache", AllTypesCache.getNumberOfCacheFlushes() == nFlushes);
-		
-		res1.clear();
-		AllTypesCache.getTypes(proj2Scope, IJavaSearchConstants.CLASS, null, res1);
-		assertTrue("466 classes in proj2 expected, is " + res1.size(), res1.size() == 466);
-		
-		assertTrue("unnecessary flush of cache", AllTypesCache.getNumberOfCacheFlushes() == nFlushes);
-	}
-	
-	public void testClasspathChange() throws Exception {	
-		IJavaSearchScope workspaceScope= SearchEngine.createWorkspaceScope();
-		
-		ArrayList res1= new ArrayList();
-		
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-		assertNotNull("mylib.Foo not found", findTypeRef(res1, "mylib.Foo"));
-		assertTrue("542 types expected, is " + res1.size(), res1.size() == 542);
-		
-		int nFlushes= AllTypesCache.getNumberOfCacheFlushes();
-		
-		JavaProjectHelper.removeFromClasspath(fJProject1, fLibrary.getPath());	
-		assertTrue("cache not flushed", nFlushes != AllTypesCache.getNumberOfCacheFlushes());
-		
-		res1.clear();
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-		assertNull("mylib.Foo still found", findTypeRef(res1, "mylib.Foo"));
-		assertTrue("539 types in workspace expected, is " + res1.size(), res1.size() == 539);
-	}
-	
-	public void testNewElementCreation() throws Exception {
-		IJavaSearchScope workspaceScope= SearchEngine.createWorkspaceScope();
-	
-		ArrayList res1= new ArrayList();
-		
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-		assertTrue("542 types expected, is " + res1.size(), res1.size() == 542);
-		
-		// add type
-		int nFlushes= AllTypesCache.getNumberOfCacheFlushes();
-		IPackageFragment pack= fSourceFolder.getPackageFragment("");
-		ICompilationUnit newCU= pack.getCompilationUnit("A.java");
-		IType type= newCU.createType("public class A {\n}\n", null, true, null);
-		assertTrue("cache not flushed after adding type", nFlushes != AllTypesCache.getNumberOfCacheFlushes());		
-		res1.clear();
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-		assertNotNull("A not found", findTypeRef(res1, "A"));
-		assertTrue("543 types in workspace expected, is " + res1.size(), res1.size() == 543);
-		
-		
-		// create a field: should not flush cache
-		nFlushes= AllTypesCache.getNumberOfCacheFlushes();
-		type.createField("public int fCount;", null, true, null);
-		assertTrue("cache was flushed", nFlushes == AllTypesCache.getNumberOfCacheFlushes());
-		res1.clear();
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);		
-		assertTrue("still 543 types in workspace expected, is " + res1.size(), res1.size() == 543);
-		
-
-		// create an inner type: should flush cache
-		nFlushes= AllTypesCache.getNumberOfCacheFlushes();
-		type.createType("public class AInner {}", null, true, null);
-		res1.clear();
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);		
-		assertTrue("cache not flushed after inner type creation", nFlushes != AllTypesCache.getNumberOfCacheFlushes());
-		assertNotNull("AInner not found", findTypeRef(res1, "A.AInner"));
-		assertTrue("still 544 types in workspace expected, is " + res1.size(), res1.size() == 544);
-	}
-	
-	public void testWorkingCopies() throws Exception {
-		if (!JavaPlugin.USE_WORKING_COPY_OWNERS) {
-			return;
-		}
-		// change a type in the editor and save
-		
-		IJavaSearchScope workspaceScope= SearchEngine.createWorkspaceScope();
-		
-		ArrayList res1= new ArrayList();
-		
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-		TypeInfo ref= findTypeRef(res1, "junit.framework.TestCase");
-		assertNotNull("TestCase not found", ref);
-		assertTrue("542 types expected, is " + res1.size(), res1.size() == 542);
-		
-		int nFlushes= AllTypesCache.getNumberOfCacheFlushes();
-		
-		IType type= fJProject2.findType("junit.framework.TestCase");
-		assertNotNull("TestCase not found", type);
-		
-		IEditorPart part= EditorUtility.openInEditor(type);
-		try {
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			ISourceRange range= type.getNameRange();
-			document.replace(range.getOffset(), range.getLength(), "A");
-			
-			part.doSave(null);
-			
-			res1.clear();
-			AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-			assertNotNull("A not found", findTypeRef(res1, "junit.framework.A"));
-			TypeInfo ref2= findTypeRef(res1, "junit.framework.TestCase");
-			assertNull("TestCase still found", ref2);
-			
-			assertTrue("542 types in workspace expected, is " + res1.size(), res1.size() == 542);
-			
-			assertTrue("cache not flushed", nFlushes != AllTypesCache.getNumberOfCacheFlushes());
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-	
-	}
-	
-	public void testWorkingCopies2() throws Exception {
-		if (!JavaPlugin.USE_WORKING_COPY_OWNERS) {
-			return;
-		}
-		
-		// change a type in the editor and do not save
-		
-		IJavaSearchScope workspaceScope= SearchEngine.createWorkspaceScope();
-		
-		ArrayList res1= new ArrayList();
-		
-		AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-		assertNotNull("TestCase not found", findTypeRef(res1, "junit.framework.TestCase"));
-		assertTrue("542 types expected, is " + res1.size(), res1.size() == 542);
-		
-		int nFlushes= AllTypesCache.getNumberOfCacheFlushes();
-		
-		IType type= fJProject2.findType("junit.framework.TestCase");
-		assertNotNull("TestCase not found", type);
-		
-		IEditorPart part= EditorUtility.openInEditor(type);
-		try {
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			ISourceRange range= type.getNameRange();
-			document.replace(range.getOffset(), range.getLength(), "A");
-			
-			res1.clear();
-			AllTypesCache.getTypes(workspaceScope, IJavaSearchConstants.TYPE, null, res1);
-			assertNotNull("A not found", findTypeRef(res1, "junit.framework.A"));
-			assertNull("TestCase still found", findTypeRef(res1, "junit.framework.TestCase"));
-			
-			assertTrue("542 types in workspace expected, is " + res1.size(), res1.size() == 542);
-			
-			assertTrue("cache not flushed", nFlushes != AllTypesCache.getNumberOfCacheFlushes());
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-	
-	}
-	
-	private TypeInfo findTypeRef(List refs, String fullname) {
-		for (int i= 0; i <refs.size(); i++) {
-			TypeInfo curr= (TypeInfo) refs.get(i);
-			if (fullname.equals(curr.getFullyQualifiedName())) {
-				return curr;
-			}
-		}
-		return null;
-	}
-		
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingsNameTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingsNameTest.java
deleted file mode 100644
index a7c5e18..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingsNameTest.java
+++ /dev/null
@@ -1,222 +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.jdt.ui.tests.core;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.IVariableBinding;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-
-import org.eclipse.jdt.internal.corext.dom.Bindings;
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-/**
-  */
-public class BindingsNameTest extends TestCase {
-
-	private static final Class THIS= BindingsNameTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-	private ICompilationUnit fCompilationUnit;
-	
-	private String fComplianceLevel;
-
-	public BindingsNameTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new BindingsNameTest("testFullyQualifiedNames"));
-			return suite;
-		}
-	}
-	protected void setUp() throws Exception {
-		Hashtable  options= JavaCore.getOptions();
-		fComplianceLevel= (String)options.get(JavaCore.COMPILER_COMPLIANCE);
-		options.put(JavaCore.COMPILER_COMPLIANCE, "1.3");
-		JavaCore.setOptions(options);
-		
-		
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		assertTrue("rt not found", JavaProjectHelper.addRTJar(fJProject1) != null);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack0= fSourceFolder.createPackageFragment("", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class X {\n");
-		buf.append("}\n");
-		pack0.createCompilationUnit("X.java", buf.toString(), false, null);		
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("import X;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public class Inner {\n");
-		buf.append("        public class InnerInner {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("    public void goo(int i, int[] j, Object o, Object[] p, Inner.InnerInner x, Inner.InnerInner[][] y, X a, X[][][] b) {\n");
-		buf.append("    }\n");			
-		buf.append("}\n");
-		fCompilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-	}
-
-
-	protected void tearDown() throws Exception {
-		Hashtable  options= JavaCore.getOptions();
-		options.put(JavaCore.COMPILER_COMPLIANCE, fComplianceLevel);
-		JavaCore.setOptions(options);
-		
-		JavaProjectHelper.delete(fJProject1);
-	}
-	
-	public void testGetFullyQualifiedName() throws Exception {
-		CompilationUnit astRoot= AST.parseCompilationUnit(fCompilationUnit, true);
-		IProblem[] problems= astRoot.getProblems();
-		assertTrue(problems.length == 0);
-		
-		TypeDeclaration typeDeclaration= (TypeDeclaration) astRoot.types().get(0);
-		MethodDeclaration methodDeclaration= typeDeclaration.getMethods()[0];
-		
-		List params= methodDeclaration.parameters();
-		String[] fullNames= new String[params.size()];
-		
-		for (int i= 0; i < params.size(); i++) {
-			SingleVariableDeclaration elem= (SingleVariableDeclaration) params.get(i);
-			IVariableBinding varBinding= elem.resolveBinding();
-			fullNames[i]= Bindings.getFullyQualifiedName(varBinding.getType());
-		}
-		
-		assertEquals("int", fullNames[0]);
-		assertEquals("int[]", fullNames[1]);
-		assertEquals("java.lang.Object", fullNames[2]);
-		assertEquals("java.lang.Object[]", fullNames[3]);
-		assertEquals("test1.ae.E.Inner.InnerInner", fullNames[4]);
-		assertEquals("test1.ae.E.Inner.InnerInner[][]", fullNames[5]);
-		assertEquals("X", fullNames[6]);
-		assertEquals("X[][][]", fullNames[7]);		
-	}
-	
-	public void testGetTypeQualifiedName() throws Exception {
-		CompilationUnit astRoot= AST.parseCompilationUnit(fCompilationUnit, true);
-		IProblem[] problems= astRoot.getProblems();
-		assertTrue(problems.length == 0);
-		
-		TypeDeclaration typeDeclaration= (TypeDeclaration) astRoot.types().get(0);
-		MethodDeclaration methodDeclaration= typeDeclaration.getMethods()[0];
-		
-		List params= methodDeclaration.parameters();
-		String[] fullNames= new String[params.size()];
-		
-		for (int i= 0; i < params.size(); i++) {
-			SingleVariableDeclaration elem= (SingleVariableDeclaration) params.get(i);
-			IVariableBinding varBinding= elem.resolveBinding();
-			fullNames[i]= Bindings.getTypeQualifiedName(varBinding.getType());
-		}
-		
-		assertEquals("int", fullNames[0]);
-		assertEquals("int[]", fullNames[1]);
-		assertEquals("Object", fullNames[2]);
-		assertEquals("Object[]", fullNames[3]);
-		assertEquals("E.Inner.InnerInner", fullNames[4]);
-		assertEquals("E.Inner.InnerInner[][]", fullNames[5]);
-		assertEquals("X", fullNames[6]);
-		assertEquals("X[][][]", fullNames[7]);
-	}
-	
-	public void testGetAllNameComponents() throws Exception {
-		CompilationUnit astRoot= AST.parseCompilationUnit(fCompilationUnit, true);
-		IProblem[] problems= astRoot.getProblems();
-		assertTrue(problems.length == 0);
-		
-		TypeDeclaration typeDeclaration= (TypeDeclaration) astRoot.types().get(0);
-		MethodDeclaration methodDeclaration= typeDeclaration.getMethods()[0];
-		
-		List params= methodDeclaration.parameters();
-		String[][] fullNames= new String[params.size()][];
-		
-		for (int i= 0; i < params.size(); i++) {
-			SingleVariableDeclaration elem= (SingleVariableDeclaration) params.get(i);
-			IVariableBinding varBinding= elem.resolveBinding();
-			fullNames[i]= Bindings.getAllNameComponents(varBinding.getType());
-		}
-		
-		assertEqualArray(new String[] { "int" }, fullNames[0]);
-		assertEqualArray(new String[] { "int[]" }, fullNames[1]);
-		assertEqualArray(new String[] { "java", "lang", "Object" }, fullNames[2]);
-		assertEqualArray(new String[] { "java", "lang", "Object[]" }, fullNames[3]);
-		assertEqualArray(new String[] { "test1", "ae", "E", "Inner", "InnerInner" }, fullNames[4]);
-		assertEqualArray(new String[] { "test1", "ae", "E", "Inner", "InnerInner[][]" }, fullNames[5]);
-		assertEqualArray(new String[] { "X" }, fullNames[6]);
-		assertEqualArray(new String[] { "X[][][]" }, fullNames[7]);		
-	}
-	
-	public void testGetNameComponents() throws Exception {
-		CompilationUnit astRoot= AST.parseCompilationUnit(fCompilationUnit, true);
-		IProblem[] problems= astRoot.getProblems();
-		assertTrue(problems.length == 0);
-		
-		TypeDeclaration typeDeclaration= (TypeDeclaration) astRoot.types().get(0);
-		MethodDeclaration methodDeclaration= typeDeclaration.getMethods()[0];
-		
-		List params= methodDeclaration.parameters();
-		String[][] fullNames= new String[params.size()][];
-		
-		for (int i= 0; i < params.size(); i++) {
-			SingleVariableDeclaration elem= (SingleVariableDeclaration) params.get(i);
-			IVariableBinding varBinding= elem.resolveBinding();
-			fullNames[i]= Bindings.getNameComponents(varBinding.getType());
-		}
-		
-		assertEqualArray(new String[] { "int" }, fullNames[0]);
-		assertEqualArray(new String[] { "int[]" }, fullNames[1]);
-		assertEqualArray(new String[] { "Object" }, fullNames[2]);
-		assertEqualArray(new String[] { "Object[]" }, fullNames[3]);
-		assertEqualArray(new String[] { "E", "Inner", "InnerInner" }, fullNames[4]);
-		assertEqualArray(new String[] { "E", "Inner", "InnerInner[][]" }, fullNames[5]);
-		assertEqualArray(new String[] { "X" }, fullNames[6]);
-		assertEqualArray(new String[] { "X[][][]" }, fullNames[7]);	
-	}
-	
-	private void assertEqualArray(Object[] elements, Object[] list) {
-		assertEquals("different length", list.length, elements.length);
-		for (int i= 0; i < list.length; i++) {
-			assertEquals(elements[i], list[i]);
-		}
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CallHierarchyTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CallHierarchyTest.java
deleted file mode 100644
index 91a6ace..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CallHierarchyTest.java
+++ /dev/null
@@ -1,427 +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:
- *   Jesper Kamstrup Linnet (eclipse@kamstrup-linnet.dk) - initial API and implementation
- *             (report 36180: Callers/Callees view)
- ******************************************************************************/
-package org.eclipse.jdt.ui.tests.core;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jdt.core.IInitializer;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.internal.corext.callhierarchy.CallHierarchy;
-import org.eclipse.jdt.internal.corext.callhierarchy.MethodWrapper;
-
-import org.eclipse.jdt.ui.tests.callhierarchy.CallHierarchyTestHelper;
-
-public class CallHierarchyTest extends TestCase {
-    private static final String[] EMPTY= new String[0];
-    private static final Class THIS= CallHierarchyTest.class;
-
-    private CallHierarchyTestHelper helper;
-    
-    public CallHierarchyTest(String name) {
-        super(name);
-    }
-    
-	public static Test allTests() {
-		return new TestSuite(THIS);
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests(); 
-        } else {
-            TestSuite suite= new TestSuite();
-            suite.addTest(new CallHierarchyTest("test1"));
-
-            return suite;
-        }
-    }
-
-    protected void setUp() throws Exception {
-        helper= new CallHierarchyTestHelper();
-        helper.setUp();
-    }
-
-    protected void tearDown() throws Exception {
-        helper.tearDown();
-        helper= null;
-    }
-
-    public void testCallers() throws Exception {
-        helper.createSimpleClasses();
-
-        IMethod method= helper.getMethod1();
-        IMethod secondLevelMethod= helper.getMethod3();
-
-        Collection expectedMethods= new ArrayList();
-        expectedMethods.add(helper.getMethod2());
-        expectedMethods.add(secondLevelMethod);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCallerRoot(method);
-
-        MethodWrapper[] uncachedCalls= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethods, uncachedCalls);
-
-        MethodWrapper[] cachedCalls= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethods, cachedCalls);
-
-        MethodWrapper wrapper2= helper.findMethodWrapper(secondLevelMethod, cachedCalls);
-
-        Collection expectedSecondLevelMethods= new ArrayList();
-        expectedSecondLevelMethods.add(helper.getMethod4());
-        helper.assertCalls(expectedSecondLevelMethods, wrapper2.getCalls(new NullProgressMonitor()));
-    }
-
-    public void testCallersNoResults() throws Exception {
-        helper.createSimpleClasses();
-
-        IMethod method= helper.getMethod4();
-
-        Collection expectedMethods= new ArrayList();
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCallerRoot(method);
-
-        MethodWrapper[] uncachedCalls= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethods, uncachedCalls);
-
-        MethodWrapper[] cachedCalls= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethods, cachedCalls);
-    }
-
-    public void testCallees() throws Exception {
-        helper.createSimpleClasses();
-
-        IMethod method= helper.getMethod4();
-        IMethod secondLevelMethod= helper.getMethod3();
-
-        Collection expectedMethods= new ArrayList();
-        expectedMethods.add(secondLevelMethod);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(method);
-
-        MethodWrapper[] uncachedCalls= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethods, uncachedCalls);
-
-        MethodWrapper[] cachedCalls= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethods, cachedCalls);
-
-        MethodWrapper wrapper2= helper.findMethodWrapper(secondLevelMethod, cachedCalls);
-
-        Collection expectedMethodsTo3= new ArrayList();
-        expectedMethodsTo3.add(helper.getMethod1());
-        expectedMethodsTo3.add(helper.getMethod2());
-
-        helper.assertCalls(expectedMethodsTo3, wrapper2.getCalls(new NullProgressMonitor()));
-    }
-
-    public void testCalleesNoResults() throws Exception {
-        helper.createSimpleClasses();
-
-        IMethod method= helper.getMethod1();
-
-        Collection expectedMethods= new ArrayList();
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(method);
-
-        MethodWrapper[] uncachedCalls= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethods, uncachedCalls);
-
-        MethodWrapper[] cachedCalls= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethods, cachedCalls);
-    }
-
-    public void testRecursiveCallers() throws Exception {
-        helper.createSimpleClasses();
-
-        IMethod method1= helper.getRecursiveMethod1();
-        IMethod method2= helper.getRecursiveMethod2();
-
-        Collection expectedMethodsTo1= new ArrayList();
-        expectedMethodsTo1.add(method2);
-
-        Collection expectedMethodsTo2= new ArrayList();
-        expectedMethodsTo2.add(method1);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCallerRoot(method1);
-        MethodWrapper[] callsTo1= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callsTo1, false);
-
-        MethodWrapper wrapper2= helper.findMethodWrapper(method2, callsTo1);
-        assertFalse("Should be marked as recursive", wrapper2.isRecursive());
-
-        MethodWrapper[] callsTo2= wrapper2.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethodsTo2, callsTo2);
-
-        assertRecursive(callsTo2, true);
-
-        MethodWrapper method1Wrapper= helper.findMethodWrapper(method1, callsTo2);
-        callsTo1= method1Wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethodsTo1, callsTo1);
-
-        assertRecursive(callsTo1, true);
-    }
-
-    public void testRecursiveCallees() throws Exception {
-        helper.createSimpleClasses();
-
-        IMethod method1= helper.getRecursiveMethod1();
-        IMethod method2= helper.getRecursiveMethod2();
-
-        Collection expectedMethodsFrom1= new ArrayList();
-        expectedMethodsFrom1.add(method2);
-
-        Collection expectedMethodsFrom2= new ArrayList();
-        expectedMethodsFrom2.add(method1);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(method1);
-        MethodWrapper[] callsFrom1= wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethodsFrom1, callsFrom1);
-
-        MethodWrapper wrapper2= helper.findMethodWrapper(method2, callsFrom1);
-        assertRecursive(callsFrom1, false);
-
-        MethodWrapper[] callsFrom2= wrapper2.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethodsFrom2, callsFrom2);
-
-        assertRecursive(callsFrom2, true);
-        
-        MethodWrapper method1Wrapper= helper.findMethodWrapper(method1, callsFrom2);
-        callsFrom1= method1Wrapper.getCalls(new NullProgressMonitor());
-        helper.assertCalls(expectedMethodsFrom1, callsFrom1);
-
-        assertRecursive(callsFrom1, true);
-    }
-
-    /**
-     * Tests calls that origin from an inner class  
-     */
-    public void testInnerClassCallers() throws Exception {
-        helper.createInnerClass();
-        
-        IMethod someMethod= helper.getType1().getMethod("outerMethod1", EMPTY);
-
-        IMethod innerMethod1= helper.getType1().getType("Inner").getMethod("innerMethod1", EMPTY);
-        IMethod innerMethod2= helper.getType1().getType("Inner").getMethod("innerMethod2", EMPTY);
-
-        Collection expectedCallers= new ArrayList();
-        expectedCallers.add(innerMethod1);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCallerRoot(someMethod);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        helper.assertCalls(expectedCallers, callers);
-        
-        Collection expectedCallersSecondLevel= new ArrayList();
-        expectedCallersSecondLevel.add(innerMethod2);
-        MethodWrapper innerMethod1Wrapper= helper.findMethodWrapper(innerMethod1, callers);
-        helper.assertCalls(expectedCallersSecondLevel, innerMethod1Wrapper.getCalls(new NullProgressMonitor()));
-    }
-
-    /**
-     * Tests callees that enter an inner class  
-     */
-    public void testInnerClassCalleesEntering() throws Exception {
-        helper.createInnerClass();
-
-        IMethod someMethod= helper.getType1().getMethod("outerMethod2", EMPTY);
-
-        IMethod innerMethod1= helper.getType1().getType("Inner").getMethod("innerMethod1", EMPTY);
-        IMethod innerMethod2= helper.getType1().getType("Inner").getMethod("innerMethod2", EMPTY);
-
-        Collection expectedCallers= new ArrayList();
-        expectedCallers.add(innerMethod2);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(someMethod);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        helper.assertCalls(expectedCallers, callers);
-        
-        Collection expectedCallersSecondLevel= new ArrayList();
-        expectedCallersSecondLevel.add(innerMethod1);
-        MethodWrapper innerMethod2Wrapper= helper.findMethodWrapper(innerMethod2, callers);
-        helper.assertCalls(expectedCallersSecondLevel, innerMethod2Wrapper.getCalls(new NullProgressMonitor()));
-    }
-
-    /**
-     * Tests callees that exits an inner class  
-     */
-    public void testInnerClassCalleesExiting() throws Exception {
-        helper.createInnerClass();
-
-        IMethod someMethod= helper.getType1().getMethod("outerMethod1", EMPTY);
-
-        IMethod innerMethod1= helper.getType1().getType("Inner").getMethod("innerMethod1", EMPTY);
-        IMethod innerMethod2= helper.getType1().getType("Inner").getMethod("innerMethod2", EMPTY);
-
-        Collection expectedCallers= new ArrayList();
-        expectedCallers.add(innerMethod1);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(innerMethod2);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        helper.assertCalls(expectedCallers, callers);
-        
-        Collection expectedCallersSecondLevel= new ArrayList();
-        expectedCallersSecondLevel.add(someMethod);
-        MethodWrapper innerMethod1Wrapper= helper.findMethodWrapper(innerMethod1, callers);
-        helper.assertCalls(expectedCallersSecondLevel, innerMethod1Wrapper.getCalls(new NullProgressMonitor()));
-    }
-
-    /**
-     * Tests calls that origin from an inner class  
-     */
-    public void testAnonymousInnerClassCallers() throws Exception {
-        helper.createAnonymousInnerClass();
-        
-        IMethod someMethod= helper.getType1().getMethod("someMethod", EMPTY);
-
-        IMethod result= helper.getType1().getField("anonClass").getType("", 1).getMethod("anotherMethod", EMPTY);
-        Collection expectedCallers= new ArrayList();
-        expectedCallers.add(result);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCallerRoot(someMethod);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        helper.assertCalls(expectedCallers, callers);
-    }
-
-    /**
-     * Tests calls that origin from an inner class  
-     */
-    public void testAnonymousInnerClassOnInterfaceCallees() throws Exception {
-    	//regression test for bug 37290 call hierarchy: Searching for callees into anonymous inner classes fails 
-        helper.createAnonymousInnerClass();
-        
-        IMethod method= helper.getType2().getMethod("anonymousOnInterface", EMPTY);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(method);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        
-        assertEquals("Wrong number of callees", 1, callers.length);
-        IMember member= callers[0].getMember();
-        assertTrue("Wrong member type (expected an instanceof IType)", member instanceof IType);
-        assertEquals("Wrong member name", "Intf", member.getElementName());
-    }
-
-    /**
-     * Tests calls that origin from an inner class  
-     */
-    public void testAnonymousInnerClassOnClassCallees() throws Exception {
-		//regression test for bug 37290 call hierarchy: Searching for callees into anonymous inner classes fails 
-        helper.createAnonymousInnerClass();
-        
-        IMethod method= helper.getType2().getMethod("anonymousOnClass", EMPTY);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(method);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        
-        assertEquals("Wrong number of callees", 1, callers.length);
-        IMember member= callers[0].getMember();
-        assertTrue("Wrong member type (expected an instanceof IType)", member instanceof IType);
-        assertEquals("Wrong member name", "Clazz", member.getElementName());
-    }
-
-    /**
-     * Tests calls that origin from a static initializer block.
-     */
-    public void testInitializerCallers() throws Exception {
-        helper.createStaticInitializerClass();
-
-        IMethod someMethod= helper.getType1().getMethod("someMethod", EMPTY);
-
-        IInitializer initializer= helper.getType1().getInitializer(1);
-
-        Collection expectedCallers= new ArrayList();
-        expectedCallers.add(initializer);
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCallerRoot(someMethod);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        helper.assertCalls(expectedCallers, callers);
-    }
-
-    public void testImplicitConstructorCallers() throws Exception {
-        helper.createSimpleClasses();
-        
-        IMethod constructorA= helper.getType1().getMethod("A", EMPTY);
-
-        Collection expectedCallers= new ArrayList();
-        expectedCallers.add(helper.getType2());
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCallerRoot(constructorA);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        helper.assertCalls(expectedCallers, callers);
-    }
-    
-    public void testImplicitConstructorCallees() throws Exception {
-        helper.createImplicitConstructorClasses();
-        
-        IMethod constructorB= helper.getType2().getMethods()[0];
-
-        Collection expectedCallers= new ArrayList();
-        expectedCallers.add(helper.getType1());
-
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(constructorB);
-        MethodWrapper[] callers= wrapper.getCalls(new NullProgressMonitor());
-        assertRecursive(callers, false);
-        helper.assertCalls(expectedCallers, callers);
-    }
-
-    public void testLineNumberCallers() throws Exception {
-        helper.createSimpleClasses();
-        
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCallerRoot(helper.getMethod1());
-        MethodWrapper[] calls= wrapper.getCalls(new NullProgressMonitor());
-        MethodWrapper method2Wrapper= helper.findMethodWrapper(helper.getMethod2(), calls);
-        assertEquals("Wrong line number", 9, method2Wrapper.getMethodCall().getFirstCallLocation().getLineNumber());
-
-        wrapper= CallHierarchy.getDefault().getCallerRoot(helper.getRecursiveMethod2());
-        calls= wrapper.getCalls(new NullProgressMonitor());
-        MethodWrapper recursiveMethod1Wrapper= helper.findMethodWrapper(helper.getRecursiveMethod1(), calls);
-        assertEquals("Wrong line number", 12, recursiveMethod1Wrapper.getMethodCall().getFirstCallLocation().getLineNumber());
-    }
-        
-    public void testLineNumberCallees() throws Exception {
-        helper.createSimpleClasses();
-        
-        MethodWrapper wrapper= CallHierarchy.getDefault().getCalleeRoot(helper.getMethod2());
-        MethodWrapper[] calls= wrapper.getCalls(new NullProgressMonitor());
-        MethodWrapper method1Wrapper= helper.findMethodWrapper(helper.getMethod1(), calls);
-        assertEquals("Wrong line number", 9, method1Wrapper.getMethodCall().getFirstCallLocation().getLineNumber());
-        
-        wrapper= CallHierarchy.getDefault().getCalleeRoot(helper.getRecursiveMethod1());
-        calls= wrapper.getCalls(new NullProgressMonitor());
-        MethodWrapper recursiveMethod2Wrapper= helper.findMethodWrapper(helper.getRecursiveMethod2(), calls);
-        assertEquals("Wrong line number", 12, recursiveMethod2Wrapper.getMethodCall().getFirstCallLocation().getLineNumber());
-    }
-
-    private void assertRecursive(MethodWrapper[] callResults, boolean shouldBeRecursive) {
-        for (int i= 0; i < callResults.length; i++) {
-            assertEquals(
-                "Wrong recursive value: " + callResults[i].getName(),
-                shouldBeRecursive,
-                callResults[i].isRecursive());
-        }
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ClassPathDetectorTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ClassPathDetectorTest.java
deleted file mode 100644
index ae8d873..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ClassPathDetectorTest.java
+++ /dev/null
@@ -1,343 +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.jdt.ui.tests.core;
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-
-import org.eclipse.jdt.internal.ui.wizards.ClassPathDetector;
-
-/**
-  */
-public class ClassPathDetectorTest extends TestCase {
-
-	private static final Class THIS= ClassPathDetectorTest.class;
-	
-	private IJavaProject fJProject1;
-
-	private boolean fEnableAutoBuildAfterTesting;
-
-	public ClassPathDetectorTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ClassPathDetectorTest("testClassFolderConflictingWithOutput"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-
-		IWorkspace workspace= JavaTestPlugin.getWorkspace();
-		assertNotNull(workspace);
-
-		// disable auto-build
-		IWorkspaceDescription workspaceDesc= workspace.getDescription();
-		if (workspaceDesc.isAutoBuilding()) {
-			fEnableAutoBuildAfterTesting= true;
-			JavaProjectHelper.setAutoBuilding(false);
-		}
-		
-		IPreferenceStore store= PreferenceConstants.getPreferenceStore();
-		store.setValue(PreferenceConstants.SRCBIN_BINNAME, "bin");
-
-		fJProject1= null;
-	}
-
-	protected void tearDown() throws Exception {
-		if (fJProject1 != null) {
-			JavaProjectHelper.delete(fJProject1);
-		}
-
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);		
-	}
-	
-	private boolean hasSamePaths(IPath[] a, IPath[] b) {
-		if (a.length != b.length) {
-			return false;
-		}
-		for (int i= 0; i < a.length; i++) {
-			if (!a[i].equals(b[i])) {
-				return false;
-			}
-		}
-		return true;
-	}
-	
-
-	private IClasspathEntry findEntry(IClasspathEntry entry, IClasspathEntry[] entries) {
-		for (int i= 0; i < entries.length; i++) {
-			IClasspathEntry curr= entries[i];
-			if (curr.getPath().equals(entry.getPath()) && curr.getEntryKind() == entry.getEntryKind()) {
-				if (curr.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
-					if (hasSamePaths(curr.getExclusionPatterns(), entry.getExclusionPatterns())) {
-						return curr;
-					}
-				} else {
-					return curr;
-				}
-			}
-		}
-		return null;
-	}
-
-
-
-	private void assertSameClasspath(IClasspathEntry[] projectEntries, IClasspathEntry[] entries) throws Exception {
-		assertEquals("Number of classpath entries", projectEntries.length, entries.length);
-		
-		for (int i= 0; i < projectEntries.length; i++) {
-			IClasspathEntry curr= projectEntries[i];
-			assertTrue("entry not found: " + curr.getPath(), findEntry(curr, entries) != null);
-		}
-	}
-	
-	private void clearClasspath() throws Exception {
-		
-		// see 29306 
-		IClasspathEntry other= JavaCore.newSourceEntry(fJProject1.getPath());
-		fJProject1.setRawClasspath(new IClasspathEntry[] { other }, fJProject1.getPath().append("bin"), null);
-		
-		//fJProject1.setRawClasspath(new IClasspathEntry[0], projectOutput, null);		
-	}
-	
-	
-	
-	public void testSourceAndLibrary() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		
-		// source folder & internal JAR
-		
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);		
-		
-		File mylibJar= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.MYLIB);
-		assertTrue("lib not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addLibraryWithImport(fJProject1, new Path(mylibJar.getPath()), null, null);
-		
-		IClasspathEntry[] jreEntries= PreferenceConstants.getDefaultJRELibrary();
-		for (int i= 0; i < jreEntries.length; i++) {
-			JavaProjectHelper.addToClasspath(fJProject1, jreEntries[i]);
-		}
-		fJProject1.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
-		
-		IClasspathEntry[] projectEntries= fJProject1.getRawClasspath();
-		IPath projectOutput= fJProject1.getOutputLocation();
-		
-		clearClasspath();
-		
-		ClassPathDetector detector= new ClassPathDetector(fJProject1.getProject());
-		IPath outputLocation= detector.getOutputLocation();
-		IClasspathEntry[] entries= detector.getClasspath();
-		assertNotNull("No classpath detected", entries);
-		assertNotNull("No outputLocation detected", outputLocation);
-		
-		assertSameClasspath(projectEntries, entries);
-
-		assertTrue("Output folder", outputLocation.equals(projectOutput));
-	}
-
-	public void testTwoSourceFolders() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		// 2 source folders
-		
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src1", junitSrcArchive);
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJProject1, "src2");
-		IPackageFragment pack1= root.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		IClasspathEntry[] jreEntries= PreferenceConstants.getDefaultJRELibrary();
-		for (int i= 0; i < jreEntries.length; i++) {
-			JavaProjectHelper.addToClasspath(fJProject1, jreEntries[i]);
-		}
-		fJProject1.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
-		
-		IClasspathEntry[] projectEntries= fJProject1.getRawClasspath();
-		IPath projectOutput= fJProject1.getOutputLocation();
-
-		clearClasspath();
-		
-		ClassPathDetector detector= new ClassPathDetector(fJProject1.getProject());
-		IPath outputLocation= detector.getOutputLocation();
-		IClasspathEntry[] entries= detector.getClasspath();
-		assertNotNull("No classpath detected", entries);
-		assertNotNull("No outputLocation detected", outputLocation);
-		
-		assertSameClasspath(projectEntries, entries);
-		
-		assertTrue("Output folder", outputLocation.equals(projectOutput));
-	}
-	
-	public void testNestedSources() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		// 2 nested source folders
-		
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		IPath[] exclusionFilter= new IPath[] { new Path("src2/") };
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src1", junitSrcArchive, exclusionFilter);
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJProject1, "src1/src2");
-		IPackageFragment pack1= root.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		IClasspathEntry[] jreEntries= PreferenceConstants.getDefaultJRELibrary();
-		for (int i= 0; i < jreEntries.length; i++) {
-			JavaProjectHelper.addToClasspath(fJProject1, jreEntries[i]);
-		}
-		fJProject1.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
-		
-		IClasspathEntry[] projectEntries= fJProject1.getRawClasspath();
-		IPath projectOutput= fJProject1.getOutputLocation();
-
-		clearClasspath();
-
-		ClassPathDetector detector= new ClassPathDetector(fJProject1.getProject());
-		IPath outputLocation= detector.getOutputLocation();
-		IClasspathEntry[] entries= detector.getClasspath();
-		assertNotNull("No classpath detected", entries);
-		assertNotNull("No outputLocation detected", outputLocation);
-		
-		assertSameClasspath(projectEntries, entries);
-		
-		assertTrue("Output folder", outputLocation.equals(projectOutput));
-	}
-	
-	public void testSourceAndOutputOnProject() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "");
-	
-		// source folder & internal JAR
-	
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "", junitSrcArchive);		
-	
-		IClasspathEntry[] jreEntries= PreferenceConstants.getDefaultJRELibrary();
-		for (int i= 0; i < jreEntries.length; i++) {
-			JavaProjectHelper.addToClasspath(fJProject1, jreEntries[i]);
-		}
-		fJProject1.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
-	
-		IClasspathEntry[] projectEntries= fJProject1.getRawClasspath();
-		IPath projectOutput= fJProject1.getOutputLocation();
-	
-		clearClasspath();
-	
-		ClassPathDetector detector= new ClassPathDetector(fJProject1.getProject());
-		IPath outputLocation= detector.getOutputLocation();
-		IClasspathEntry[] entries= detector.getClasspath();
-		assertNotNull("No classpath detected", entries);
-		assertNotNull("No outputLocation detected", outputLocation);
-	
-		assertSameClasspath(projectEntries, entries);
-
-		assertTrue("Output folder", outputLocation.equals(projectOutput));
-	}
-	
-	public void testClassFolder() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		// class folder:
-		
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJProject1, "src1");
-		IPackageFragment pack1= root.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("E.java", buf.toString(), false, null);	
-		
-		File lib= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.MYLIB);
-		assertTrue("lib not found", lib != null && lib.exists());
-		
-		IPackageFragmentRoot cfroot= JavaProjectHelper.addClassFolderWithImport(fJProject1, "cf", null, null, lib);
-		
-		IClasspathEntry[] jreEntries= PreferenceConstants.getDefaultJRELibrary();
-		for (int i= 0; i < jreEntries.length; i++) {
-			JavaProjectHelper.addToClasspath(fJProject1, jreEntries[i]);
-		}
-		fJProject1.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
-		
-		JavaProjectHelper.removeFromClasspath(fJProject1, cfroot.getPath()); // classfolder should not be detected
-		
-		IClasspathEntry[] projectEntries= fJProject1.getRawClasspath();
-		IPath projectOutput= fJProject1.getOutputLocation();
-
-		clearClasspath();
-		
-		ClassPathDetector detector= new ClassPathDetector(fJProject1.getProject());
-		IPath outputLocation= detector.getOutputLocation();
-		IClasspathEntry[] entries= detector.getClasspath();
-		assertNotNull("No classpath detected", entries);
-		assertNotNull("No outputLocation detected", outputLocation);
-		
-		assertSameClasspath(projectEntries, entries); 
-		assertTrue("Output folder", outputLocation.equals(projectOutput));
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CodeCompletionTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CodeCompletionTest.java
deleted file mode 100644
index be932aa..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CodeCompletionTest.java
+++ /dev/null
@@ -1,410 +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.jdt.ui.tests.core;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.IDocument;
-
-import org.eclipse.ui.IEditorPart;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
-
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.PreferenceConstants;
-
-import org.eclipse.jdt.internal.corext.template.CodeTemplates;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposal;
-import org.eclipse.jdt.internal.ui.text.java.ResultCollector;
-
-public class CodeCompletionTest extends CoreTests {
-	
-	private static final Class THIS= CodeCompletionTest.class;
-	
-	private IJavaProject fJProject1;
-
-	public CodeCompletionTest(String name) {
-		super(name);
-	}
-	
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new CodeCompletionTest("test1"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-
-	protected void setUp() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		JavaProjectHelper.addRequiredProject(fJProject1, ProjectTestSetup.getProject());
-
-		Hashtable options= JavaCore.getDefaultOptions();  
-		options.put(DefaultCodeFormatterConstants.FORMATTER_NUMBER_OF_EMPTY_LINES_TO_PRESERVE, "1");
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);
-		
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, true);
-
-		CodeTemplates.getCodeTemplate(CodeTemplates.OVERRIDECOMMENT).setPattern("/* (non-Javadoc)\n * ${see_to_overridden}\n */");	
-		CodeTemplates.getCodeTemplate(CodeTemplates.METHODSTUB).setPattern("//TODO\n${body_statement}");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.delete(fJProject1);
-	}
-	
-	
-	public void testAnonymousTypeCompletion1() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        Runnable run= new Runnable(\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String contents= buf.toString();
-		
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
-
-		IEditorPart part= EditorUtility.openInEditor(cu);
-		try {
-			String str= "Runnable run= new Runnable(";
-	
-			int offset= contents.indexOf(str) + str.length();
-	
-			ResultCollector collector= new ResultCollector();
-			collector.reset(offset, cu.getJavaProject(), cu);
-			collector.setViewer(null);
-			collector.setReplacementLength(0);
-			collector.setPreventEating(true);
-			
-			cu.codeComplete(offset, collector);
-			
-			JavaCompletionProposal[] proposals= collector.getResults();
-			
-			assertNumberOf("proposals", proposals.length, 1);
-			
-			IDocument doc= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-
-			
-			proposals[0].apply(doc);
-	
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("public class A {\n");
-			buf.append("    public void foo() {\n");
-			buf.append("        Runnable run= new Runnable() {\n");
-			buf.append("            public void run() {\n");
-			buf.append("                //TODO\n");
-			buf.append("\n");
-			buf.append("            }\n");
-			buf.append("        }\n");		
-			buf.append("    }\n");
-			buf.append("}\n");
-			assertEqualString(doc.get(), buf.toString());
-		} finally {
-			part.getSite().getPage().closeAllEditors(false);
-		}
-	}
-	
-	public void testAnonymousTypeCompletion2() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        Runnable run= new Runnable();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String contents= buf.toString();
-		
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
-		
-		IEditorPart part= EditorUtility.openInEditor(cu);
-		try {
-			String str= "Runnable run= new Runnable(";
-	
-			int offset= contents.indexOf(str) + str.length();
-	
-			ResultCollector collector= new ResultCollector();
-			collector.reset(offset, cu.getJavaProject(), cu);
-			collector.setViewer(null);
-			collector.setReplacementLength(0);
-			collector.setPreventEating(true);
-			
-			cu.codeComplete(offset, collector);
-			
-			JavaCompletionProposal[] proposals= collector.getResults();
-			
-			assertNumberOf("proposals", proposals.length, 1);
-			
-			IDocument doc= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			
-			proposals[0].apply(doc);
-	
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("public class A {\n");
-			buf.append("    public void foo() {\n");
-			buf.append("        Runnable run= new Runnable() {\n");
-			buf.append("            public void run() {\n");
-			buf.append("                //TODO\n");
-			buf.append("\n");
-			buf.append("            }\n");
-			buf.append("        };\n");		
-			buf.append("    }\n");
-			buf.append("}\n");
-			assertEqualString(doc.get(), buf.toString());
-		} finally {
-			part.getSite().getPage().closeAllEditors(false);
-		}
-	}	
-
-
-	public void testMethodStubCompletion1() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.io.Writer;\n");
-		buf.append("\n");
-		buf.append("public class A extends Writer {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("    //here\n");
-		buf.append("}\n");
-		String contents= buf.toString();
-		
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
-
-		IEditorPart part= EditorUtility.openInEditor(cu);
-		try {
-			String str= "//here";
-
-			int offset= contents.indexOf(str);
-
-			ResultCollector collector= new ResultCollector();
-			collector.reset(offset, cu.getJavaProject(), cu);
-			collector.setViewer(null);
-			collector.setReplacementLength(0);
-			collector.setPreventEating(true);
-
-			cu.codeComplete(offset, collector);
-
-			JavaCompletionProposal[] proposals= collector.getResults();
-
-			JavaCompletionProposal toStringProposal= null;
-
-			for (int i= 0; i < proposals.length; i++) {
-				if (proposals[i].getDisplayString().startsWith("toString()")) {
-					toStringProposal= proposals[i];
-				}
-			}
-			assertNotNull("no proposal for toString()", toStringProposal);
-
-			IDocument doc= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-
-			toStringProposal.apply(doc);
-
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("\n");
-			buf.append("import java.io.Writer;\n");
-			buf.append("\n");
-			buf.append("public class A extends Writer {\n");
-			buf.append("    public void foo() {\n");
-			buf.append("    }\n");
-			buf.append("    /* (non-Javadoc)\n");
-			buf.append("     * @see java.lang.Object#toString()\n");
-			buf.append("     */\n");
-			buf.append("    public String toString() {\n");
-			buf.append("        //TODO\n");
-			buf.append("        return super.toString();\n");
-			buf.append("    }//here\n");
-			buf.append("}\n");
-			assertEqualString(doc.get(), buf.toString());
-			
-		} finally {
-			part.getSite().getPage().closeAllEditors(false);
-		}
-		
-	}
-	
-	public void testMethodStubCompletion2() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.io.Writer;\n");
-		buf.append("\n");
-		buf.append("public class A extends Writer {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("    //here\n");
-		buf.append("}\n");
-		String contents= buf.toString();
-		
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
-
-		IEditorPart part= EditorUtility.openInEditor(cu);
-		try {
-			String str= "//here";
-
-			int offset= contents.indexOf(str);
-
-			ResultCollector collector= new ResultCollector();
-			collector.reset(offset, cu.getJavaProject(), cu);
-			collector.setViewer(null);
-			collector.setReplacementLength(0);
-			collector.setPreventEating(true);
-
-			cu.codeComplete(offset, collector);
-
-			JavaCompletionProposal[] proposals= collector.getResults();
-
-			JavaCompletionProposal closeProposal= null;
-
-			for (int i= 0; i < proposals.length; i++) {
-				if (proposals[i].getDisplayString().startsWith("close()")) {
-					closeProposal= proposals[i];
-				}
-			}
-			assertNotNull("no proposal for close()", closeProposal);
-
-			IDocument doc= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-
-			closeProposal.apply(doc);
-
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("\n");
-			buf.append("import java.io.IOException;\n");
-			buf.append("import java.io.Writer;\n");
-			buf.append("\n");
-			buf.append("public class A extends Writer {\n");
-			buf.append("    public void foo() {\n");
-			buf.append("    }\n");
-			buf.append("    /* (non-Javadoc)\n");
-			buf.append("     * @see java.io.Writer#close()\n");
-			buf.append("     */\n");
-			buf.append("    public void close() throws IOException {\n");
-			buf.append("        //TODO\n");
-			buf.append("\n");
-			buf.append("    }//here\n");
-			buf.append("}\n");
-			assertEqualString(doc.get(), buf.toString()); 
-		} finally {
-			part.getSite().getPage().closeAllEditors(false);
-		}		
-	}
-	
-	public void testMethodStubCompletion3() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.io.BufferedWriter;\n");
-		buf.append("\n");
-		buf.append("public class A extends BufferedWriter {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("    //here\n");
-		buf.append("}\n");
-		String contents= buf.toString();
-		
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", contents, false, null);
-
-		IEditorPart part= EditorUtility.openInEditor(cu);
-		try {
-			String str= "//here";
-
-			int offset= contents.indexOf(str);
-
-			ResultCollector collector= new ResultCollector();
-			collector.reset(offset, cu.getJavaProject(), cu);
-			collector.setViewer(null);
-			collector.setReplacementLength(0);
-			collector.setPreventEating(true);
-
-			cu.codeComplete(offset, collector);
-
-			JavaCompletionProposal[] proposals= collector.getResults();
-
-			JavaCompletionProposal closeProposal= null;
-
-			for (int i= 0; i < proposals.length; i++) {
-				if (proposals[i].getDisplayString().startsWith("close()")) {
-					closeProposal= proposals[i];
-				}
-			}
-			assertNotNull("no proposal for close()", closeProposal);
-
-			IDocument doc= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			closeProposal.apply(doc);
-
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("\n");
-			buf.append("import java.io.BufferedWriter;\n");
-			buf.append("import java.io.IOException;\n");
-			buf.append("\n");
-			buf.append("public class A extends BufferedWriter {\n");
-			buf.append("    public void foo() {\n");
-			buf.append("    }\n");
-			buf.append("    /* (non-Javadoc)\n");
-			buf.append("     * @see java.io.BufferedWriter#close()\n");
-			buf.append("     */\n");
-			buf.append("    public void close() throws IOException {\n");
-			buf.append("        //TODO\n");
-			buf.append("        super.close();\n");
-			buf.append("    }//here\n");
-			buf.append("}\n");
-			assertEqualString(doc.get(), buf.toString()); 
-		} finally {
-			part.getSite().getPage().closeAllEditors(false);
-		}		
-	}	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CodeFormatterUtilTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CodeFormatterUtilTest.java
deleted file mode 100644
index f821695..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CodeFormatterUtilTest.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CoreTests.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CoreTests.java
deleted file mode 100644
index 6df5af6..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/CoreTests.java
+++ /dev/null
@@ -1,164 +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.jdt.ui.tests.core;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
-  */
-public class CoreTests extends TestCase {
-
-	public static Test suite() {
-		
-		TestSuite suite= new TestSuite();
-		suite.addTest(AddImportTest.allTests());
-		suite.addTest(AddUnimplementedMethodsTest.allTests());
-		suite.addTest(AddUnimplementedConstructorsTest.allTests());
-		suite.addTest(AllTypesCacheTest.allTests());
-		suite.addTest(BindingsNameTest.allTests());
-		suite.addTest(ClassPathDetectorTest.allTests());
-		suite.addTest(HierarchicalASTVisitorTest.allTests());
-		suite.addTest(ImportOrganizeTest.allTests());
-		suite.addTest(JavaModelUtilTest.allTests());
-		suite.addTest(NameProposerTest.allTests());
-		suite.addTest(TextEditTests.allTests());
-		suite.addTest(PrimaryWorkingCopyTest.allTests());
-		suite.addTest(TypeInfoTest.allTests());	
-		suite.addTest(CallHierarchyTest.allTests());
-		suite.addTest(ScopeAnalyzerTest.allTests());
-		suite.addTest(PartialASTTest.allTests());
-		suite.addTest(CodeCompletionTest.allTests());
-		suite.addTest(TypeRulesTest.allTests());
-		suite.addTest(JavaElementLabelsTest.allTests());
-		
-		
-		return new ProjectTestSetup(suite);
-	}
-
-	public CoreTests(String name) {
-		super(name);
-	}
-	
-	private static final int printRange= 6;
-
-	private static int getDiffPos(String str1, String str2) {
-		int len1= Math.min(str1.length(), str2.length());
-		
-		int diffPos= -1;
-		for (int i= 0; i < len1; i++) {
-			if (str1.charAt(i) != str2.charAt(i)) {
-				diffPos= i;
-				break;
-			}
-		}
-		if (diffPos == -1 && str1.length() != str2.length()) {
-			diffPos= len1;
-		}
-		return diffPos;
-	}
-
-	public static void assertEqualString(String current, String expected) {	
-		if (current == null || expected == null) {
-			if (current == expected) {
-				return;
-			}
-			if (current == null) {
-				assertTrue("Content not as expected: is 'null' expected: " + expected, false);
-			} else {
-				assertTrue("Content not as expected: expected 'null' is: " + current, false);
-			}
-			
-		}
-		
-		
-		int diffPos= getDiffPos(current, expected);
-		if (diffPos != -1) {
-			int diffAhead= Math.max(0, diffPos - printRange);
-			int diffAfter= Math.min(current.length(), diffPos + printRange);
-			
-			String diffStr= current.substring(diffAhead, diffPos) + '^' + current.substring(diffPos, diffAfter);
-			assertTrue("Content not as expected: is\n" + current + "\nDiffers at pos " + diffPos + ": " + diffStr + "\nexpected:\n" + expected, false);
-		}
-	}
-	
-	public static void assertEqualStringIgnoreDelim(String str1, String str2) throws IOException {
-		BufferedReader read1= new BufferedReader(new StringReader(str1));
-		BufferedReader read2= new BufferedReader(new StringReader(str2));
-		
-		int line= 1;
-		do {
-			String s1= read1.readLine();
-			String s2= read2.readLine();
-			
-			if (s1 == null || !s1.equals(s2)) {
-				if (s1 == null && s2 == null) {
-					return;
-				}
-				String diffStr= (s1 == null) ? s2 : s1;
-				assertTrue("Content not as expected: is\n" + str1 + "\nDiffers at line " + line + ": " + diffStr + "\nexpected:\n" + str2, false);
-			}
-			line++;
-		} while (true);
-	}	
-	
-	public static void assertEqualStringsIgnoreOrder(String[] str1, String[] str2) {
-		ArrayList list1= new ArrayList(Arrays.asList(str1));
-		ArrayList list2= new ArrayList(Arrays.asList(str2));
-		
-		for (int i= list1.size() - 1; i >= 0; i--) {
-			if (list2.remove(list1.get(i))) {
-				list1.remove(i);
-			}
-		}
-		
-		int n1= list1.size();
-		int n2= list2.size();
-		
-		if (n1 + n2 > 0) {
-			if (n1 == 1 && n2 == 1) {
-				assertEqualString((String) list1.get(0), (String) list2.get(0));
-			}
-			
-			StringBuffer buf= new StringBuffer();
-			buf.append("Content not as expected: Content is: \n");
-			for (int i= 0; i < n1; i++) {
-				String s1= (String) list1.get(i);
-				if (s1 != null) {
-					buf.append(s1);
-					buf.append("\n");
-				}
-			}
-			buf.append("Expected contents: \n");
-			for (int i= 0; i < n2; i++) {
-				String s2= (String) list2.get(i);
-				if (s2 != null) {
-					buf.append(s2);
-					buf.append("\n");
-				}
-			}
-			assertTrue(buf.toString(), false);
-		}				
-	}
-	
-	public static void assertNumberOf(String name, int is, int expected) {
-		assertTrue("Wrong number of " + name + ", is: " + is + ", expected: " + expected, is == expected);
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/HierarchicalASTVisitorTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/HierarchicalASTVisitorTest.java
deleted file mode 100644
index e48f5d6..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/HierarchicalASTVisitorTest.java
+++ /dev/null
@@ -1,361 +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.jdt.ui.tests.core;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.ASTVisitor;
-import org.eclipse.jdt.core.dom.BodyDeclaration;
-import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.Name;
-import org.eclipse.jdt.core.dom.Statement;
-import org.eclipse.jdt.core.dom.Type;
-import org.eclipse.jdt.core.dom.VariableDeclaration;
-
-import org.eclipse.jdt.internal.corext.Assert;
-import org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor;
-
-public class HierarchicalASTVisitorTest extends TestCase {
-	private static class TestHierarchicalASTVisitor extends HierarchicalASTVisitor {
-
-		//---- BEGIN <REGION TO BE UPDATED IN RESPONSE TO ASTNode HEIRARCHY CHANGES> ---------------------
-		/* ******************************************************************************
-		 * Whereas the other parts of this test should be relatively static,
-		 * this portion of the file must be maintained in response to
-		 * changes that occur in the ASTNode heirarchy (and, thus, the ASTVisitor).
-		 * Such changes would include addition or removal of node types to or from
-		 * the heirarchy, or changes in the superclass/subclass relationships
-		 * among node classes.  Such changes necessitate, also, changes in the
-		 * HierarchicalASTVisitor itself, whose structure and behaviour this test
-		 * verifies.
-		 * 
-		 * The changes that must be made to this file in response to such changes in
-		 * the ASTNode heirarchy are localized here and limited to maintenance of the
-		 * following set of visit(XX node) implementations and superVisit(XX node).
-		 * There should be one such pair for each non-leaf ASTNode descendant class,
-		 * including ASTNode itself.
-		 * 
-		 * *****************************************************************************/
-
-		/* Here, for each non-leaf ASTNode descendant class, the visit(XX) method
-		 * is overridden to call registerCall(XX.class), and a void superVisit
-		 * (XX node) method is provided, which simply calls super.visit(XX)
-		 */
-
-		public boolean visit(ASTNode node) {
-			registerCall(ASTNode.class);
-			return false;
-		}
-		public void superVisit(ASTNode node) {
-			super.visit(node);
-		}
-
-		public boolean visit(Expression node) {
-			registerCall(Expression.class);
-			return false;
-		}
-		public void superVisit(Expression node) {
-			super.visit(node);
-		}
-
-		public boolean visit(Name node) {
-			registerCall(Name.class);
-			return false;
-		}
-		public void superVisit(Name node) {
-			super.visit(node);
-		}
-
-		public boolean visit(BodyDeclaration node) {
-			registerCall(BodyDeclaration.class);
-			return false;
-		}
-		public void superVisit(BodyDeclaration node) {
-			super.visit(node);
-		}
-
-		public boolean visit(Type node) {
-			registerCall(Type.class);
-			return false;
-		}
-		public void superVisit(Type node) {
-			super.visit(node);
-		}
-
-		public boolean visit(Statement node) {
-			registerCall(Statement.class);
-			return false;
-		}
-		public void superVisit(Statement node) {
-			super.visit(node);
-		}
-
-		public boolean visit(VariableDeclaration node) {
-			registerCall(VariableDeclaration.class);
-			return false;
-		}
-		public void superVisit(VariableDeclaration node) {
-			super.visit(node);
-		}
-		//---- END <REGION TO BE UPDATED IN RESPONSE TO ASTNode HEIRARCHY CHANGES> ----------------------
-
-		/**
-		 * Verifies that the visit(XX) method in HierarchicalASTVisitor calls
-		 * visit(YY), where XX is the name of <code>clazz</code> and YY is the
-		 * name of the superclass of clazz.
-		 * 
-		 * <code>clazz</code> must be a <b>proper</b> descendant of ASTNode (<code>clazz</code> is not ASTNode).
-		 */
-		private static void checkMethodCallsSuperclassMethod(Class clazz, boolean isLeaf) {
-			Assert.isTrue(ASTNode.class.isAssignableFrom(clazz));
-			Assert.isTrue(!ASTNode.class.equals(clazz));
-
-			TestHierarchicalASTVisitor visitor= new TestHierarchicalASTVisitor();
-			visitor._checkMethodCallsSuperclassMethod(clazz, isLeaf);
-		}
-
-		/**
-		 * This class must have certain methods corresponding to the
-		 * ASTNode descendant class <code>clazz</code>.
-		 * This method reflectively verifies that they are present.
-		 */
-		private static boolean hasRequiredMethodsForNonLeaf(Class clazz) {
-			Assert.isTrue(ASTNode.class.isAssignableFrom(clazz));
-			try {
-				TestHierarchicalASTVisitor.class.getDeclaredMethod(getMethodNameFor(clazz), new Class[] { clazz });
-				TestHierarchicalASTVisitor.class.getDeclaredMethod("superVisit", new Class[] { clazz });
-			} catch (NoSuchMethodException e) {
-				return false;
-			}
-			return true;
-		}
-
-		private Class fNodeClassForCalledMethod= null;
-
-		private void _checkMethodCallsSuperclassMethod(Class clazz, boolean isLeaf) {
-			/* Invoke a method which will result in the execution of
-			 * HierarchicalASTVisitor's implementation of visit(XX), where 
-			 * XX is the name of clazz.
-			 * 
-			 * If clazz is a leaf, we can invoke visit(XX) directly.
-			 * Otherwise, we must invoke superVisit(XX), (in this class)
-			 * which calls super.visit(XX), since visit(XX) is overridden in
-			 * this class.
-			 * 
-			 * The parameter passed to visit(XX) or superVisit(XX)
-			 * is null.  If there ever was any requirement that the
-			 * parameter to visit(XX) methods, be non-null, we would simply have
-			 * to reflectively instantiate an appropriately typed node.
-			 */
-			try {
-				Method method= TestHierarchicalASTVisitor.class.getMethod(isLeaf ? getMethodNameFor(clazz) : "superVisit", new Class[] { clazz });
-				method.invoke(this, new Object[] { null });
-			} catch (NoSuchMethodException e) {
-				/* This should have already been discovered by
-				 * hasRequiredMethodsForNonLeaf(..)
-				 */
-				e.printStackTrace();
-				Assert.isTrue(false);
-			} catch (IllegalAccessException e) {
-				e.printStackTrace();
-				Assert.isTrue(false);
-			} catch (InvocationTargetException e) {
-				e.printStackTrace();
-				Assert.isTrue(false);
-			}
-
-			/*
-			 * Verify that the method invokation caused
-			 * a call to visit(YY), where YY is the name of the superclass of
-			 * clazz. (Also, verify that no other visit(ZZ) method was called).
-			 */
-			checkSuperclassMethodCalled(clazz, isLeaf);
-		}
-		private void checkSuperclassMethodCalled(Class clazz, boolean isLeaf) {
-			Assert.isNotNull(clazz.getSuperclass());
-			/*
-			 * This class' implementations of the visit(YY) methods (for non-
-			 * leaf YY) cause fNodeClassForCalledMethod to be set to YY.class.
-			 * Such an implementation will be the one executed when a visit(XX)
-			 * implementation in HierarchicalASTVisitor calls the visit(YY)
-			 * method corresponding to XX's superclass, YY. We check here that
-			 * fNodeClassForCalledMethod was set to the superclass of clazz.
-			 */
-			assertTrue(getSuperMethodNotCalledMessageFor(clazz, isLeaf), clazz.getSuperclass().equals(fNodeClassForCalledMethod));
-		}
-		private String getSuperMethodNotCalledMessageFor(Class clazz, boolean isLeaf) {
-			return getMethodSignatureFor(clazz, isLeaf) + " in HierarchicalASTVisitor should call " + getMethodSignatureFor(clazz.getSuperclass(), false) + ", the visitor method for its superclass.";
-		}
-
-		private void registerCall(Class nodeClassForMethod) {
-			assertNull("The invocation of a visit(XX) method in HierarchicalASTVisitor has caused more than one other visit(XX) method to be called.  Every visit(XX) method in HierarchicalASTVisitor, except visit(ASTNode), should simply call visit(YY), where YY is the superclass of XX.", fNodeClassForCalledMethod);
-			fNodeClassForCalledMethod= nodeClassForMethod;
-		}
-	}
-
-	private static final Class THIS_CLASS= HierarchicalASTVisitorTest.class;
-
-	private Set fLeaves;
-
-	public HierarchicalASTVisitorTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new TestSuite(THIS_CLASS);
-	}
-
-	public static Test suite() {
-		return new TestSuite(THIS_CLASS);
-	}
-
-	public void test() {
-		fLeaves= getLeafASTNodeDescendants();
-		Set allASTNodeDescendants= computeAllDescendantsFromLeaves(fLeaves.iterator(), ASTNode.class);
-
-		checkAllMethodsForHeirarchyExist(allASTNodeDescendants.iterator());
-		checkMethodsCallSuperclassMethod(allASTNodeDescendants.iterator());
-	}
-
-	private boolean isLeaf(Class clazz) {
-		return fLeaves.contains(clazz);
-	}
-
-	/**
-	 * For both HierarchicalASTVisitor and a subsequent part of this test to be correct,
-	 * HierarchicalASTVisitor and TestHierarchicalASTVisitor must declare certain methods,
-	 * each one corresponding to a class in the ASTNode heirarchy.  Specifically, 
-	 * HierarchicalASTVisitor must declare a method corresponding to each class in the heirarchy,
-	 * whereas TestHierarchicalASTVisitor must declare a pair of methods for each non-leaf
-	 * class in the ASTNode heirarchy.
-	 * 
-	 * This method verifies that these required methods exist, and suggests the updates
-	 * that are needed to properly maintain the set of methods.
-	 */
-	private void checkAllMethodsForHeirarchyExist(Iterator heirarchyClasses) {
-		while (heirarchyClasses.hasNext()) {
-			Class descendant= (Class) heirarchyClasses.next();
-			checkHeirarchicalASTVisitorMethodExistsFor(descendant);
-			if (!isLeaf(descendant))
-				assertTrue("This test must be updated, since TestHierarchicalASTVisitor, a class declared within this test class, is missing a method corresponding to non-leaf node class " + getSimpleName(descendant), TestHierarchicalASTVisitor.hasRequiredMethodsForNonLeaf(descendant));
-		}
-	}
-
-	/**
-	 * All visit(XX) implementations in HierarchicalASTVisitor, each
-	 * corresponding to a class XX, must call visit(YY), where YY is the
-	 * superclass of YY, unless XX is ASTNode. This method verifies this using
-	 * reflection and a contrived subclass of HierarchicalASTVisitor,
-	 * TestHierarchicalASTVisitor.
-	 */
-	private void checkMethodsCallSuperclassMethod(Iterator heirarchyClasses) {
-		while (heirarchyClasses.hasNext()) {
-			Class descendant= (Class) heirarchyClasses.next();
-			if (!ASTNode.class.equals(descendant))
-				TestHierarchicalASTVisitor.checkMethodCallsSuperclassMethod(descendant, isLeaf(descendant));
-		}
-	}
-
-	private void checkHeirarchicalASTVisitorMethodExistsFor(Class nodeClass) {
-		try {
-			Assert.isTrue(ASTNode.class.isAssignableFrom(nodeClass));
-			HierarchicalASTVisitor.class.getDeclaredMethod(getMethodNameFor(nodeClass), new Class[] { nodeClass });
-		} catch (NoSuchMethodException e) {
-			String signature= getMethodNameFor(nodeClass) + "(" + getSimpleName(nodeClass) + ")";
-			assertTrue("HierarchicalASTVisitor must be updated to reflect a change in the ASTNode heirarchy.  No method " + signature + " was found in HierarchicalASTVisitor.", false);
-		}
-	}
-
-	private static String getMethodNameFor(Class clazz) {
-		return "visit";
-
-	}
-
-	private static String getSimpleName(Class clazz) {
-		String qualified= clazz.getName();
-		return qualified.substring(qualified.lastIndexOf('.') + 1);
-	}
-
-	private static String getMethodSignatureFor(Class clazz, boolean isLeaf) {
-		return getMethodNameFor(clazz) + "(" + getSimpleName(clazz) + ")";
-	}
-
-	/**
-	 * Finds the set of all descendants of <code>root</code> which are not proper descendants
-	 * of a class in the sequence <code>leaves</code>.  This will include <code>root</code>
-	 * and all the elements of <code>leaves</code>.
-	 */
-	private static Set computeAllDescendantsFromLeaves(Iterator leaves, Class root) {
-		Set all= new HashSet();
-		while (leaves.hasNext()) {
-			Class leaf= (Class) leaves.next();
-			addAllAncestorsInclusive(leaf, root, all);
-		}
-		return all;
-	}
-
-	private static void addAllAncestorsInclusive(Class from, Class to, Set set) {
-		Assert.isTrue(to.isAssignableFrom(from));
-		Assert.isTrue(!from.isInterface());
-		Assert.isTrue(!to.isInterface());
-
-		Class ancestor= from;
-		while (!ancestor.equals(to)) {
-			set.add(ancestor);
-			ancestor= ancestor.getSuperclass();
-			if (ancestor == null) {
-				Assert.isTrue(false);
-				/* not expected, given assertions passed above */
-			}
-		}
-		set.add(to);
-	}
-
-	/**
-	 * Returns all the leaf node classes (classes with no subclasses) in the
-	 * ASTNode heirarchy. Since every non-leaf ASTNode descendant (incl. ASTNode)
-	 * is abstract, the set of leaf ASTNode descendants is the set of concrete
-	 * ASTNode descendants.
-	 * 
-	 * If ASTVisitor is maintained, this set will be the set of classes for which
-	 * ASTVisitor has visit(..) methods.  We use this property to compute the set,
-	 * which means that we are as up-to-date as ASTVisitor (to be more
-	 * "up-to-date" would be to require something that HierarchicalASTVisitor would,
-	 * semantically, not be able to provide anyway!).
-	 */
-	private static Set getLeafASTNodeDescendants() {
-		Set result= new HashSet();
-		Method[] methods= ASTVisitor.class.getMethods();
-		for (int i= 0; i < methods.length; i++) {
-			Method method= methods[i];
-			if (isVisitMethod(method)) {
-				result.add(method.getParameterTypes()[0]);
-			}
-		}
-		return result;
-	}
-	private static boolean isVisitMethod(Method method) {
-		if (!"visit".equals(method.getName()))
-			return false;
-
-		Class[] parameters= method.getParameterTypes();
-		return parameters.length == 1 && ASTNode.class.isAssignableFrom(parameters[0]);
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ImportOrganizeTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ImportOrganizeTest.java
deleted file mode 100644
index f6477b3..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ImportOrganizeTest.java
+++ /dev/null
@@ -1,1684 +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.jdt.ui.tests.core;
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IImportDeclaration;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.ISourceRange;
-import org.eclipse.jdt.core.Signature;
-
-import org.eclipse.jdt.ui.JavaUI;
-
-import org.eclipse.jdt.internal.corext.codemanipulation.ImportsStructure;
-import org.eclipse.jdt.internal.corext.codemanipulation.OrganizeImportsOperation;
-import org.eclipse.jdt.internal.corext.codemanipulation.OrganizeImportsOperation.IChooseImportQuery;
-import org.eclipse.jdt.internal.corext.dom.Selection;
-import org.eclipse.jdt.internal.corext.util.TypeInfo;
-
-public class ImportOrganizeTest extends CoreTests {
-	
-	private static final Class THIS= ImportOrganizeTest.class;
-	
-	private IJavaProject fJProject1;
-
-	public ImportOrganizeTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ImportOrganizeTest("testOrganizeImportOnRange2"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-
-	protected void setUp() throws Exception {
-		fJProject1= ProjectTestSetup.getProject();
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	private IChooseImportQuery createQuery(final String name, final String[] choices, final int[] nEntries) {
-		return new IChooseImportQuery() {
-			public TypeInfo[] chooseImports(TypeInfo[][] openChoices, ISourceRange[] ranges) {
-				assertTrue(name + "-query-nchoices1", choices.length == openChoices.length);
-				assertTrue(name + "-query-nchoices2", nEntries.length == openChoices.length);
-				if (nEntries != null) {
-					for (int i= 0; i < nEntries.length; i++) {
-						assertTrue(name + "-query-cnt" + i, openChoices[i].length == nEntries[i]);
-					}
-				}
-				TypeInfo[] res= new TypeInfo[openChoices.length];
-				for (int i= 0; i < openChoices.length; i++) {
-					TypeInfo[] selection= openChoices[i];
-					assertNotNull(name + "-query-setset" + i, selection);
-					assertTrue(name + "-query-setlen" + i, selection.length > 0);
-					TypeInfo found= null;
-					for (int k= 0; k < selection.length; k++) {
-						if (selection[k].getFullyQualifiedName().equals(choices[i])) {
-							found= selection[k];
-						}
-					}
-					assertNotNull(name + "-query-notfound" + i, found);
-					res[i]= found;
-				}
-				return res;
-			}
-		};
-	}
-	
-	private void assertImports(ICompilationUnit cu, String[] imports) throws Exception {
-		IImportDeclaration[] desc= cu.getImports();
-		assertTrue(cu.getElementName() + "-count", desc.length == imports.length);
-		for (int i= 0; i < imports.length; i++) {
-			assertEquals(cu.getElementName() + "-cmpentries" + i, desc[i].getElementName(), imports[i]);
-		}
-	}
-	
-	public void test1() throws Exception {
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);
-
-		ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/runner/BaseTestRunner.java"));
-		assertNotNull("BaseTestRunner.java", cu);
-		
-		IPackageFragmentRoot root= (IPackageFragmentRoot)cu.getParent().getParent();
-		IPackageFragment pack= root.createPackageFragment("mytest", true, null);
-		
-		ICompilationUnit colidingCU= pack.getCompilationUnit("TestListener.java");
-		colidingCU.createType("public abstract class TestListener {\n}\n", null, true, null);
-		
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("BaseTestRunner", new String[] { "junit.framework.TestListener" }, new int[] { 2 });
-		
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		assertImports(cu, new String[] {
-			"java.io.BufferedReader",
-			"java.io.File",
-			"java.io.FileInputStream",
-			"java.io.IOException",
-			"java.io.InputStream",
-			"java.io.PrintWriter",
-			"java.io.StringReader",
-			"java.io.StringWriter",
-			"java.lang.reflect.InvocationTargetException",
-			"java.lang.reflect.Method",
-			"java.text.NumberFormat",
-			"java.util.Properties",
-			"junit.framework.Test",
-			"junit.framework.TestListener",
-			"junit.framework.TestSuite"
-		});
-	}
-	
-	public void test1WithOrder() throws Exception {
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);
-
-		ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/runner/BaseTestRunner.java"));
-		assertNotNull("BaseTestRunner.java", cu);
-
-		IPackageFragmentRoot root= (IPackageFragmentRoot)cu.getParent().getParent();
-		IPackageFragment pack= root.createPackageFragment("mytest", true, null);
-
-		ICompilationUnit colidingCU= pack.getCompilationUnit("TestListener.java");
-		colidingCU.createType("public abstract class TestListener {\n}\n", null, true, null);
-
-
-		String[] order= new String[] { "junit", "java.text", "java.io", "java" };
-		IChooseImportQuery query= createQuery("BaseTestRunner", new String[] { "junit.framework.TestListener" }, new int[] { 2 });
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-
-		assertImports(cu, new String[] {
-			"junit.framework.Test",
-			"junit.framework.TestListener",
-			"junit.framework.TestSuite",
-			"java.text.NumberFormat",	
-			"java.io.BufferedReader",
-			"java.io.File",
-			"java.io.FileInputStream",
-			"java.io.IOException",
-			"java.io.InputStream",
-			"java.io.PrintWriter",
-			"java.io.StringReader",
-			"java.io.StringWriter",
-			"java.lang.reflect.InvocationTargetException",
-			"java.lang.reflect.Method",
-			"java.util.Properties"
-		});
-	}	
-	
-		
-	public void test2() throws Exception {
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);
-
-		ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/runner/LoadingTestCollector.java"));
-		assertNotNull("LoadingTestCollector.java", cu);
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("LoadingTestCollector", new String[] { }, new int[] { });
-		
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		assertImports(cu, new String[] {
-			"java.lang.reflect.Constructor",
-			"java.lang.reflect.Method",
-			"java.lang.reflect.Modifier",
-			"junit.framework.Test"	
-		});	
-	}
-	
-	
-	public void test3() throws Exception {
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);
-
-		ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/runner/TestCaseClassLoader.java"));
-		assertNotNull("TestCaseClassLoader.java", cu);
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("TestCaseClassLoader", new String[] { }, new int[] { });
-		
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 3, false, true, true, query);
-		op.run(null);
-		
-		assertImports(cu, new String[] {
-			"java.io.*",
-			"java.net.URL",
-			"java.util.*",
-			"java.util.zip.ZipEntry",
-			"java.util.zip.ZipFile",
-		});	
-	}
-		
-	public void test4() throws Exception {
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);
-
-		ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/textui/TestRunner.java"));
-		assertNotNull("TestRunner.java", cu);
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("TestRunner", new String[] {}, new int[] {});
-		
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		assertImports(cu, new String[] {
-			"java.io.PrintStream",
-			"java.util.Enumeration",
-			"junit.framework.AssertionFailedError",
-			"junit.framework.Test",
-			"junit.framework.TestFailure",
-			"junit.framework.TestResult",
-			"junit.framework.TestSuite",
-			"junit.runner.BaseTestRunner",
-			"junit.runner.StandardTestSuiteLoader",
-			"junit.runner.TestSuiteLoader",
-			"junit.runner.Version"
-		});		
-	}
-	
-	public void testVariousTypeReferences() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack= sourceFolder.createPackageFragment("test", false, null);
-		for (int ch= 'A'; ch < 'M'; ch++) {
-			String name= String.valueOf((char) ch);
-			ICompilationUnit cu= pack.getCompilationUnit(name + ".java");
-			String content= "public class " + name + " {}";
-			cu.createType(content, null, false, null);
-		}
-		for (int ch= 'A'; ch < 'M'; ch++) {
-			String name= "I" + String.valueOf((char) ch);
-			ICompilationUnit cu= pack.getCompilationUnit(name + ".java");
-			String content= "public interface " + name + " {}";
-			cu.createType(content, null, false, null);
-		}		
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class ImportTest extends A implements IA, IB {\n");
-		buf.append("  private B fB;\n");
-		buf.append("  private Object fObj= new C();\n");
-		buf.append("  public IB foo(IC c, ID d) throws IOException {\n");
-		buf.append("   Object local= (D) fObj;\n");
-		buf.append("   if (local instanceof E) {};\n");
-		buf.append("   return null;\n");
-		buf.append("  }\n");
-		buf.append("}\n");
-		
-		pack= sourceFolder.createPackageFragment("other", false, null);
-		ICompilationUnit cu= pack.getCompilationUnit("ImportTest.java");
-		cu.createType(buf.toString(), null, false, null);
-
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("ImportTest", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		assertImports(cu, new String[] {
-			"java.io.IOException",
-			"test.A",
-			"test.B",
-			"test.C",
-			"test.D",
-			"test.E",			
-			"test.IA",
-			"test.IB",
-			"test.IC",
-			"test.ID",
-		});		
-	}
-	
-	public void testInnerClassVisibility() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("  protected static class C1 {\n");
-		buf.append("    public static class C2 {\n");
-		buf.append("    }\n");
-		buf.append("  }\n");
-		buf.append("}\n");	
-		pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		IPackageFragment pack2= sourceFolder.createPackageFragment("test2", false, null);
-				
-		buf= new StringBuffer();
-		buf.append("package test2;\n");
-
-		buf.append("import test2.A.A1;\n");		
-		buf.append("import test2.A.A1.A2;\n");
-		buf.append("import test2.A.A1.A2.A3;\n");
-		buf.append("import test2.A.B1;\n");
-		buf.append("import test2.A.B1.B2;\n");
-		buf.append("import test1.C;\n");
-		buf.append("import test1.C.C1.C2;\n");
-		
-		buf.append("public class A {\n");
-		buf.append("    public static class A1 {\n");
-		buf.append("        public static class A2 {\n");
-		buf.append("            public static class A3 {\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		
-		buf.append("    public static class B1 {\n");
-		buf.append("        public static class B2 {\n");
-		buf.append("        }\n");
-		
-		buf.append("        public static class B3 {\n");
-		buf.append("            public static class B4 extends C {\n");
-		buf.append("                B4 b4;\n");
-		buf.append("                B3 b3;\n");
-		buf.append("                B2 b2;\n");
-		buf.append("                B1 b1;\n");
-		buf.append("                A1 a1;\n");
-		buf.append("                A2 a2;\n");
-		buf.append("                A3 a3;\n");
-		buf.append("                C1 c1;\n");
-		buf.append("                C2 c2;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		ICompilationUnit cu2= pack2.createCompilationUnit("A.java", buf.toString(), false, null);
-
-
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("A", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu2, order, 99, false, true, true, query);
-		op.run(null);
-		
-		assertImports(cu2, new String[] {
-			"test1.C", 
-			"test1.C.C1.C2",
-			"test2.A.A1.A2", 
-			"test2.A.A1.A2.A3"
-		});
-	}
-	
-	
-	public void testClearImports() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");		
-		buf.append("public class C {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testNewImports() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C extends Vector {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");			
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");						
-		buf.append("public class C extends Vector {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testReplaceImports() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");			
-		buf.append("import java.util.Set;\n");
-		buf.append("\n");				
-		buf.append("public class C extends Vector {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");			
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");						
-		buf.append("public class C extends Vector {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-	}	
-	
-	public void testClearImportsNoPackage() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.getPackageFragment("");
-		StringBuffer buf= new StringBuffer();
-		buf.append("import java.util.Vector;\n");		
-		buf.append("public class C {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		buf= new StringBuffer();
-		buf.append("public class C {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testNewImportsNoPackage() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.getPackageFragment("");
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class C extends Vector {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		buf= new StringBuffer();
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");						
-		buf.append("public class C extends Vector {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testReplaceImportsNoPackage() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.getPackageFragment("");
-		StringBuffer buf= new StringBuffer();
-		buf.append("import java.util.Set;\n");
-		buf.append("\n");				
-		buf.append("public class C extends Vector {\n");
-		buf.append("}\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		buf= new StringBuffer();
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");						
-		buf.append("public class C extends Vector {\n");
-		buf.append("}\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testCommentAfterImport() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\r\n");
-		buf.append("\r\n");			
-		buf.append("import x;\r\n");		
-		buf.append("import java.util.Vector; // comment\r\n");
-		buf.append("\r\n");			
-		buf.append("public class C {\r\n");
-		buf.append("    Vector v;\r\n");		
-		buf.append("}\r\n");	
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		
-		String[] order= new String[0];
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-	
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-		
-		buf= new StringBuffer();
-		buf.append("package pack1;\r\n");
-		buf.append("\r\n");		
-		buf.append("import java.util.Vector;\r\n");
-		buf.append("\r\n");			
-		buf.append("public class C {\r\n");
-		buf.append("    Vector v;\r\n");
-		buf.append("}\r\n");	
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testImportToStar() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class List {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List.java", buf.toString(), false, null);		
-		
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");		
-		buf.append("\n");		
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    String v5;\n");				
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "pack" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 2, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.*;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    String v5;\n");		
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testImportToStarWithExplicit() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class List {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class List2 {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List2.java", buf.toString(), false, null);
-
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("import pack.List2;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    List2 v5;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "pack" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 2, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.*;\n");
-		buf.append("\n");
-		buf.append("import pack.*;\n");
-		buf.append("import pack.List;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    List2 v5;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testImportToStarWithExplicit2() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class List {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List.java", buf.toString(), false, null);
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "pack" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 1, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.*;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testImportToStarWithExplicit3() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class List {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class Set {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("Set.java", buf.toString(), false, null);		
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "pack" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 1, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.*;\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testImportToStarWithExplicit4() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class List {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List.java", buf.toString(), false, null);
-		
-		IPackageFragment pack3= sourceFolder.createPackageFragment("pack3", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack3;\n");
-		buf.append("public class List {\n");
-		buf.append("}\n");
-		pack3.createCompilationUnit("List.java", buf.toString(), false, null);		
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "pack" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 1, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.*;\n");
-		buf.append("\n");
-		buf.append("import pack.List;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List v4;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}	
-	
-	
-
-	public void testImportToStarWithExplicit5() throws Exception {
-		
-		
-		// unrelated project, to fill the all types cache
-		IJavaProject project2 = JavaProjectHelper.createJavaProject("TestProject2", "bin");
-		try {
-			assertTrue("rt not found", JavaProjectHelper.addRTJar(project2) != null);
-			IPackageFragmentRoot sourceFolder2= JavaProjectHelper.addSourceContainer(project2, "src");
-		
-			IPackageFragment pack22= sourceFolder2.createPackageFragment("packx", false, null);
-			StringBuffer buf= new StringBuffer();
-			buf.append("package pack;\n");
-			buf.append("public class Vector {\n");
-			buf.append("}\n");
-			pack22.createCompilationUnit("List.java", buf.toString(), false, null);
-			
-			buf= new StringBuffer();
-			buf.append("package pack;\n");
-			buf.append("public class Set {\n");
-			buf.append("}\n");
-			pack22.createCompilationUnit("Set.java", buf.toString(), false, null);				
-			
-			IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-			IPackageFragment pack2= sourceFolder.createPackageFragment("pack", false, null);
-			buf= new StringBuffer();
-			buf.append("package pack;\n");
-			buf.append("public class List {\n");
-			buf.append("}\n");
-			pack2.createCompilationUnit("List.java", buf.toString(), false, null);
-		
-			IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-			buf= new StringBuffer();
-			buf.append("package pack1;\n");
-			buf.append("\n");
-			buf.append("import java.util.Set;\n");
-			buf.append("import java.util.Vector;\n");
-			buf.append("import java.util.Map;\n");
-			buf.append("\n");
-			buf.append("import pack.List;\n");
-			buf.append("\n");
-			buf.append("public class C {\n");
-			buf.append("    Vector v;\n");
-			buf.append("    Set v2;\n");
-			buf.append("    Map v3;\n");
-			buf.append("    List v4;\n");
-			buf.append("    String v6;\n");
-			buf.append("}\n");
-			ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		
-		
-			String[] order= new String[] { "java", "pack" };
-			IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-		
-			OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 1, false, true, true, query);
-			op.run(null);
-		
-			buf= new StringBuffer();
-			buf.append("package pack1;\n");
-			buf.append("\n");
-			buf.append("import java.util.*;\n");
-			buf.append("\n");
-			buf.append("import pack.List;\n");
-			buf.append("\n");
-			buf.append("public class C {\n");
-			buf.append("    Vector v;\n");
-			buf.append("    Set v2;\n");
-			buf.append("    Map v3;\n");
-			buf.append("    List v4;\n");
-			buf.append("    String v6;\n");
-			buf.append("}\n");
-			assertEqualString(cu.getSource(), buf.toString());
-		} finally {
-			JavaProjectHelper.delete(project2);
-		}
-	}
-	
-	
-	public void testImportFromDefault() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class List1 {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List1.java", buf.toString(), false, null);
-
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List1 v4;\n");
-		buf.append("    String v5;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "pack" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 2, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import List1;\n");
-		buf.append("\n");	
-		buf.append("import java.util.*;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List1 v4;\n");
-		buf.append("    String v5;\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-
-	public void testImportFromDefaultWithStar() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class List1 {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List1.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("public class List2 {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List2.java", buf.toString(), false, null);
-
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Set;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List1 v4;\n");
-		buf.append("    List2 v5;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "pack" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 2, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import List1;\n");
-		buf.append("import List2;\n");
-		buf.append("\n");	
-		buf.append("import java.util.*;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    Vector v;\n");
-		buf.append("    Set v2;\n");
-		buf.append("    Map v3;\n");
-		buf.append("    List1 v4;\n");
-		buf.append("    List2 v5;\n");
-		buf.append("    String v6;\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testImportOfMemberFromLocal() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        class Local {\n");
-		buf.append("            class LocalMember {\n");
-		buf.append("            }\n");
-		buf.append("            LocalMember x;\n");
-		buf.append("            Vector v;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "pack" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");		
-		buf.append("public class C {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        class Local {\n");
-		buf.append("            class LocalMember {\n");
-		buf.append("            }\n");
-		buf.append("            LocalMember x;\n");
-		buf.append("            Vector v;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testGroups1() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack0", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("public class List1 {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List1.java", buf.toString(), false, null);
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    File f;\n");
-		buf.append("    IOException f1;\n");
-		buf.append("    RandomAccessFile f2;\n");
-		buf.append("    ArrayList f3;\n");
-		buf.append("    List1 f4;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java.io", "java.util" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.io.File;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.io.RandomAccessFile;\n");
-		buf.append("\n");		
-		buf.append("import java.util.ArrayList;\n");						
-		buf.append("\n");
-		buf.append("import pack0.List1;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    File f;\n");
-		buf.append("    IOException f1;\n");
-		buf.append("    RandomAccessFile f2;\n");
-		buf.append("    ArrayList f3;\n");
-		buf.append("    List1 f4;\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testBaseGroups1() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack0", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("public class List1 {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("List1.java", buf.toString(), false, null);
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    File f;\n");
-		buf.append("    IOException f1;\n");
-		buf.append("    RandomAccessFile f2;\n");
-		buf.append("    ArrayList f3;\n");
-		buf.append("    List1 f4;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] { "java", "java.io" };
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.ArrayList;\n");
-		buf.append("\n");
-		buf.append("import java.io.File;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.io.RandomAccessFile;\n");
-		buf.append("\n");
-		buf.append("import pack0.List1;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("    File f;\n");
-		buf.append("    IOException f1;\n");
-		buf.append("    RandomAccessFile f2;\n");
-		buf.append("    ArrayList f3;\n");
-		buf.append("    List1 f4;\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testVisibility_bug26746() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack0", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("public interface MyInterface {\n");
-		buf.append("	public interface MyInnerInterface {\n");
-		buf.append("	}\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("MyInterface.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("\n");
-		buf.append("import pack0.MyInterface.MyInnerInterface;\n");
-		buf.append("public class MyClass implements MyInterface {\n");
-		buf.append("	public MyInnerInterface myMethod() {\n");
-		buf.append("		return null;\n");
-		buf.append("	}\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack2.createCompilationUnit("MyClass.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] {};
-		IChooseImportQuery query= createQuery("MyClass", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("\n");
-		buf.append("public class MyClass implements MyInterface {\n");
-		buf.append("	public MyInnerInterface myMethod() {\n");
-		buf.append("		return null;\n");
-		buf.append("	}\n");
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testVisibility_bug37299a() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("public class ClusterSingletonStepped {\n");
-		buf.append("	public interface SingletonStep {\n");
-		buf.append("	}\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("ClusterSingletonStepped.java", buf.toString(), false, null);
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack0", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("\n");
-		buf.append("import pack1.ClusterSingletonStepped;\n");
-		buf.append("import pack1.ClusterSingletonStepped.SingletonStep;\n");
-		buf.append("\n");
-		buf.append("public class TestFile extends ClusterSingletonStepped implements SingletonStep {\n");
-		buf.append("    SingletonStep step;\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack2.createCompilationUnit("TestFile.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] {};
-		IChooseImportQuery query= createQuery("TestFile", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("\n");
-		buf.append("import pack1.ClusterSingletonStepped;\n");
-		buf.append("import pack1.ClusterSingletonStepped.SingletonStep;\n");
-		buf.append("\n");
-		buf.append("public class TestFile extends ClusterSingletonStepped implements SingletonStep {\n");
-		buf.append("    SingletonStep step;\n");	
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testVisibility_bug37299b() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("public class ClusterSingletonStepped {\n");
-		buf.append("	public interface SingletonStep {\n");
-		buf.append("	}\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("ClusterSingletonStepped.java", buf.toString(), false, null);
-
-		IPackageFragment pack2= sourceFolder.createPackageFragment("pack0", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("\n");
-		buf.append("import pack1.ClusterSingletonStepped;\n");
-		buf.append("import pack1.ClusterSingletonStepped.SingletonStep;\n");
-		buf.append("\n");
-		buf.append("public class TestFile extends ClusterSingletonStepped {\n");
-		buf.append("    SingletonStep step;\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack2.createCompilationUnit("TestFile.java", buf.toString(), false, null);
-
-
-		String[] order= new String[] {};
-		IChooseImportQuery query= createQuery("TestFile", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack0;\n");
-		buf.append("\n");
-		buf.append("import pack1.ClusterSingletonStepped;\n");
-		buf.append("\n");
-		buf.append("public class TestFile extends ClusterSingletonStepped {\n");
-		buf.append("    SingletonStep step;\n");	
-		buf.append("}\n");
-		assertEqualString(cu.getSource(), buf.toString());
-	}		
-	
-	
-	public void test5() throws Exception {
-	
-		String[] types= new String[] {
-			"org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader",
-			"org.eclipse.core.resources.IContainer",
-			"org.eclipse.core.runtime.IPath",
-			"org.eclipse.core.runtime.CoreException",
-			"org.eclipse.core.resources.IResource",
-			"org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer"
-		};
-		String[] order= new String[] { "org.eclipse.jdt", "org.eclipse" };
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		for (int i= 0; i < types.length; i++) {
-			String pack= Signature.getQualifier(types[i]);
-			String name= Signature.getSimpleName(types[i]);
-			
-			IPackageFragment pack2= sourceFolder.createPackageFragment(pack, false, null);
-			StringBuffer buf= new StringBuffer();
-			buf.append("package "); buf.append(pack); buf.append(";\n");
-			buf.append("public class "); buf.append(name); buf.append(" {\n");
-			buf.append("}\n");
-			pack2.createCompilationUnit(name + ".java", buf.toString(), false, null);		
-		}
-	
-		StringBuffer body= new StringBuffer();
-		body.append("public class C {\n");
-		for (int i= 0; i < types.length; i++) {
-			String name= Signature.getSimpleName(types[i]);
-			body.append(name); body.append(" a"); body.append(i); body.append(";\n");
-		}
-		body.append("}\n");		
-	
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append(body.toString());
-		
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, 99, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");		
-		buf.append("import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;\n");
-		buf.append("import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;\n");
-		buf.append("\n");
-		buf.append("import org.eclipse.core.resources.IContainer;\n");
-		buf.append("import org.eclipse.core.resources.IResource;\n");
-		buf.append("import org.eclipse.core.runtime.CoreException;\n");
-		buf.append("import org.eclipse.core.runtime.IPath;\n");
-		buf.append("\n");
-		buf.append(body.toString());
-		
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void test_bug25773() throws Exception {
-
-		String[] types= new String[] {
-			"java.util.Vector",
-			"java.util.Map",
-			"java.util.Set",
-			"org.eclipse.gef.X1",
-			"org.eclipse.gef.X2",
-			"org.eclipse.gef.X3",						
-			"org.eclipse.core.runtime.IAdaptable",
-			"org.eclipse.draw2d.IFigure",
-			"org.eclipse.draw2d.LayoutManager",			
-			"org.eclipse.draw2d.geometry.Point",
-			"org.eclipse.draw2d.geometry.Rectangle",
-			"org.eclipse.swt.accessibility.ACC",
-			"org.eclipse.swt.accessibility.AccessibleControlEvent"
-		};
-		
-		String[] order= new String[] { "java", "org.eclipse", "org.eclipse.gef", "org.eclipse.draw2d", "org.eclipse.gef.examples" };
-		int threshold= 3;
-
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		for (int i= 0; i < types.length; i++) {
-			String pack= Signature.getQualifier(types[i]);
-			if (!pack.startsWith("java.")) {
-				String name= Signature.getSimpleName(types[i]);
-	
-				IPackageFragment pack2= sourceFolder.createPackageFragment(pack, false, null);
-				StringBuffer buf= new StringBuffer();
-				buf.append("package "); buf.append(pack); buf.append(";\n");
-				buf.append("public class "); buf.append(name); buf.append(" {\n");
-				buf.append("}\n");
-				pack2.createCompilationUnit(name + ".java", buf.toString(), false, null);
-			}
-		}
-
-		StringBuffer body= new StringBuffer();
-		body.append("public class C {\n");
-		for (int i= 0; i < types.length; i++) {
-			String name= Signature.getSimpleName(types[i]);
-			body.append(name); body.append(" a"); body.append(i); body.append(";\n");
-		}
-		body.append("}\n");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append(body.toString());
-
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, threshold, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import java.util.*;\n");
-		buf.append("\n");
-		buf.append("import org.eclipse.core.runtime.IAdaptable;\n");
-		buf.append("import org.eclipse.swt.accessibility.ACC;\n");
-		buf.append("import org.eclipse.swt.accessibility.AccessibleControlEvent;\n");
-		buf.append("\n");		
-		buf.append("import org.eclipse.gef.*;\n");
-		buf.append("\n");
-		buf.append("import org.eclipse.draw2d.IFigure;\n");
-		buf.append("import org.eclipse.draw2d.LayoutManager;\n");
-		buf.append("import org.eclipse.draw2d.geometry.Point;\n");
-		buf.append("import org.eclipse.draw2d.geometry.Rectangle;\n");
-		buf.append("\n");
-		buf.append(body.toString());
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void test_bug25113() throws Exception {
-
-		String[] types= new String[] {
-			"com.mycompany.Class1",
-			"com.foreigncompany.Class2",
-			"com.foreigncompany.Class3",
-			"com.mycompany.Class4",
-			"com.misc.Class5"
-		};
-
-		String[] order= new String[] { "com", "com.foreigncompany", "com.mycompany" };
-		int threshold= 99;
-
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		for (int i= 0; i < types.length; i++) {
-			String pack= Signature.getQualifier(types[i]);
-			if (!pack.startsWith("java.")) {
-				String name= Signature.getSimpleName(types[i]);
-
-				IPackageFragment pack2= sourceFolder.createPackageFragment(pack, false, null);
-				StringBuffer buf= new StringBuffer();
-				buf.append("package "); buf.append(pack); buf.append(";\n");
-				buf.append("public class "); buf.append(name); buf.append(" {\n");
-				buf.append("}\n");
-				pack2.createCompilationUnit(name + ".java", buf.toString(), false, null);
-			}
-		}
-
-		StringBuffer body= new StringBuffer();
-		body.append("public class C {\n");
-		for (int i= 0; i < types.length; i++) {
-			String name= Signature.getSimpleName(types[i]);
-			body.append(name); body.append(" a"); body.append(i); body.append(";\n");
-		}
-		body.append("}\n");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append(body.toString());
-
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		IChooseImportQuery query= createQuery("C", new String[] {}, new int[] {});
-
-		OrganizeImportsOperation op= new OrganizeImportsOperation(cu, order, threshold, false, true, true, query);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("import com.misc.Class5;\n");
-		buf.append("\n");
-		buf.append("import com.foreigncompany.Class2;\n");
-		buf.append("import com.foreigncompany.Class3;\n");
-		buf.append("\n");
-		buf.append("import com.mycompany.Class1;\n");
-		buf.append("import com.mycompany.Class4;\n");
-		buf.append("\n");
-		buf.append(body.toString());
-		assertEqualString(cu.getSource(), buf.toString());
-	}
-	
-	public void testImportStructureOnNonExistingCU() throws Exception {
-	
-		IJavaProject project1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(project1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		ICompilationUnit unit= pack1.getCompilationUnit("A.java");
-		ICompilationUnit wc= (ICompilationUnit) unit.getWorkingCopy(null, JavaUI.getBufferFactory(), null);
-		try {
-			StringBuffer buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("public class A {\n");
-			buf.append("    public Object foo() {\n");
-			buf.append("    }\n");
-			buf.append("}\n");	
-			wc.getBuffer().setContents(buf.toString());
-			
-			String[] order= new String[] { "com", "com.foreigncompany", "com.mycompany" };
-			int threshold= 99;
-	
-			ImportsStructure importsStructure= new ImportsStructure(wc, order, threshold, true);
-			importsStructure.addImport("java.util.HashMap");
-			importsStructure.create(false, null);
-	
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("\n");
-			buf.append("import java.util.HashMap;\n");
-			buf.append("\n");		
-			buf.append("public class A {\n");
-			buf.append("    public Object foo() {\n");
-			buf.append("    }\n");
-			buf.append("}\n");	
-			
-			assertEqualStringIgnoreDelim(wc.getSource(), buf.toString());
-		} finally {
-			wc.destroy();
-		}
-	}
-	
-	public void testOrganizeImportOnRange() throws Exception {
-	
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("        HashMap map;\n");
-		buf.append("        /*b*/\n");
-		buf.append("        Iterator iter= ((Collection) vec).iterator();\n");
-		buf.append("        /*e*/\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", content, false, null);
-
-		int start= content.indexOf("/*b*/");
-		int end= content.indexOf("/*e*/");
-		Selection sel= Selection.createFromStartEnd(start, end);
-
-		String[] order= new String[] { };
-		int threshold= 99;
-				
-		ImportsStructure structure= new ImportsStructure(cu, order, threshold, true);
-		OrganizeImportsOperation op= new OrganizeImportsOperation(structure, sel, true, true, null);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Collection;\n");
-		buf.append("import java.util.Iterator;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("        HashMap map;\n");
-		buf.append("        /*b*/\n");
-		buf.append("        Iterator iter= ((Collection) vec).iterator();\n");
-		buf.append("        /*e*/\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualStringIgnoreDelim(cu.getSource(), buf.toString());
-
-	}
-	
-	public void testOrganizeImportOnRange2() throws Exception {
-	
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("        /*b*/HashMap map;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("A.java", content, false, null);
-
-		int start= content.indexOf("/*b*/");
-		Selection sel= Selection.createFromStartLength(start, 5);
-
-		String[] order= new String[] { };
-		int threshold= 99;
-				
-		ImportsStructure structure= new ImportsStructure(cu, order, threshold, true);
-		OrganizeImportsOperation op= new OrganizeImportsOperation(structure, sel, true, true, null);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("        /*b*/HashMap map;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualStringIgnoreDelim(cu.getSource(), buf.toString());
-		
-		sel= Selection.createFromStartLength(start, 9);
-		
-		structure= new ImportsStructure(cu, order, threshold, true);
-		op= new OrganizeImportsOperation(structure, sel, true, true, null);
-		op.run(null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.HashMap;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Map;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("        /*b*/HashMap map;\n");
-		buf.append("    }\n");
-		buf.append("}\n");	
-		assertEqualStringIgnoreDelim(cu.getSource(), buf.toString());		
-
-	}			
-	
-		
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JavaElementLabelsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JavaElementLabelsTest.java
deleted file mode 100644
index 5aab6bb..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JavaElementLabelsTest.java
+++ /dev/null
@@ -1,306 +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.jdt.ui.tests.core;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-
-import org.eclipse.jdt.internal.ui.viewsupport.JavaElementLabels;
-
-public class JavaElementLabelsTest extends CoreTests {
-	
-	private static final Class THIS= JavaElementLabelsTest.class;
-	
-	private IJavaProject fJProject1;
-
-	public JavaElementLabelsTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new JavaElementLabelsTest("testOrganizeImportOnRange2"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-
-	protected void setUp() throws Exception {
-		fJProject1= ProjectTestSetup.getProject();
-		
-		IPreferenceStore store= PreferenceConstants.getPreferenceStore();
-		store.setValue(PreferenceConstants.APPEARANCE_COMPRESS_PACKAGE_NAMES, false);
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-		
-	public void testTypeLabelOuter() throws Exception {
-	
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("org.test", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package org.test;\n");
-		buf.append("public class Outer {\n");
-		buf.append("}\n");	
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("Outer.java", content, false, null);
-
-		IJavaElement elem= cu.getElementAt(content.indexOf("Outer"));
-		String lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED);
-		assertEqualString(lab, "org.test.Outer");
-
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_CONTAINER_QUALIFIED);
-		assertEqualString(lab, "Outer");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_POST_QUALIFIED);
-		assertEqualString(lab, "Outer - org.test");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.APPEND_ROOT_PATH);
-		assertEqualString(lab, "org.test.Outer - TestSetupProject/src");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.PREPEND_ROOT_PATH);
-		assertEqualString(lab, "TestSetupProject/src - org.test.Outer");
-	}
-	
-	public void testTypeLabelInner() throws Exception {
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("org.test", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package org.test;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class Outer {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("    }\n");
-		buf.append("    public class Inner {\n");
-		buf.append("        public int inner(Vector vec) {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");	
-		buf.append("}\n");	
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("Outer.java", content, false, null);
-
-		IJavaElement elem= cu.getElementAt(content.indexOf("Inner"));
-		String lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED);
-		assertEqualString(lab, "org.test.Outer.Inner");
-
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_CONTAINER_QUALIFIED);
-		assertEqualString(lab, "Outer.Inner");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_POST_QUALIFIED);
-		assertEqualString(lab, "Inner - org.test.Outer");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.APPEND_ROOT_PATH);
-		assertEqualString(lab, "org.test.Outer.Inner - TestSetupProject/src");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.PREPEND_ROOT_PATH);
-		assertEqualString(lab, "TestSetupProject/src - org.test.Outer.Inner");
-	}
-	
-	public void testTypeLabelLocal() throws Exception {
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("org.test", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package org.test;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class Outer {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("        public class Local {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");	
-		buf.append("}\n");	
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("Outer.java", content, false, null);
-
-		IJavaElement elem= cu.getElementAt(content.indexOf("Local"));
-		String lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED);
-		assertEqualString(lab, "org.test.Outer.foo(..).Local");
-
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_CONTAINER_QUALIFIED);
-		assertEqualString(lab, "Outer.foo(..).Local");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_POST_QUALIFIED);
-		assertEqualString(lab, "Local - org.test.Outer.foo(..)");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.APPEND_ROOT_PATH);
-		assertEqualString(lab, "org.test.Outer.foo(..).Local - TestSetupProject/src");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.PREPEND_ROOT_PATH);
-		assertEqualString(lab, "TestSetupProject/src - org.test.Outer.foo(..).Local");
-	}
-	
-	public void testTypeLabelAnonymous() throws Exception {
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("org.test", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package org.test;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class Outer {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("        new Object() {\n");
-		buf.append("        };\n");
-		buf.append("    }\n");	
-		buf.append("}\n");	
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("Outer.java", content, false, null);
-
-		IJavaElement elem= cu.getElementAt(content.indexOf("Object"));
-		String lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED);
-		assertEqualString(lab, "org.test.Outer.foo(..).new Object() {..}");
-
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_CONTAINER_QUALIFIED);
-		assertEqualString(lab, "Outer.foo(..).new Object() {..}");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_POST_QUALIFIED);
-		assertEqualString(lab, "new Object() {..} - org.test.Outer.foo(..)");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.APPEND_ROOT_PATH);
-		assertEqualString(lab, "org.test.Outer.foo(..).new Object() {..} - TestSetupProject/src");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.PREPEND_ROOT_PATH);
-		assertEqualString(lab, "TestSetupProject/src - org.test.Outer.foo(..).new Object() {..}");
-	}
-	
-	public void testTypeLabelAnonymousInAnonymous() throws Exception {
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("org.test", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package org.test;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class Outer {\n");
-		buf.append("    public void foo(Vector vec) {\n");
-		buf.append("        new Object() {\n");
-		buf.append("            public void xoo() {\n");
-		buf.append("                new Serializable() {\n");
-		buf.append("                };\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");	
-		buf.append("}\n");	
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("Outer.java", content, false, null);
-
-		IJavaElement elem= cu.getElementAt(content.indexOf("Serializable"));
-		String lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED);
-		assertEqualString(lab, "org.test.Outer.foo(..).new Object() {..}.xoo().new Serializable() {..}");
-
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_CONTAINER_QUALIFIED);
-		assertEqualString(lab, "Outer.foo(..).new Object() {..}.xoo().new Serializable() {..}");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_POST_QUALIFIED);
-		assertEqualString(lab, "new Serializable() {..} - org.test.Outer.foo(..).new Object() {..}.xoo()");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.APPEND_ROOT_PATH);
-		assertEqualString(lab, "org.test.Outer.foo(..).new Object() {..}.xoo().new Serializable() {..} - TestSetupProject/src");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.PREPEND_ROOT_PATH);
-		assertEqualString(lab, "TestSetupProject/src - org.test.Outer.foo(..).new Object() {..}.xoo().new Serializable() {..}");
-	}
-	
-	public void testTypeLabelAnonymousInFieldInitializer() throws Exception {
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("org.test", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package org.test;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class Outer {\n");
-		buf.append("    Object o= new Thread() {\n");
-		buf.append("    };\n");	
-		buf.append("}\n");	
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("Outer.java", content, false, null);
-
-		IJavaElement elem= cu.getElementAt(content.indexOf("Thread"));
-		String lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED);
-		assertEqualString(lab, "org.test.Outer.o.new Thread() {..}");
-
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_CONTAINER_QUALIFIED);
-		assertEqualString(lab, "Outer.o.new Thread() {..}");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_POST_QUALIFIED);
-		assertEqualString(lab, "new Thread() {..} - org.test.Outer.o");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.APPEND_ROOT_PATH);
-		assertEqualString(lab, "org.test.Outer.o.new Thread() {..} - TestSetupProject/src");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.PREPEND_ROOT_PATH);
-		assertEqualString(lab, "TestSetupProject/src - org.test.Outer.o.new Thread() {..}");
-	}
-	
-	public void testTypeLabelAnonymousInInitializer() throws Exception {
-		
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		IPackageFragment pack1= sourceFolder.createPackageFragment("org.test", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package org.test;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class Outer {\n");
-		buf.append("    static {\n");
-		buf.append("        new Object() {\n");
-		buf.append("        };\n");
-		buf.append("    }\n");	
-		buf.append("}\n");		
-		String content= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("Outer.java", content, false, null);
-
-		IJavaElement elem= cu.getElementAt(content.indexOf("Object"));
-		String lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED);
-		assertEqualString(lab, "org.test.Outer.{...}.new Object() {..}");
-
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_CONTAINER_QUALIFIED);
-		assertEqualString(lab, "Outer.{...}.new Object() {..}");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_POST_QUALIFIED);
-		assertEqualString(lab, "new Object() {..} - org.test.Outer.{...}");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.APPEND_ROOT_PATH);
-		assertEqualString(lab, "org.test.Outer.{...}.new Object() {..} - TestSetupProject/src");
-		
-		lab= JavaElementLabels.getTextLabel(elem, JavaElementLabels.T_FULLY_QUALIFIED | JavaElementLabels.PREPEND_ROOT_PATH);
-		assertEqualString(lab, "TestSetupProject/src - org.test.Outer.{...}.new Object() {..}");
-	}
-			
-	
-		
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JavaModelUtilTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JavaModelUtilTest.java
deleted file mode 100644
index 6a6ca4f..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JavaModelUtilTest.java
+++ /dev/null
@@ -1,407 +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.jdt.ui.tests.core;
-
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.Signature;
-
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-
-public class JavaModelUtilTest extends TestCase {
-	
-	private static final Class THIS= JavaModelUtilTest.class;
-	
-	private IJavaProject fJProject1;
-	private IJavaProject fJProject2;
-
-	private boolean fEnableAutoBuildAfterTesting;
-
-	private static final IPath LIB= new Path("testresources/mylib.jar");
-
-	public JavaModelUtilTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new JavaModelUtilTest("testFindType"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-
-	protected void setUp() throws Exception {
-		IWorkspace workspace= JavaTestPlugin.getWorkspace();
-		assertNotNull(workspace);
-
-		// disable auto-build
-		IWorkspaceDescription workspaceDesc= workspace.getDescription();
-		if (workspaceDesc.isAutoBuilding()) {
-			fEnableAutoBuildAfterTesting= true;
-			JavaProjectHelper.setAutoBuilding(false);
-		}
-		
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin");
-
-		IPackageFragmentRoot jdk= JavaProjectHelper.addVariableRTJar(fJProject1, "JRE_LIB_TEST", null, null);
-		assertTrue("jdk not found", jdk != null);
-
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());
-
-		JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);
-
-		File mylibJar= JavaTestPlugin.getDefault().getFileInPlugin(LIB);
-		assertTrue("lib not found", junitSrcArchive != null && junitSrcArchive.exists());
-		
-		JavaProjectHelper.addLibraryWithImport(fJProject1, new Path(mylibJar.getPath()), null, null);
-
-		JavaProjectHelper.addVariableEntry(fJProject2, new Path("JRE_LIB_TEST"), null, null);
-
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJProject2, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		ICompilationUnit cu1= pack1.getCompilationUnit("ReqProjType.java");
-		cu1.createType("public class ReqProjType { static class Inner { static class InnerInner {} }\n}\n", null, true, null);
-
-		JavaProjectHelper.addRequiredProject(fJProject1, fJProject2);
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.delete(fJProject1);
-		JavaProjectHelper.delete(fJProject2);
-
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);
-	}
-
-
-	private void assertElementName(String name, IJavaElement elem, int type) {
-		assertNotNull(name, elem);
-		assertEquals(name + "-name", name, elem.getElementName());
-		assertTrue(name + "-type", type == elem.getElementType());
-	}
-
-	public void testFindType() throws Exception {
-		IType type= JavaModelUtil.findType(fJProject1, "junit.extensions.ExceptionTestCase");
-		assertElementName("ExceptionTestCase", type, IJavaElement.TYPE);
-
-		type= JavaModelUtil.findType(fJProject1, "junit.samples.money.IMoney");
-		assertElementName("IMoney", type, IJavaElement.TYPE);	
-
-		type= JavaModelUtil.findType(fJProject1, "junit.tests.TestCaseTest.TornDown");
-		assertElementName("TornDown", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "mylib.Foo");
-		assertElementName("Foo", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "mylib.Foo.FooInner");
-		assertElementName("FooInner", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "mylib.Foo.FooInner.FooInnerInner");
-		assertElementName("FooInnerInner", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType");
-		assertElementName("ReqProjType", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType.Inner");
-		assertElementName("Inner", type, IJavaElement.TYPE);	
-
-		type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType.Inner.InnerInner");
-		assertElementName("InnerInner", type, IJavaElement.TYPE);	
-	}
-	
-	/**
-	 * @deprecated Tests a deprecated method
-	 */
-	public void testFindType2() throws Exception {
-		IType type= JavaModelUtil.findType(fJProject1, "junit.extensions", "ExceptionTestCase");
-		assertElementName("ExceptionTestCase", type, IJavaElement.TYPE);
-
-		type= JavaModelUtil.findType(fJProject1, "junit.samples.money" , "IMoney");
-		assertElementName("IMoney", type, IJavaElement.TYPE);	
-
-		type= JavaModelUtil.findType(fJProject1, "junit.tests", "TestCaseTest.TornDown");
-		assertElementName("TornDown", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "mylib" , "Foo");
-		assertElementName("Foo", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "mylib", "Foo.FooInner");
-		assertElementName("FooInner", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "mylib", "Foo.FooInner.FooInnerInner");
-		assertElementName("FooInnerInner", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "pack1", "ReqProjType");
-		assertElementName("ReqProjType", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findType(fJProject1, "pack1", "ReqProjType.Inner");
-		assertElementName("Inner", type, IJavaElement.TYPE);	
-
-		type= JavaModelUtil.findType(fJProject1, "pack1", "ReqProjType.Inner.InnerInner");
-		assertElementName("InnerInner", type, IJavaElement.TYPE);				
-	}
-	
-	public void testFindTypeContainer() throws Exception {
-		IJavaElement elem= JavaModelUtil.findTypeContainer(fJProject1, "junit.extensions");
-		assertElementName("junit.extensions", elem, IJavaElement.PACKAGE_FRAGMENT);
-
-		elem= JavaModelUtil.findTypeContainer(fJProject1, "junit.tests.TestCaseTest");
-		assertElementName("TestCaseTest", elem, IJavaElement.TYPE);
-		
-		elem= JavaModelUtil.findTypeContainer(fJProject1, "mylib" );
-		assertElementName("mylib", elem, IJavaElement.PACKAGE_FRAGMENT);
-		
-		elem= JavaModelUtil.findTypeContainer(fJProject1, "mylib.Foo");
-		assertElementName("Foo", elem, IJavaElement.TYPE);
-		
-		elem= JavaModelUtil.findTypeContainer(fJProject1, "mylib.Foo.FooInner");
-		assertElementName("FooInner", elem, IJavaElement.TYPE);
-		
-		elem= JavaModelUtil.findTypeContainer(fJProject1, "pack1");
-		assertElementName("pack1", elem, IJavaElement.PACKAGE_FRAGMENT);
-		
-		elem= JavaModelUtil.findTypeContainer(fJProject1, "pack1.ReqProjType");
-		assertElementName("ReqProjType", elem, IJavaElement.TYPE);	
-
-		elem= JavaModelUtil.findTypeContainer(fJProject1, "pack1.ReqProjType.Inner");
-		assertElementName("Inner", elem, IJavaElement.TYPE);				
-	}
-	
-	public void testFindTypeInCompilationUnit() throws Exception {
-		ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/tests/TestCaseTest.java"));
-		assertElementName("TestCaseTest.java", cu, IJavaElement.COMPILATION_UNIT);
-		
-		IType type= JavaModelUtil.findTypeInCompilationUnit(cu, "TestCaseTest");
-		assertElementName("TestCaseTest", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findTypeInCompilationUnit(cu, "TestCaseTest.TornDown");
-		assertElementName("TornDown", type, IJavaElement.TYPE);
-		
-		cu= (ICompilationUnit) fJProject1.findElement(new Path("pack1/ReqProjType.java"));
-		assertElementName("ReqProjType.java", cu, IJavaElement.COMPILATION_UNIT);
-		
-		type= JavaModelUtil.findTypeInCompilationUnit(cu, "ReqProjType");
-		assertElementName("ReqProjType", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findTypeInCompilationUnit(cu, "ReqProjType.Inner");
-		assertElementName("Inner", type, IJavaElement.TYPE);
-		
-		type= JavaModelUtil.findTypeInCompilationUnit(cu, "ReqProjType.Inner.InnerInner");
-		assertElementName("InnerInner", type, IJavaElement.TYPE);		
-	}
-	
-	public void testFindMemberInCompilationUnit() throws Exception {
-		ICompilationUnit cu= (ICompilationUnit) fJProject1.findElement(new Path("junit/tests/TestCaseTest.java"));
-		assertElementName("TestCaseTest.java", cu, IJavaElement.COMPILATION_UNIT);
-		ArrayList children= new ArrayList();
-		
-		IType type= JavaModelUtil.findTypeInCompilationUnit(cu, "TestCaseTest");
-		assertElementName("TestCaseTest", type, IJavaElement.TYPE);
-		
-		children.addAll(Arrays.asList(type.getChildren()));
-		
-		type= JavaModelUtil.findTypeInCompilationUnit(cu, "TestCaseTest.TornDown");
-		assertElementName("TornDown", type, IJavaElement.TYPE);
-		
-		children.addAll(Arrays.asList(type.getChildren()));
-		
-		assertTrue("a", children.size() == 19);
-
-		for (int i= 0; i < children.size(); i++) {
-			Object curr= children.get(i);
-			assertTrue("b", curr instanceof IMember);
-			IMember member= JavaModelUtil.findMemberInCompilationUnit(cu, (IMember) curr);
-			assertEquals("b-" + i, curr, member);
-		}
-	}
-	
-	private void assertClasspathEntry(String name, IJavaElement elem, IPath path, int type) throws Exception {
-		IPackageFragmentRoot root= JavaModelUtil.getPackageFragmentRoot(elem);
-		assertNotNull(name + "-noroot", root);
-		IClasspathEntry entry= root.getRawClasspathEntry();
-		assertNotNull(name + "-nocp", entry);
-		assertEquals(name + "-wrongpath", entry.getPath(), path);
-		assertTrue(name + "-wrongtype", type == entry.getEntryKind());
-	}
-	
-	public void testGetRawClasspathEntry() throws Exception {
-		IType type= JavaModelUtil.findType(fJProject1, "junit.extensions.ExceptionTestCase");
-		assertElementName("ExceptionTestCase", type, IJavaElement.TYPE);
-		IPath path= fJProject1.getProject().getFullPath().append("src");
-		assertClasspathEntry("ExceptionTestCase", type, path, IClasspathEntry.CPE_SOURCE);
-		
-		type= JavaModelUtil.findType(fJProject1, "mylib.Foo");
-		assertElementName("Foo", type, IJavaElement.TYPE);
-		path= fJProject1.getProject().getFullPath().append(LIB.lastSegment());
-		assertClasspathEntry("Foo", type, path, IClasspathEntry.CPE_LIBRARY);
-		
-		type= JavaModelUtil.findType(fJProject1, "java.lang.Object");
-		assertElementName("Object", type, IJavaElement.TYPE);
-		path= new Path("JRE_LIB_TEST");
-		assertClasspathEntry("Object", type, path, IClasspathEntry.CPE_VARIABLE);
-	
-		type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType");
-		assertElementName("ReqProjType", type, IJavaElement.TYPE);
-		path= fJProject2.getProject().getFullPath().append("src");
-		assertClasspathEntry("ReqProjType", type, path, IClasspathEntry.CPE_SOURCE);		
-	}
-
-	/**
-	 * @deprecated Tests a deprecated method
-	 */	
-	public void testIsOnBuildPath() throws Exception {
-		IType type= JavaModelUtil.findType(fJProject1, "junit.extensions.ExceptionTestCase");
-		assertElementName("ExceptionTestCase", type, IJavaElement.TYPE);
-		assertTrue("ExceptionTestCase-bp1", JavaModelUtil.isOnBuildPath(fJProject1, type));
-		assertTrue("ExceptionTestCase-bp2", !JavaModelUtil.isOnBuildPath(fJProject2, type));
-		
-		type= JavaModelUtil.findType(fJProject1, "java.lang.Object");
-		assertElementName("Object", type, IJavaElement.TYPE);		
-		assertTrue("Object-bp1", JavaModelUtil.isOnBuildPath(fJProject1, type));
-		// relies on shared objects for library entries
-		assertTrue("Object-bp2", JavaModelUtil.isOnBuildPath(fJProject2, type));			
-		
-		type= JavaModelUtil.findType(fJProject1, "pack1.ReqProjType");
-		assertElementName("ReqProjType", type, IJavaElement.TYPE);
-		assertTrue("ReqProjType-bp1", JavaModelUtil.isOnBuildPath(fJProject1, type));
-		// relies on shared objects for project entries
-		assertTrue("ReqProjType-bp2", JavaModelUtil.isOnBuildPath(fJProject2, type));		
-	}
-	
-	private void assertFindMethod(String methName, String[] paramTypeNames, boolean isConstructor, IType type) throws Exception {
-		String[] sig= new String[paramTypeNames.length];
-		for (int i= 0; i < paramTypeNames.length; i++) {
-			// create as unresolved
-			String name= Signature.getSimpleName(paramTypeNames[i]);
-			sig[i]= Signature.createTypeSignature(name, false);
-			assertNotNull(methName + "-ts1" + i, sig[i]);
-		}
-		IMethod meth= JavaModelUtil.findMethod(methName, sig, isConstructor, type);
-		assertElementName(methName, meth, IJavaElement.METHOD);
-		assertTrue("methName-nparam1", meth.getParameterTypes().length == paramTypeNames.length);
-		
-		for (int i= 0; i < paramTypeNames.length; i++) {
-			// create as resolved
-			sig[i]= Signature.createTypeSignature(paramTypeNames[i], true);
-			assertNotNull(methName + "-ts2" + i, sig[i]);
-		}		
-		meth= JavaModelUtil.findMethod(methName, sig, isConstructor, type);
-		assertElementName(methName, meth, IJavaElement.METHOD);
-		assertTrue("methName-nparam2", meth.getParameterTypes().length == paramTypeNames.length);
-	}
-	
-	public void testFindMethod() throws Exception {
-		IType type= JavaModelUtil.findType(fJProject1, "junit.framework.Assert");
-		assertElementName("Assert", type, IJavaElement.TYPE);
-		
-		assertFindMethod("assertNotNull", new String[] { "java.lang.Object" }, false, type);
-		assertFindMethod("assertNotNull", new String[] { "java.lang.String", "java.lang.Object" }, false, type);
-		assertFindMethod("assertEquals", new String[] { "java.lang.String", "double", "double", "double" }, false, type);
-		assertFindMethod("assertEquals", new String[] { "java.lang.String", "long", "long" }, false, type);
-		assertFindMethod("Assert", new String[0], true, type);
-
-		type= JavaModelUtil.findType(fJProject1, "junit.samples.money.MoneyTest");
-		assertElementName("MoneyTest", type, IJavaElement.TYPE);
-
-		assertFindMethod("main", new String[] { "java.lang.String[]" }, false, type);
-		assertFindMethod("setUp", new String[0] , false, type);
-		assertFindMethod("MoneyTest", new String[] { "java.lang.String" } , true, type);
-	}
-
-	private void assertFindMethodInHierarchy(String methName, String[] paramTypeNames, boolean isConstructor, IType type, String declaringTypeName) throws Exception {
-		ITypeHierarchy hierarchy= type.newSupertypeHierarchy(null);
-		
-		String[] sig= new String[paramTypeNames.length];
-		for (int i= 0; i < paramTypeNames.length; i++) {
-			// create as unresolved
-			String name= Signature.getSimpleName(paramTypeNames[i]);
-			sig[i]= Signature.createTypeSignature(name, false);
-			assertNotNull(methName + "-ts1" + i, sig[i]);
-		}
-		IMethod meth= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, methName, sig, isConstructor);
-		assertElementName(methName, meth, IJavaElement.METHOD);
-		assertTrue("methName-nparam1", meth.getParameterTypes().length == paramTypeNames.length);
-		assertEquals("methName-decltype", declaringTypeName, JavaModelUtil.getFullyQualifiedName(meth.getDeclaringType()));
-		
-		for (int i= 0; i < paramTypeNames.length; i++) {
-			// create as resolved
-			sig[i]= Signature.createTypeSignature(paramTypeNames[i], true);
-			assertNotNull(methName + "-ts2" + i, sig[i]);
-		}		
-		meth= JavaModelUtil.findMethodDeclarationInHierarchy(hierarchy, type, methName, sig, isConstructor);
-		assertElementName(methName, meth, IJavaElement.METHOD);
-		assertTrue("methName-nparam2", meth.getParameterTypes().length == paramTypeNames.length);
-		assertEquals("methName-decltype", declaringTypeName, JavaModelUtil.getFullyQualifiedName(meth.getDeclaringType()));
-	}
-
-	public void testFindMethodInHierarchy() throws Exception {
-		IType type= JavaModelUtil.findType(fJProject1, "junit.extensions.TestSetup");
-		assertElementName("TestSetup", type, IJavaElement.TYPE);		
-		
-		assertFindMethodInHierarchy("run", new String[] { "junit.framework.TestResult" }, false, type, "junit.framework.Test");
-		assertFindMethodInHierarchy("toString", new String[] {} , false, type, "java.lang.Object");
-	}
-	
-	public void testHasMainMethod() throws Exception {
-		IType type= JavaModelUtil.findType(fJProject1, "junit.samples.money.MoneyTest");
-		assertElementName("MoneyTest", type, IJavaElement.TYPE);
-		
-		assertTrue("MoneyTest-nomain", JavaModelUtil.hasMainMethod(type));
-		
-		type= JavaModelUtil.findType(fJProject1, "junit.framework.TestResult");
-		assertElementName("TestResult", type, IJavaElement.TYPE);
-		
-		assertTrue("TestResult-hasmain", !JavaModelUtil.hasMainMethod(type));
-		
-		type= JavaModelUtil.findType(fJProject1, "junit.samples.VectorTest");
-		assertElementName("VectorTest", type, IJavaElement.TYPE);
-		
-		assertTrue("VectorTest-nomain", JavaModelUtil.hasMainMethod(type));
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/NameProposerTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/NameProposerTest.java
deleted file mode 100644
index b37a534..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/NameProposerTest.java
+++ /dev/null
@@ -1,118 +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.jdt.ui.tests.core;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.runtime.Preferences;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IField;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil;
-
-
-public class NameProposerTest extends TestCase {
-	
-	private static final Class THIS= NameProposerTest.class;
-
-	private IJavaProject fJProject1;
-
-	public NameProposerTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new TestSuite(THIS);
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new NameProposerTest("testGetterSetterName"));
-			return suite;
-		}	
-	}
-
-	protected void setUp() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		assertTrue("rt not found", JavaProjectHelper.addRTJar(fJProject1) != null);
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.delete(fJProject1);
-	}
-
-
-	public void testGetterSetterName() throws Exception {
-		IPackageFragmentRoot sourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment pack1= sourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public class C {\n");
-		buf.append("  int fCount;\n");
-		buf.append("  static int fgSingleton;\n");		
-		buf.append("  int foo;\n");
-		buf.append("\n");		
-		buf.append("  boolean fBlue;\n");		
-		buf.append("  boolean modified;\n");
-		buf.append("  boolean isTouched;\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-		IType type= cu.getType("C");
-		
-		Preferences corePrefs= JavaCore.getPlugin().getPluginPreferences();
-		corePrefs.setValue(JavaCore.CODEASSIST_FIELD_PREFIXES, "f");
-		corePrefs.setValue(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, "fg");
-
-		String[] excluded= new String[0];
-		IField f1= type.getField("fCount");
-		IField f2= type.getField("fgSingleton");
-		IField f3= type.getField("foo");
-		IField f4= type.getField("fBlue");
-		IField f5= type.getField("modified");
-		IField f6= type.getField("isTouched");
-		
-		assertEqualString("setCount", GetterSetterUtil.getSetterName(f1, excluded));
-		assertEqualString("getCount", GetterSetterUtil.getGetterName(f1, excluded));
-		assertEqualString("setSingleton", GetterSetterUtil.getSetterName(f2, excluded));
-		assertEqualString("getSingleton", GetterSetterUtil.getGetterName(f2, excluded));
-		assertEqualString("setFoo", GetterSetterUtil.getSetterName(f3, excluded));
-		assertEqualString("getFoo", GetterSetterUtil.getGetterName(f3, excluded));
-		
-		assertEqualString("setBlue", GetterSetterUtil.getSetterName(f4, excluded));
-		assertEqualString("isBlue", GetterSetterUtil.getGetterName(f4, excluded));
-		assertEqualString("setModified", GetterSetterUtil.getSetterName(f5, excluded));
-		assertEqualString("isModified", GetterSetterUtil.getGetterName(f5, excluded));
-		assertEqualString("setTouched", GetterSetterUtil.getSetterName(f6, excluded));
-		assertEqualString("isTouched", GetterSetterUtil.getGetterName(f6, excluded));
-				
-	}
-	
-	private void assertEqualString(String expected, String actual) {
-		assertTrue("Expected '" + expected + "', is '" + actual + "'", expected.equals(actual));
-	}	
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/PartialASTTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/PartialASTTest.java
deleted file mode 100644
index a7c0c27..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/PartialASTTest.java
+++ /dev/null
@@ -1,532 +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.jdt.ui.tests.core;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.*;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-
-import org.eclipse.jdt.internal.corext.dom.ASTNodes;
-import org.eclipse.jdt.internal.corext.dom.NodeFinder;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-
-public class PartialASTTest extends CoreTests {
-	
-	private static final Class THIS= PartialASTTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public PartialASTTest(String name) {
-		super(name);
-	}
-
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new PartialASTTest("testPartialCU1"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	
-	public void testPartialCU1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() {\n");
-		buf.append("        fField1 = fField2;\n");
-		buf.append("    }\n");
-		buf.append("    public int foo1(int i) {\n");
-		buf.append("        return i;\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String existing= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", existing, false, null);
-		
-		String statement= "fField1 = fField2;";
-		int offset= existing.indexOf(statement);
-		
-		CompilationUnit astRoot= getPartialCompilationUnit(cu, offset);
-		String string= ASTNodes.asFormattedString(astRoot, 0, String.valueOf('\n'));
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() {\n");
-		buf.append("        fField1 = fField2;\n");
-		buf.append("    }\n");
-		buf.append("    public int foo1(int i) {\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String expected= buf.toString();
-		
-		assertEqualString(string, expected);
-		
-		offset= expected.indexOf(statement);
-		
-		ASTNode node= NodeFinder.perform(astRoot, offset, statement.length());
-		Assignment assignment= (Assignment) ((ExpressionStatement) node).getExpression();
-		Expression e1= assignment.getLeftHandSide();
-		Expression e2= assignment.getRightHandSide();
-		assertNotNull(e1.resolveTypeBinding());
-		assertNotNull(e2.resolveTypeBinding());
-		
-		assertTrue(((SimpleName) e1).resolveBinding() instanceof IVariableBinding);
-		assertTrue(((SimpleName) e2).resolveBinding() instanceof IVariableBinding);
-		
-		assertAllBindings(astRoot);		
-	}
-	
-	private void assertAllBindings(CompilationUnit astRoot) {
-		List list= astRoot.types();
-		for (int i= 0; i < list.size(); i++) {
-			TypeDeclaration decl= (TypeDeclaration) list.get(i);
-			assertTrue(decl.resolveBinding() != null);
-			
-			if (!decl.isInterface() && decl.getSuperclass() != null) {
-				assertTrue(decl.getSuperclass().resolveBinding() != null);
-			}
-			List interfaces= decl.superInterfaces();
-			for (int j= 0; j < interfaces.size(); j++) {
-				assertTrue(((Type) interfaces.get(j)).resolveBinding() != null);
-			}
-			
-			MethodDeclaration[] declarations= decl.getMethods();
-			for (int k= 0; k < declarations.length; k++) {
-				MethodDeclaration meth= declarations[k];
-				assertTrue(meth.resolveBinding() != null);
-				List params= meth.parameters();
-				for (int n= 0; n < params.size(); n++) {
-					SingleVariableDeclaration arg= (SingleVariableDeclaration) params.get(n);
-					assertTrue(arg.resolveBinding() != null);
-				}
-				if (!meth.isConstructor()) {		
-					assertTrue(meth.getReturnType().resolveBinding() != null);
-				}
-			}
-		}
-		
-		
-	}
-	
-	
-	public void testPartialCU2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner {\n");
-		buf.append("        public int inner(int i) {\n");
-		buf.append("            return i;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() {\n");
-		buf.append("        fField1 = fField2;\n");
-		buf.append("        if (fField1 == 0) {\n");
-		buf.append("            fField2++;\n");
-		buf.append("        }\n");
-		buf.append("        EInner inner = new EInner();\n");
-		buf.append("    }\n");
-		buf.append("    public int foo1(int i) {\n");
-		buf.append("        private class Local {\n");
-		buf.append("            public int local(int i) {\n");
-		buf.append("                return i;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("        Local local = new Local();\n");	
-		buf.append("        return i;\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String existing= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", existing, false, null);
-		
-		int offset= existing.indexOf("fField1 = fField2;");
-		
-		CompilationUnit astRoot= getPartialCompilationUnit(cu, offset);
-		String string= ASTNodes.asFormattedString(astRoot, 0, String.valueOf('\n'));
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner {\n");
-		buf.append("        public int inner(int i) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() {\n");
-		buf.append("        fField1 = fField2;\n");
-		buf.append("        if (fField1 == 0) {\n");
-		buf.append("            fField2++;\n");
-		buf.append("        }\n");
-		buf.append("        EInner inner = new EInner();\n");
-		buf.append("    }\n");
-		buf.append("    public int foo1(int i) {\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String expected= buf.toString();
-		
-		assertEqualString(string, expected);
-		assertAllBindings(astRoot);	
-	}
-	
-	public void testPartialCU3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.io.Serializable;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner implements Serializable {\n");
-		buf.append("        public int inner(int i) {\n");
-		buf.append("            return i;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() {\n");
-		buf.append("        fField1 = fField2;\n");
-		buf.append("        if (fField1 == 0) {\n");
-		buf.append("            fField2++;\n");
-		buf.append("        }\n");
-		buf.append("        EInner inner = new EInner();\n");
-		buf.append("    }\n");
-		buf.append("    public int foo1(int i) {\n");
-		buf.append("        private class Local {\n");
-		buf.append("            public int local(int i) {\n");
-		buf.append("                return 1;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("        Local local = new Local();\n");	
-		buf.append("        return i;\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String existing= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", existing, false, null);
-		
-		int offset= existing.indexOf("return 1;");
-		
-		CompilationUnit astRoot= getPartialCompilationUnit(cu, offset);
-		String string= ASTNodes.asFormattedString(astRoot, 0, String.valueOf('\n'));
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.io.Serializable;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner implements Serializable {\n");
-		buf.append("        public int inner(int i) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() {\n");
-		buf.append("    }\n");
-		buf.append("    public int foo1(int i) {\n");
-		buf.append("        private class Local {\n");
-		buf.append("            public int local(int i) {\n");
-		buf.append("                return 1;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("        Local local = new Local();\n");	
-		buf.append("        return i;\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String expected= buf.toString();
-		
-		assertEqualString(string, expected);
-		assertAllBindings(astRoot);	
-	}
-	
-	public void testPartialCU4() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner {\n");
-		buf.append("        public int inner(int i) {\n");
-		buf.append("            return 0;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() throws IOException, ParseException {\n");
-		buf.append("        fField1 = fField2;\n");
-		buf.append("        if (fField1 == 0) {\n");
-		buf.append("            fField2++;\n");
-		buf.append("        }\n");
-		buf.append("        EInner inner = new EInner();\n");
-		buf.append("    }\n");
-		buf.append("    public int foo1(int i) {\n");
-		buf.append("        private class Local {\n");
-		buf.append("            public int local(int i) {\n");
-		buf.append("                return 1;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("        Local local = new Local();\n");	
-		buf.append("        return i;\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String existing= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", existing, false, null);
-		
-		int offset= existing.indexOf("return 0;");
-		
-		CompilationUnit astRoot= getPartialCompilationUnit(cu, offset);
-		String string= ASTNodes.asFormattedString(astRoot, 0, String.valueOf('\n'));
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner {\n");
-		buf.append("        public int inner(int i) {\n");
-		buf.append("            return 0;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() throws IOException, ParseException {\n");
-		buf.append("    }\n");
-		buf.append("    public int foo1(int i) {\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String expected= buf.toString();
-		
-		assertEqualString(string, expected);
-		assertAllBindings(astRoot);	
-	}		
-	
-	public void testPartialCUPositionNotInMethod1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner {\n");
-		buf.append("        public int inner(int i) {\n");
-		buf.append("            return 0;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() throws IOException, ParseException {\n");
-		buf.append("        fField1 = fField2;\n");
-		buf.append("        if (fField1 == 0) {\n");
-		buf.append("            fField2++;\n");
-		buf.append("        }\n");
-		buf.append("        EInner inner = new EInner();\n");
-		buf.append("    }\n");
-		buf.append("    public int foo2(int i) {\n");
-		buf.append("        private class Local {\n");
-		buf.append("            public int local(int i) {\n");
-		buf.append("                return 1;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("        Local local = new Local();\n");	
-		buf.append("        return i;\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String existing= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", existing, false, null);
-		
-		int offset= existing.indexOf("private int fField1;");
-		
-		CompilationUnit astRoot= getPartialCompilationUnit(cu, offset);
-		String string= ASTNodes.asFormattedString(astRoot, 0, String.valueOf('\n'));
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner {\n");
-		buf.append("        public int inner(int i) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() throws IOException, ParseException {\n");
-		buf.append("    }\n");
-		buf.append("    public int foo2(int i) {\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String expected= buf.toString();
-		
-		assertEqualString(string, expected);
-		assertAllBindings(astRoot);	
-	}
-	
-	public void testPartialCUPositionNotInMethod2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner {\n");
-		buf.append("        {\n");
-		buf.append("            System.out.println();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() throws IOException, ParseException {\n");
-		buf.append("        fField1 = fField2;\n");
-		buf.append("        if (fField1 == 0) {\n");
-		buf.append("            fField2++;\n");
-		buf.append("        }\n");
-		buf.append("        EInner inner = new EInner();\n");
-		buf.append("    }\n");
-		buf.append("    public int foo2(int i) {\n");
-		buf.append("        private class Local {\n");
-		buf.append("            private int fField3;\n");
-		buf.append("            public int local(int i) {\n");
-		buf.append("                return 1;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("        Local local = new Local();\n");	
-		buf.append("        return i;\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String existing= buf.toString();
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", existing, false, null);
-		
-		int offset= existing.indexOf("private int fField3;");
-		
-		CompilationUnit astRoot= getPartialCompilationUnit(cu, offset);
-		String string= ASTNodes.asFormattedString(astRoot, 0, String.valueOf('\n'));
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class EInner {\n");
-		buf.append("        {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    private int fField1;\n");
-		buf.append("    private int fField2;\n");
-		buf.append("    public void foo1() throws IOException, ParseException {\n");
-		buf.append("    }\n");
-		buf.append("    public int foo2(int i) {\n");
-		buf.append("        private class Local {\n");
-		buf.append("            private int fField3;\n");
-		buf.append("            public int local(int i) {\n");
-		buf.append("                return 1;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("        Local local = new Local();\n");	
-		buf.append("        return i;\n");
-		buf.append("    }\n");
-		buf.append("}");
-		String expected= buf.toString();
-		
-		assertEqualString(string, expected);
-		assertAllBindings(astRoot);	
-	}		
-	
-	private CompilationUnit getPartialCompilationUnit(ICompilationUnit cu, int offset) {
-		return AST.parsePartialCompilationUnit(cu, offset, true);
-	}
-	
-	/*
-	private static class PartialVisitor extends ASTVisitor {
-		
-		private int fOffset;
-
-		public PartialVisitor(int offset) {
-			fOffset= offset;
-		}
-		
-		public boolean visit(Block node) {
-			ASTNode parent= node.getParent();
-			if (parent instanceof MethodDeclaration || parent instanceof Initializer) {
-				int start= node.getStartPosition();
-				int end= start + node.getLength();
-				
-				if (start <= fOffset && fOffset < end) {
-					return true;
-				}
-				node.statements().clear();
-				return false;
-			}
-			return true;
-		}
-	}*/
-	
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/PrimaryWorkingCopyTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/PrimaryWorkingCopyTest.java
deleted file mode 100644
index 12d533e..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/PrimaryWorkingCopyTest.java
+++ /dev/null
@@ -1,378 +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.jdt.ui.tests.core;
-
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jface.text.IDocument;
-
-import org.eclipse.ui.IEditorPart;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IWorkingCopy;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.ui.JavaUI;
-
-import org.eclipse.jdt.internal.corext.refactoring.SearchResultCollector;
-import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-
-public class PrimaryWorkingCopyTest extends CoreTests {
-	
-	private static final Class THIS= PrimaryWorkingCopyTest.class;
-	
-	private IJavaProject fJavaProject1;
-	
-	public PrimaryWorkingCopyTest(String name) {
-		super(name);
-	}
-			
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new AllTypesCacheTest("testHierarchyWithWorkingCopy"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-	
-	protected void setUp() throws Exception {
-		fJavaProject1= ProjectTestSetup.getProject();
-	}
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJavaProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-			
-	
-	public void testSearchInWorkingCopies() throws Exception {
-	
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class A {\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.getCompilationUnit("A.java");
-		cu1.createType(buf.toString(), null, true, null);
-
-		buf= new StringBuffer();
-		buf.append("public class B {\n");
-		buf.append("    A a;\n");
-		buf.append("}\n");
-		ICompilationUnit cu2= pack1.getCompilationUnit("B.java");
-		cu2.createType(buf.toString(), null, true, null);
-		
-		IPackageFragment pack2= root1.createPackageFragment("pack2", true, null);
-		
-		buf= new StringBuffer();
-		buf.append("public class C {\n");
-		buf.append("    //Here\n");
-		buf.append("}\n");
-		ICompilationUnit cu3= pack2.getCompilationUnit("C.java");
-		cu3.createType(buf.toString(), null, true, null);
-		
-		
-		List result= doSearchForReferences("A", null);
-		assertTrue("Should contain 1 references, contains: " + result.size(), result.size() == 1);
-
-		
-		IEditorPart part= EditorUtility.openInEditor(cu3);
-		try {
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			String replacedString= "//Here";
-			
-			int offset= document.get().indexOf(replacedString);
-			
-			document.replace(offset, replacedString.length(), "A a;");
-			
-			result= doSearchForReferences("A", null);
-			assertTrue("Should contain 2 references, contains: " + result.size(), result.size() == 2);
-
-			//save
-			part.doSave(null);
-
-			result= doSearchForReferences("A", null);
-			assertTrue("Should contain 2 references, contains: " + result.size(), result.size() == 2);
-
-			
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-		
-		result= doSearchForReferences("A", null);
-		assertTrue("Should contain 2 references, contains: " + result.size(), result.size() == 2);
-	}
-	
-	public void testSearchInWorkingCopies2() throws Exception {
-	
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class A {\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.getCompilationUnit("A.java");
-		cu1.createType(buf.toString(), null, true, null);
-
-		buf= new StringBuffer();
-		buf.append("public class B {\n");
-		buf.append("    A a;\n");
-		buf.append("}\n");
-		ICompilationUnit cu2= pack1.getCompilationUnit("B.java");
-		cu2.createType(buf.toString(), null, true, null);
-		
-		IPackageFragment pack2= root1.createPackageFragment("pack2", true, null);
-		
-		buf= new StringBuffer();
-		buf.append("public class C {\n");
-		buf.append("    //Here\n");
-		buf.append("}\n");
-		ICompilationUnit cu3= pack2.getCompilationUnit("C.java");
-		cu3.createType(buf.toString(), null, true, null);
-		
-		
-		List result= doSearchForReferences("A", null);
-		assertTrue("Should contain 1 references, contains: " + result.size(), result.size() == 1);
-
-		
-		IEditorPart part= EditorUtility.openInEditor(cu3);
-		try {
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			String replacedString= "//Here";
-			
-			int offset= document.get().indexOf(replacedString);
-			
-			document.replace(offset, replacedString.length(), "A a;");
-			
-			result= doSearchForReferences("A", null);
-			assertTrue("Should contain 2 references, contains: " + result.size(), result.size() == 2);
-					
-			ICompilationUnit wcopy= (ICompilationUnit) cu2.getWorkingCopy(); // create sand box working copy
-			try {
-				String source= wcopy.getSource();
-				replacedString= "A a;";
-				offset= source.indexOf(replacedString);
-				source= source.substring(0, offset) + source.substring(offset + replacedString.length()); // remove reference
-				wcopy.getBuffer().setContents(source);
-	
-				
-				result= doSearchForReferences("A", wcopy);
-				assertTrue("Should contain 1 references, contains: " + result.size(), result.size() == 1);
-				
-				// no save
-			} finally {
-				wcopy.destroy();
-			}
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-		
-		result= doSearchForReferences("A", null);
-		assertTrue("Should contain 1 references, contains: " + result.size(), result.size() == 1);
-	}
-	
-	
-	private List doSearchForReferences(String ref, ICompilationUnit wcopy) throws JavaModelException {
-		IWorkingCopy[] allWorkingCopies;
-		if (wcopy == null) {
-			if (JavaPlugin.USE_WORKING_COPY_OWNERS) {
-				allWorkingCopies= new ICompilationUnit[0];
-			} else {
-				allWorkingCopies= JavaUI.getSharedWorkingCopies();
-			}			
-
-		} else {
-			if (JavaPlugin.USE_WORKING_COPY_OWNERS) {
-				allWorkingCopies= new ICompilationUnit[] { wcopy };
-			} else {
-				IWorkingCopy[] copies= JavaUI.getSharedWorkingCopies();
-				allWorkingCopies= new ICompilationUnit[copies.length + 1];
-				System.arraycopy(copies, 0, allWorkingCopies, 0, copies.length);
-				allWorkingCopies[copies.length]= wcopy;
-			}
-		}
-		
-		SearchEngine engine= new SearchEngine(allWorkingCopies);
-		
-		IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
-		SearchResultCollector collector= new SearchResultCollector(null);
-
-		engine.search(ResourcesPlugin.getWorkspace(), ref, IJavaSearchConstants.TYPE, IJavaSearchConstants.REFERENCES, scope, collector);
-
-		return collector.getResults();
-	}
-	
-	public void testWorkingCopyOfWorkingCopy() throws Exception {
-	
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public class A {\n");
-		buf.append("    //Here\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("A.java", buf.toString(), true, null);
-
-		IEditorPart part= EditorUtility.openInEditor(cu1);
-		try {
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			String replacedString= "//Here";
-			
-			int offset= document.get().indexOf(replacedString);
-			
-			document.replace(offset, replacedString.length(), "A a;");
-			
-			cu1= JavaModelUtil.toWorkingCopy(cu1); // no-op when USE_WORKING_COPY_OWNERS is true
-
-			buf= new StringBuffer();
-			buf.append("package pack1;\n");
-			buf.append("\n");
-			buf.append("public class A {\n");
-			buf.append("    A a;\n");
-			buf.append("}\n");
-			String expected= buf.toString();
-			
-			assertEqualString(cu1.getSource(), expected);
-			
-			ICompilationUnit wcopy= (ICompilationUnit) cu1.getWorkingCopy(); // create sand box working copy
-			try {
-				assertEqualString(wcopy.getSource(), expected);			
-				// no save
-			} finally {
-				wcopy.destroy();
-			}
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-	}
-	
-	public void testLineDelimiterConsistency1() throws Exception {
-		// mixed line delimiters
-		
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public class A {\n");
-		buf.append("    //Here\r\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("A.java", buf.toString(), true, null);
-
-		IEditorPart part= EditorUtility.openInEditor(cu1);
-		try {
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			String replacedString= "//Here";
-			
-			int offset= document.get().indexOf(replacedString);
-			
-			document.replace(offset, replacedString.length(), "A a;");
-			
-			cu1= JavaModelUtil.toWorkingCopy(cu1); // no-op when USE_WORKING_COPY_OWNERS is true
-
-			buf= new StringBuffer();
-			buf.append("package pack1;\n");
-			buf.append("\n");
-			buf.append("public class A {\n");
-			buf.append("    A a;\r\n");
-			buf.append("}\n");
-			String expected= buf.toString();
-			
-			assertEqualString(cu1.getSource(), expected);
-			
-			ICompilationUnit wcopy= (ICompilationUnit) cu1.getWorkingCopy(); // create sand box working copy
-			try {
-				assertEqualString(wcopy.getSource(), expected);
-				IResource resource= wcopy.getResource();
-				assertNotNull(resource);
-				// no save
-			} finally {
-				wcopy.destroy();
-			}
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-	}
-	
-	public void testLineDelimiterConsistency2() throws Exception {
-		// mixed line delimiters
-		
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public class A {\n");
-		buf.append("    //Here\r\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("A.java", buf.toString(), true, null);
-
-		IEditorPart part= EditorUtility.openInEditor(cu1);
-		try {
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			String replacedString= "//Here";
-			
-			int offset= document.get().indexOf(replacedString);
-			
-			document.replace(offset, replacedString.length(), "A a;");
-					
-			
-			cu1= JavaModelUtil.toWorkingCopy(cu1); // no-op when USE_WORKING_COPY_OWNERS is true
-
-			buf= new StringBuffer();
-			buf.append("package pack1;\n");
-			buf.append("\n");
-			buf.append("public class A {\n");
-			buf.append("    A a;\r\n");
-			buf.append("}\n");
-			String expected= buf.toString();
-			
-			assertEqualString(cu1.getSource(), expected);
-			
-			part.doSave(null);
-			
-			assertEqualString(cu1.getSource(), expected);
-			
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-		
-		
-	}
-		
-	
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ProjectTestSetup.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ProjectTestSetup.java
deleted file mode 100644
index fad040e..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ProjectTestSetup.java
+++ /dev/null
@@ -1,76 +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.jdt.ui.tests.core;
-
-import junit.extensions.TestSetup;
-import junit.framework.Test;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-
-public class ProjectTestSetup extends TestSetup {
-
-	public static final String PROJECT_NAME= "TestSetupProject";
-	
-	public static IJavaProject getProject() {
-		IProject project= ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME);
-		return JavaCore.create(project);
-	}
-	
-	public static IClasspathEntry[] getDefaultClasspath() {
-		IPath[] rtJarPath= JavaProjectHelper.findRtJar();
-		assertTrue("rt not found", rtJarPath != null);		
-		return new IClasspathEntry[] {  JavaCore.newLibraryEntry(rtJarPath[0], rtJarPath[1], rtJarPath[2], true) };
-	}
-	
-		
-	private IJavaProject fJProject;
-
-	private boolean fAutobuilding;
-	
-	public ProjectTestSetup(Test test) {
-		super(test);
-	}
-	
-	/* (non-Javadoc)
-	 * @see junit.extensions.TestSetup#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		IJavaProject project= getProject();
-		if (project.exists()) { // allow nesting of ProjectTestSetup's
-			return;
-		}
-		
-		fAutobuilding = JavaProjectHelper.setAutoBuilding(false);
-		
-		fJProject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		fJProject.setRawClasspath(getDefaultClasspath(), null);	
-	}
-
-	protected void tearDown() throws Exception {
-		if (fJProject != null) {
-			JavaProjectHelper.delete(fJProject);
-			JavaProjectHelper.setAutoBuilding(fAutobuilding);
-		}
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ScopeAnalyzerTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ScopeAnalyzerTest.java
deleted file mode 100644
index 677b3c3..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/ScopeAnalyzerTest.java
+++ /dev/null
@@ -1,764 +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.jdt.ui.tests.core;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.IBinding;
-
-import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer;
-
-/**
-  */
-public class ScopeAnalyzerTest extends CoreTests {
-
-	private static final Class THIS= ScopeAnalyzerTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ScopeAnalyzerTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (false) {
-			return allTests(); 
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ScopeAnalyzerTest("testVariableDeclarations6"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-	
-	protected void setUp() throws Exception {
-		
-		fJProject1= ProjectTestSetup.getProject();
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.COMPILER_PB_HIDDEN_CATCH_BLOCK, JavaCore.IGNORE);
-		
-		JavaCore.setOptions(options);		
-	}
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	public void testVariableDeclarations1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    int[] fGlobal;\n");
-		buf.append("    public int goo(int param1, int param2) {\n");
-		buf.append("        int count= 0;\n");
-		buf.append("        fGlobal= new int[] { 1, 2, 3};\n");
-		buf.append("        for (int i= 0; i < fGlobal.length; i++) {\n");
-		buf.append("            int insideFor= 0;\n");
-		buf.append("            count= insideFor + fGlobal[i];\n");
-		buf.append("            return -1;\n");		
-		buf.append("        }\n");
-		buf.append("        count++;\n");
-		buf.append("        int count2= 0;\n");
-		buf.append("        count+= count2;\n");
-		buf.append("        return count;\n");		
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		
-		{
-			String str= "count+= count2;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-	
-			assertVariables(res, new String[] { "param1", "param2", "count", "count2", "fGlobal" });
-		}
-		
-		{
-			String str= "count++;";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "param1", "param2", "count", "fGlobal" });
-		}
-	
-		{
-			String str= "return -1;";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-	
-			assertVariables(res, new String[] { "param1", "param2", "count", "i", "insideFor", "fGlobal" });
-		}		
-		
-	}
-
-	public void testVariableDeclarations2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int goo(int param1) {\n");
-		buf.append("        int count= 9, count2= 0;\n");
-		buf.append("        try {\n");
-		buf.append("            for (int i= 0, j= 0; i < 9; i++) {\n");
-		buf.append("                System.out.println(i + j);\n");
-		buf.append("                j++;\n");
-		buf.append("                throw new IOException();\n");		
-		buf.append("            }\n");
-		buf.append("            return 8;\n");			
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("           int k= 0;\n");
-		buf.append("           return k;\n");
-		buf.append("        } catch (Exception x) {\n");
-		buf.append("           x= null;\n");					 
-		buf.append("        };\n");
-		buf.append("        return count;\n");		
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		
-		{
-			String str= "j++;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "param1", "count", "count2", "i", "j"});
-		}
-		
-		{
-			String str= "return 8;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "param1", "count", "count2"});
-		}		
-		
-		{
-			String str= "return k;";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-
-			assertVariables(res, new String[] { "param1", "count", "count2", "e", "k" });
-		}
-		
-		{
-			String str= "x= null;";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "param1", "count", "count2", "x" });
-		}		
-	
-		{
-			String str= "return count;";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "param1", "count", "count2" });
-		}		
-		
-	}
-	
-	public void testVariableDeclarations3() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fVar1, fVar2;\n");
-		buf.append("    public int goo(int param1) {\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            int fInner;\n");		
-		buf.append("            public void run() {\n");
-		buf.append("                int k= 0;\n");
-		buf.append("                fVar1= k;\n");
-		buf.append("            }\n");		
-		buf.append("        };\n");
-		buf.append("        int k= 0;\n");
-		buf.append("        return k;\n");
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		
-		{
-			String str= "fVar1= k;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "k", "fInner",  "param1", "run", "fVar1", "fVar2"});
-		}
-		
-		{
-			String str= "return k;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "k", "param1", "run", "fVar1", "fVar2"});
-		}
-
-	}
-	
-	public void testVariableDeclarations4() throws Exception {
-		IPackageFragment pack0= fSourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public class Rectangle {\n");
-		buf.append("  public int x;\n");
-		buf.append("  public int y;\n");
-		buf.append("}\n");
-		pack0.createCompilationUnit("Rectangle.java", buf.toString(), false, null);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("import pack1.Rectangle;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fVar1, fVar2;\n");
-		buf.append("    public int goo(int param1) {\n");
-		buf.append("        int k= 0;\n");
-		buf.append("        Rectangle r= new Rectangle();\n");		
-		buf.append("        return r.x;\n");
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		{
-			String str= "return r.x;";
-			int offset= buf.toString().indexOf(str) + "return r.".length();
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "x", "y"});
-		}			
-			
-	}
-	
-	public void testVariableDeclarations5() throws Exception {
-		
-		IPackageFragment pack0= fSourceFolder.createPackageFragment("pack1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack1;\n");
-		buf.append("\n");
-		buf.append("public interface IConstants {\n");
-		buf.append("  public final int CONST= 1;\n");
-		buf.append("}\n");
-		pack0.createCompilationUnit("IConstants.java", buf.toString(), false, null);		
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fVar1, fVar2;\n");
-		
-		buf.append("    private class A {\n");
-		buf.append("        int fCount;\n");
-		buf.append("        public int foo(int param1) {\n");
-		buf.append("            return 1;\n");		
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("    public int goo(int param0) {\n");
-		buf.append("        int k= 0;\n");
-		buf.append("        class B extends A implements pack1.IConstants {\n");
-		buf.append("            int fCount2;\n");
-		buf.append("            public int foo(int param1) {\n");
-		buf.append("                return 2;\n");		
-		buf.append("            }\n");		
-		buf.append("        }\n");		
-		buf.append("        return 3;\n");
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		{
-			String str= "return 1;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "param1", "fCount", "fVar1", "fVar2"});
-		}
-		
-		{
-			String str= "return 2;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "param1", "fCount2", "fCount", "k", "param0", "fVar1", "fVar2", "CONST"});
-		}				
-			
-	}
-
-	public void testVariableDeclarations6() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    int[] fGlobal;\n");
-		buf.append("    public int goo(int param1, int param2) {\n");
-		buf.append("        switch (param1) {\n");
-		buf.append("            case 1:\n;");
-		buf.append("                fGlobal= new int[] { 1, 2, 3};\n");
-		buf.append("                int temp= 9;\n");
-		buf.append("                break;\n");
-		buf.append("            case 2:\n;");
-		buf.append("                do {\n");
-		buf.append("                   int insideDo= 0;\n");
-		buf.append("                   return -1;\n");
-		buf.append("                } while (true);\n");
-		buf.append("            case 3:\n;");
-		buf.append("                int temp2= 9;\n");
-		buf.append("                Math.min(1.0f, 2.0f);\n");
-		buf.append("                return 3;\n");
-		buf.append("        }\n");
-		buf.append("        return 4;\n");		
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		
-		{
-			String str= "break;";
-			int offset= buf.toString().indexOf(str);
-
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-
-			assertVariables(res, new String[] { "param1", "param2", "temp", "fGlobal" });
-		}
-		
-		{
-			String str= "return -1;";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-
-			assertVariables(res, new String[] { "param1", "param2", "temp", "insideDo", "fGlobal" });
-		}			
-			
-		{
-			String str= "Math";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-
-			assertVariables(res, new String[] { "param1", "param2", "temp", "temp2", "fGlobal" });
-		}			
-
-		{
-			String str= "min";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-
-			assertVariables(res, new String[] { "E", "PI" });
-		}
-		
-		{
-			String str= "return 4;";
-			int offset= buf.toString().indexOf(str);
-			
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-
-			assertVariables(res, new String[] { "param1", "param2", "fGlobal" });
-		}		
-		
-	}
-
-
-
-
-
-	public void testDeclarationsAfter() throws Exception {
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int goo(final int param0) {\n");
-		buf.append("        int k= 0;\n");
-		buf.append("        try {\n");
-		buf.append("            for (int i= 0; i < 10; i++) {\n");
-		buf.append("                k += i;\n");
-		buf.append("            }\n");
-		buf.append("        } catch (Exception x) {\n");
-		buf.append("           return 9;\n");					 
-		buf.append("        };\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            int fInner;\n");		
-		buf.append("            public void run() {\n");
-		buf.append("                int x1= 0;\n");
-		buf.append("                x1 += param0;\n");
-		buf.append("                {\n");
-		buf.append("                    for (int i= 0, j= 0; i < 10; i++) {\n");
-		buf.append("                        x1 += i;\n");
-		buf.append("                        int x2= 0;\n");
-		buf.append("                    }\n");
-		buf.append("                }\n");		
-		buf.append("            }\n");		
-		buf.append("        };\n");			
-		buf.append("        return 3;\n");
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		{
-			String str= "int k= 0;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsAfter(offset, flags);
-			
-			assertVariables(res, new String[] { "k", "i", "x", "run"});
-		}
-		
-		{
-			String str= "return 9;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsAfter(offset, flags);
-			
-			assertVariables(res, new String[] { });
-		}
-		
-		{
-			String str= "x1 += param0;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.VARIABLES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsAfter(offset, flags);
-			
-			assertVariables(res, new String[] { "i", "j", "x2" });
-		}				
-			
-	}
-
-	public void testTypeDeclarations1() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static class A {\n");
-		buf.append("        public class A1 {\n");
-		buf.append("            public int foo() {\n");
-		buf.append("                return 1;\n");		
-		buf.append("            }\n");			
-		buf.append("        }\n");
-		buf.append("        public class A2 {\n");
-		buf.append("        }\n");		
-		buf.append("        public int foo() {\n");
-		buf.append("            return 2;\n");		
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		buf.append("class F {\n");
-		buf.append("    public int goo(int param0) {\n");
-		buf.append("        class C extends E.A {\n");
-		buf.append("            A1 b;\n");
-		buf.append("            public int foo() {\n");
-		buf.append("                return 3;\n");		
-		buf.append("            }\n");
-		buf.append("        }\n");		
-		buf.append("        return 4;\n");
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		{
-			String str= "return 1;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.TYPES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "A1", "A", "E", "A2", "F"});
-		}
-		
-		{
-			String str= "return 2;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.TYPES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "A1", "A", "E", "A2", "F"});
-		}
-		
-		{
-			String str= "return 3;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.TYPES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "C", "F", "A1", "A2", "E"});
-		}
-		
-		{
-			String str= "return 4;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.TYPES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "C", "F", "E"});
-		}					
-			
-	}
-	
-	public void testTypeDeclarations2() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static class E1 extends G {\n");
-		buf.append("        public static class EE1 {\n");
-		buf.append("        }\n");
-		buf.append("        public static class EE2 {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("    public static class E2 {\n");
-		buf.append("    }\n");				
-		buf.append("}\n");		
-		buf.append("class F extends E.E1{\n");
-		buf.append("    F f1;\n");
-		buf.append("}\n");
-		buf.append("class G {\n");
-		buf.append("    public static class G1 {\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		{
-			String str= "F f1;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.TYPES;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertVariables(res, new String[] { "F", "EE1", "EE2", "G1", "G", "E"});
-		}
-	}		
-	
-		
-	
-	public void testMethodDeclarations1() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");			
-		
-		buf.append("    public void goo() {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		
-		buf.append("    public String toString() {\n");
-		buf.append("        return String.valueOf(1);\n");
-		buf.append("    }\n");	
-		
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-		{
-			String str= "return;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.METHODS;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertMethods(res, new String[] { "goo", "foo" }, true);
-		}			
-			
-	}
-	
-	public void testMethodDeclarations2() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1.ae", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1.ae;\n");
-		buf.append("public class E {\n");
-		buf.append("    int fVar1, fVar2;\n");
-		buf.append("    public int goo(int param1) {\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            int fInner;\n");		
-		buf.append("            public void run() {\n");
-		buf.append("                return;\n");
-		buf.append("            }\n");		
-		buf.append("        };\n");
-		buf.append("        int k= 0;\n");
-		buf.append("        return k;\n");
-		buf.append("    }\n");
-		buf.append("    private class A extends E {\n");
-		buf.append("        { // initializer\n");
-		buf.append("           fVar1= 9; \n");		
-		buf.append("        }\n");
-		buf.append("        public int foo(int param1) {\n");
-		buf.append("            return 1;\n");		
-		buf.append("        }\n");		
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit compilationUnit= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(compilationUnit, true);
-		assertNoProblems(astRoot);
-
-		{
-			String str= "return;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.METHODS;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertMethods(res, new String[] { "run", "goo"}, true);
-		}
-		
-		{
-			String str= "return k;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.METHODS;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertMethods(res, new String[] { "goo"}, true);
-		}
-		
-		{
-			String str= "return 1;";
-			int offset= buf.toString().indexOf(str);
-	
-			int flags= ScopeAnalyzer.METHODS;
-			IBinding[] res= new ScopeAnalyzer(astRoot).getDeclarationsInScope(offset, flags);
-			
-			assertMethods(res, new String[] { "foo", "goo"}, true);
-		}		
-
-	}
-	
-	
-	private static final String[] OBJ_METHODS= new String[] { "getClass", 
-		"hashCode", "equals", "clone", "toString", "notify", "notifyAll", "wait", "wait",
-		"wait", "finalize" };
-
-	private void assertMethods(IBinding[] res, String[] expectedNames, boolean addObjectMethods) {
-		String[] names= new String[res.length];		
-		for (int i= 0; i < res.length; i++) {
-			names[i]= res[i].getName();
-		}
-		String[] expected= expectedNames;
-		
-		if (addObjectMethods) {
-			expected= new String[expectedNames.length + OBJ_METHODS.length];
-			System.arraycopy(OBJ_METHODS, 0, expected, 0, OBJ_METHODS.length);
-			System.arraycopy(expectedNames, 0, expected, OBJ_METHODS.length, expectedNames.length);
-		}
-		
-		assertEqualStringsIgnoreOrder(names, expected);
-	}	
-
-	private void assertVariables(IBinding[] res, String[] expectedNames) {
-		String[] names= new String[res.length];		
-		for (int i= 0; i < res.length; i++) {
-			names[i]= res[i].getName();
-		}
-		assertEqualStringsIgnoreOrder(names, expectedNames);
-	}
-	
-	private void assertNoProblems(CompilationUnit astRoot) {
-		IProblem[] problems= astRoot.getProblems();
-		if (problems.length > 0) {
-			StringBuffer buf= new StringBuffer();
-			for (int i= 0; i < problems.length; i++) {
-				buf.append(problems[i].getMessage()).append('\n');
-			}
-			assertTrue(buf.toString(), false);	
-		}
-	}
-
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TextEditTests.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TextEditTests.java
deleted file mode 100644
index a4d6043..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TextEditTests.java
+++ /dev/null
@@ -1,1041 +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.jdt.ui.tests.core;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.text.edits.CopySourceEdit;
-import org.eclipse.text.edits.CopyTargetEdit;
-import org.eclipse.text.edits.DeleteEdit;
-import org.eclipse.text.edits.InsertEdit;
-import org.eclipse.text.edits.MalformedTreeException;
-import org.eclipse.text.edits.MoveSourceEdit;
-import org.eclipse.text.edits.MoveTargetEdit;
-import org.eclipse.text.edits.MultiTextEdit;
-import org.eclipse.text.edits.RangeMarker;
-import org.eclipse.text.edits.ReplaceEdit;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.text.edits.TextEditCopier;
-import org.eclipse.text.edits.UndoEdit;
-
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-
-public class TextEditTests extends TestCase {
-
-	private static final Class THIS= TextEditTests.class;
-	
-	private IDocument fDocument;
-	private MultiTextEdit fRoot;
-	
-	public TextEditTests(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new TestSuite(THIS);
-	}
-
-	public static Test suite() {
-		TestSuite result= new TestSuite(THIS);
-		if (false) {	// For hot code replace when debugging test cases
-			result.addTestSuite(THIS);
-			result.addTestSuite(THIS);
-			result.addTestSuite(THIS);
-			result.addTestSuite(THIS);
-			result.addTestSuite(THIS);
-			result.addTestSuite(THIS);
-		}
-		return result;
-	}
-	
-	protected void setUp() throws Exception {
-		fDocument= new Document("0123456789");
-		fRoot= new MultiTextEdit();
-	}
-	
-	protected void tearDown() throws Exception {
-		fRoot= null;
-		fRoot= null;
-	}
-	
-	public void testOverlap1() throws Exception {
-		// [ [ ] ]
-		fRoot.addChild(new ReplaceEdit(0, 2, "01"));
-		boolean exception= false;
-		try {
-			fRoot.addChild(new ReplaceEdit(1, 2, "12"));
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}	
-	
-	public void testOverlap2() throws Exception {
-		// [[ ] ]
-		fRoot.addChild(new ReplaceEdit(0, 2, "01"));
-		boolean exception= false;
-		try {
-			fRoot.addChild(new ReplaceEdit(0, 1, "0"));
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}	
-	
-	public void testOverlap3() throws Exception {
-		// [ [ ]]
-		fRoot.addChild(new ReplaceEdit(0, 2, "01"));
-		boolean exception= false;
-		try {
-			fRoot.addChild(new ReplaceEdit(1, 1, "1"));
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}	
-	
-	public void testOverlap4() throws Exception {
-		// [ [ ] ]
-		fRoot.addChild(new ReplaceEdit(0, 3, "012"));
-		boolean exception= false;
-		try {
-			fRoot.addChild(new ReplaceEdit(1, 1, "1"));
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}
-	
-	public void testOverlap5() throws Exception {
-		// [ []  ]
-		fRoot.addChild(new ReplaceEdit(0, 3, "012"));
-		boolean exception= false;
-		try {
-			fRoot.addChild(new InsertEdit(1, "xx"));
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}
-	
-	public void testOverlap6() throws Exception {
-		// [  [] ]
-		fRoot.addChild(new ReplaceEdit(0, 3, "012"));
-		boolean exception= false;
-		try {
-			fRoot.addChild(new InsertEdit(2, "xx"));
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}
-	
-	public void testOverlap7() throws Exception {
-		MoveSourceEdit source= new MoveSourceEdit(2, 5);
-		MoveTargetEdit target= new MoveTargetEdit(3, source);
-		fRoot.addChild(source);
-		boolean exception= false;
-		try {
-			fRoot.addChild(target);
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}
-	
-	public void testOverlap8() throws Exception {
-		MoveSourceEdit source= new MoveSourceEdit(2, 5);
-		MoveTargetEdit target= new MoveTargetEdit(6, source);
-		fRoot.addChild(source);
-		boolean exception= false;
-		try {
-			fRoot.addChild(target);
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}
-	
-	public void testOverlap9() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(3, 1);
-		MoveTargetEdit t1= new MoveTargetEdit(7, s1);
-		MoveSourceEdit s2= new MoveSourceEdit(2, 3);
-		MoveTargetEdit t2= new MoveTargetEdit(8, s2);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		boolean exception= false;
-		try {
-			fRoot.addChild(s2);
-			fRoot.addChild(t2);
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}
-	
-	public void testUnconnected1() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(3, 1);
-		boolean exception= false;
-		try {
-			fRoot.addChild(s1);
-			fRoot.apply(fDocument);
-		} catch (MalformedTreeException e) {
-			exception= true;
-		}
-		assertTrue(exception);
-	}
-	
-	public void testBufferLength() throws Exception {
-		MultiTextEdit edit= new MultiTextEdit(0, fDocument.getLength() + 1);
-		boolean exception= false;
-		try {
-			fRoot.addChild(edit);
-			fRoot.apply(fDocument);
-		} catch (MalformedTreeException e) {
-			exception= true;
-			assertTrue(exception);
-		}
-	}
-	
-	public void testCopy1() throws Exception {
-		MultiTextEdit root= new MultiTextEdit();
-		TextEdit e1= new InsertEdit(2, "yy");
-		TextEdit e2= new ReplaceEdit(2, 3, "3456");
-		root.addChild(e1);
-		root.addChild(e2);
-		List org= flatten(root);
-		TextEditCopier copier= new TextEditCopier(root);
-		List copy= flatten(copier.perform());
-		compare(copier, org, copy);
-	}
-	
-	public void testCopy2() throws Exception {
-		MultiTextEdit root= new MultiTextEdit();
-		CopySourceEdit s1= new CopySourceEdit(5, 2);
-		CopyTargetEdit t1= new CopyTargetEdit(8, s1);
-		CopySourceEdit s2= new CopySourceEdit(5, 2);
-		CopyTargetEdit t2= new CopyTargetEdit(2, s2);
-		s1.addChild(s2);
-		root.addChild(s1);
-		root.addChild(t1);
-		root.addChild(t2);
-		List org= flatten(root);
-		TextEditCopier copier= new TextEditCopier(root);
-		List copy= flatten(copier.perform());
-		compare(copier, org, copy);
-	}
-		
-	private List flatten(TextEdit edit) {
-		List result= new ArrayList();
-		flatten(result, edit);
-		return result;
-	}
-	
-	private static void flatten(List result, TextEdit edit) {
-		result.add(edit);
-		TextEdit[] children= edit.getChildren();
-		for (int i= 0; i < children.length; i++) {
-			flatten(result, children[i]);
-		}
-	}
-	
-	private static void compare(TextEditCopier copier, List org, List copy) {
-		assertTrue("Same length", org.size() == copy.size());
-		for (Iterator iter= copy.iterator(); iter.hasNext();) {
-			TextEdit edit= (TextEdit)iter.next();
-			assertTrue("Original is part of copy list", !org.contains(edit));
-			if (edit instanceof MoveSourceEdit) {
-				MoveSourceEdit source= (MoveSourceEdit)edit;
-				assertTrue("Target edit isn't a copy", copy.contains(source.getTargetEdit()));
-				assertTrue("Traget edit is a original", !org.contains(source.getTargetEdit()));
-			} else if (edit instanceof MoveTargetEdit) {
-				MoveTargetEdit target= (MoveTargetEdit)edit;
-				assertTrue("Source edit isn't a copy", copy.contains(target.getSourceEdit()));
-				assertTrue("Source edit is a original", !org.contains(target.getSourceEdit()));
-			} else if (edit instanceof CopySourceEdit) {
-				CopySourceEdit source= (CopySourceEdit)edit;
-				assertTrue("Target edit isn't a copy", copy.contains(source.getTargetEdit()));
-				assertTrue("Traget edit is a original", !org.contains(source.getTargetEdit()));
-			} else if (edit instanceof CopyTargetEdit) {
-				CopyTargetEdit target= (CopyTargetEdit)edit;
-				assertTrue("Source edit isn't a copy", copy.contains(target.getSourceEdit()));
-				assertTrue("Source edit is a original", !org.contains(target.getSourceEdit()));
-			}
-		}
-	}
-		
-	public void testInsert1() throws Exception {
-		// [][  ]
-		TextEdit e1= new InsertEdit(2, "yy");
-		TextEdit e2= new ReplaceEdit(2, 3, "3456");
-		fRoot.addChild(e1);
-		fRoot.addChild(e2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(fRoot, 2, 6);
-		assertEquals(e1, 2, 2);
-		assertEquals(e2, 4, 4);
-		assertEquals("Buffer content", "01yy345656789", fDocument.get());
-		doUndoRedo(undo, "01yy345656789");
-	}
-	
-	public void testInsert2() throws Exception {
-		// [][]
-		TextEdit e1= new InsertEdit(2, "yy");
-		TextEdit e2= new InsertEdit(2, "xx");
-		fRoot.addChild(e1);
-		fRoot.addChild(e2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(fRoot, 2, 4);
-		assertEquals(e1, 2, 2);
-		assertEquals(e2, 4, 2);
-		assertEquals("Buffer content", "01yyxx23456789", fDocument.get());
-		doUndoRedo(undo, "01yyxx23456789");
-	}
-	
-	public void testInsert3() throws Exception {
-		// [  ][][  ]
-		TextEdit e1= new ReplaceEdit(0, 2, "011");
-		TextEdit e2= new InsertEdit(2, "xx");
-		TextEdit e3= new ReplaceEdit(2, 2, "2");
-		fRoot.addChild(e1);
-		fRoot.addChild(e2);
-		fRoot.addChild(e3);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(fRoot, 0, 6);
-		assertEquals(e1, 0, 3);
-		assertEquals(e2, 3, 2);
-		assertEquals(e3, 5, 1);
-		assertEquals("Buffer content", "011xx2456789", fDocument.get());
-		doUndoRedo(undo, "011xx2456789");
-	}
-	
-	public void testInsert4() throws Exception {
-		TextEdit e1= new InsertEdit(0, "xx");
-		fRoot.addChild(e1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer length", 12, fDocument.getLength());
-		assertEquals(fRoot, 0, 2);
-		assertEquals(e1, 0, 2);
-		assertEquals("Buffer content", "xx0123456789", fDocument.get());
-		doUndoRedo(undo, "xx0123456789");
-	}
-	
-	public void testInsert5() throws Exception {
-		TextEdit e1= new InsertEdit(10, "xx");
-		fRoot.addChild(e1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer length", 12, fDocument.getLength());
-		assertEquals(fRoot, 10, 2);
-		assertEquals(e1, 10, 2);
-		assertEquals("Buffer content", "0123456789xx", fDocument.get());
-		doUndoRedo(undo, "0123456789xx");
-	}
-	
-	public void testInsertReplace1() throws Exception {
-		TextEdit e1= new ReplaceEdit(2, 1, "y");
-		TextEdit e2= new InsertEdit(2, "xx");
-		fRoot.addChild(e1);
-		fRoot.addChild(e2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(fRoot, 2, 3);
-		assertEquals(e1, 4, 1);
-		assertEquals(e2, 2, 2);
-		assertEquals("Buffer content", "01xxy3456789", fDocument.get());
-		doUndoRedo(undo, "01xxy3456789");
-	}
-	
-	public void testDelete1() throws Exception {
-		TextEdit e1= new DeleteEdit(3, 1);
-		fRoot.addChild(e1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(fRoot, 3, 0);
-		assertEquals(e1, 3, 0);
-		assertEquals("Buffer content", "012456789", fDocument.get());
-		doUndoRedo(undo, "012456789");
-	}
-	
-	public void testDelete2() throws Exception {
-		TextEdit e1= new DeleteEdit(4, 1);
-		TextEdit e2= new DeleteEdit(3, 1);
-		TextEdit e3= new DeleteEdit(5, 1);
-		fRoot.addChild(e1);
-		fRoot.addChild(e2);
-		fRoot.addChild(e3);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(fRoot, 3, 0);
-		assertEquals(e1, 3, 0);
-		assertEquals(e2, 3, 0);
-		assertEquals(e3, 3, 0);
-		assertEquals("Buffer content", "0126789", fDocument.get());
-		doUndoRedo(undo, "0126789");
-	}
-	
-	public void testDelete3() throws Exception {
-		TextEdit e1= new InsertEdit(3, "x");
-		TextEdit e2= new DeleteEdit(3, 1);
-		fRoot.addChild(e1);
-		fRoot.addChild(e2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(fRoot, 3, 1);
-		assertEquals(e1, 3, 1);
-		assertEquals(e2, 4, 0);
-		assertEquals("Buffer content", "012x456789", fDocument.get());
-		doUndoRedo(undo, "012x456789");
-	}
-	
-	public void testDeleteWithChildren() throws Exception {
-		TextEdit e1= new DeleteEdit(2, 6);
-		MultiTextEdit e2= new MultiTextEdit(3, 3);
-		e1.addChild(e2);
-		TextEdit e3= new ReplaceEdit(3, 1, "xx");
-		TextEdit e4= new ReplaceEdit(5, 1, "yy");
-		e2.addChild(e3);
-		e2.addChild(e4);
-		fRoot.addChild(e1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0189", fDocument.get());
-		assertEquals(fRoot, 2, 0);
-		assertEquals(e1, 2, 0);
-		assertTrue(e2.isDeleted());
-		assertTrue(e3.isDeleted());
-		assertTrue(e4.isDeleted());
-		doUndoRedo(undo, "0189");
-	}
-	
-	public void testTreeUpdate1() throws Exception {
-		MultiTextEdit m1= new MultiTextEdit();
-		TextEdit e1= new InsertEdit(2, "aa");
-		TextEdit e2= new InsertEdit(4, "bb");
-		m1.addChild(e1);
-		m1.addChild(e2);
-		MultiTextEdit m2= new MultiTextEdit();
-		TextEdit e3= new InsertEdit(6, "cc");
-		TextEdit e4= new InsertEdit(8, "dd");
-		m2.addChild(e3);
-		m2.addChild(e4);
-		fRoot.addChild(m1);
-		fRoot.addChild(m2);
-		assertEquals(m1, 2, 2);
-		assertEquals(m2, 6, 2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "01aa23bb45cc67dd89", fDocument.get());
-		assertEquals(e1, 2, 2);
-		assertEquals(e2, 6, 2);
-		assertEquals(e3, 10, 2);
-		assertEquals(e4, 14, 2);
-		assertEquals(m1, 2, 6);
-		assertEquals(m2, 10, 6);
-		assertEquals(fRoot, 2, 14);
-		doUndoRedo(undo, "01aa23bb45cc67dd89");
-	}
-	
-	public void testMove1() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(5, s1);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0142356789", fDocument.get());
-		assertEquals(s1, 2, 0);
-		assertEquals(t1, 3, 2);
-		doUndoRedo(undo, "0142356789");
-	}
-	
-	public void testMove2() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(5, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(2, s1);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0156234789", fDocument.get());
-		assertEquals(s1, 7, 0);
-		assertEquals(t1, 2, 2);
-		doUndoRedo(undo, "0156234789");
-	}
-
-	public void testMove3() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(7, s1);
-		TextEdit e2= new ReplaceEdit(4, 1, "x");
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		fRoot.addChild(e2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "01x5623789", fDocument.get());
-		assertEquals(s1, 2, 0);
-		assertEquals(t1, 5, 2);
-		assertEquals(e2, 2, 1);
-		doUndoRedo(undo, "01x5623789");
-	}
-	
-	public void testMove4() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(7, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(2, s1);
-		TextEdit e2= new ReplaceEdit(5, 1, "x");
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		fRoot.addChild(e2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0178234x69", fDocument.get());
-		assertEquals(s1, 9, 0);
-		assertEquals(t1, 2, 2);
-		assertEquals(e2, 7, 1);
-		doUndoRedo(undo, "0178234x69");
-	}
-	
-	public void testMove5() throws Exception {
-		// Move onto itself
-		MoveSourceEdit s1= new MoveSourceEdit(2, 1);
-		MoveTargetEdit t1= new MoveTargetEdit(3, s1);
-		TextEdit e2= new ReplaceEdit(2, 1, "x");
-		s1.addChild(e2);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 2, 0);
-		assertEquals(t1, 2, 1);
-		assertEquals(e2, 2, 1);
-		assertEquals("Buffer content", "01x3456789", fDocument.get());
-		doUndoRedo(undo, "01x3456789");
-	}
-	
-	public void testMove6() throws Exception {
-		// Move onto itself
-		MoveSourceEdit s1= new MoveSourceEdit(2, 1);
-		MoveTargetEdit t1= new MoveTargetEdit(2, s1);
-		TextEdit e2= new ReplaceEdit(2, 1, "x");
-		s1.addChild(e2);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 3, 0);
-		assertEquals(t1, 2, 1);
-		assertEquals(e2, 2, 1);
-		assertEquals("Buffer content", "01x3456789", fDocument.get());
-		doUndoRedo(undo,"01x3456789");
-	}
-	
-	public void testMove7() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 3);
-		MoveTargetEdit t1= new MoveTargetEdit(7, s1);
-		TextEdit e2= new ReplaceEdit(3, 1, "x");
-		s1.addChild(e2);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "01562x4789", fDocument.get());
-		assertEquals(s1, 2, 0);
-		assertEquals(t1, 4, 3);
-		assertEquals(e2, 5, 1);
-		doUndoRedo(undo, "01562x4789");
-	}
-	
-	public void testMove8() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(5, 3);
-		MoveTargetEdit t1= new MoveTargetEdit(1, s1);
-		TextEdit e2= new ReplaceEdit(6, 1, "x");
-		s1.addChild(e2);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "05x7123489", fDocument.get());
-		assertEquals(s1, 8, 0);
-		assertEquals(t1, 1, 3);
-		assertEquals(e2, 2, 1);
-		doUndoRedo(undo, "05x7123489");
-	}
-		
-	public void testMove9() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(1, 3);
-		MoveTargetEdit t1= new MoveTargetEdit(5, s1);
-		
-		MoveSourceEdit s2= new MoveSourceEdit(1, 1);
-		MoveTargetEdit t2= new MoveTargetEdit(3, s2);
-		s1.addChild(s2);
-		s1.addChild(t2);
-		
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 1, 0);
-		assertEquals(t1, 2, 3);
-		
-		assertEquals(s2, 2, 0);
-		assertEquals(t2, 3, 1);
-		assertEquals("Buffer content", "0421356789", fDocument.get());
-		doUndoRedo(undo, "0421356789");
-	}
-	
-	public void testMove10() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(8, s1);
-		MoveSourceEdit s2= new MoveSourceEdit(5, 2);
-		MoveTargetEdit t2= new MoveTargetEdit(1, s2);
-		
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		fRoot.addChild(s2);
-		fRoot.addChild(t2);
-		
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 4, 0);
-		assertEquals(t1, 6, 2);		
-		assertEquals(s2, 5, 0);
-		assertEquals(t2, 1, 2);
-		assertEquals("Buffer content", "0561472389", fDocument.get());
-		doUndoRedo(undo, "0561472389");		
-	}
-	
-	public void testMoveWithRangeMarker() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(5, s1);
-		
-		RangeMarker marker= new RangeMarker(2, 2);
-		s1.addChild(marker);		
-		
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0142356789", fDocument.get());
-		assertEquals(s1, 2, 0);
-		assertEquals(t1, 3, 2);
-		assertEquals(marker, 3, 2);
-		doUndoRedo(undo, "0142356789");
-	}
-	
-	public void testMoveWithTargetDelete() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 3);
-		MoveTargetEdit t1= new MoveTargetEdit(7, s1);
-		TextEdit e2= new DeleteEdit(6, 2);
-		e2.addChild(t1);
-		fRoot.addChild(s1);
-		fRoot.addChild(e2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "01589", fDocument.get());
-		assertEquals(s1, 2, 0);
-		assertTrue(t1.isDeleted());
-		assertEquals(e2, 3, 0);
-		doUndoRedo(undo, "01589");
-	}
-	
-	public void testMoveUpWithSourceDelete() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(5, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(2, s1);
-		
-		TextEdit d1= new DeleteEdit(5, 2);
-		d1.addChild(s1);
-		
-		RangeMarker marker= new RangeMarker(5, 2);
-		s1.addChild(marker);		
-		
-		fRoot.addChild(d1);
-		fRoot.addChild(t1);
-		
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0156234789", fDocument.get());
-		assertEquals(t1, 2, 2);
-		assertEquals(marker, 2, 2);
-		assertTrue(s1.isDeleted());
-		assertEquals(d1, 7, 0);
-		doUndoRedo(undo, "0156234789");
-	}		
-	
-	public void testMoveDown() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 2);
-		TextEdit i1= new InsertEdit(5, "x");
-		MoveTargetEdit t1= new MoveTargetEdit(7, s1);
-		TextEdit d1= new DeleteEdit(9, 1);
-	
-		RangeMarker m1= new RangeMarker(2, 2);
-		s1.addChild(m1);
-		
-		fRoot.addChild(s1);
-		fRoot.addChild(i1);
-		fRoot.addChild(t1);
-		fRoot.addChild(d1);
-		
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "014x562378", fDocument.get());
-		assertEquals(s1, 2, 0);
-		assertEquals(i1, 3, 1);
-		assertEquals(t1, 6, 2);
-		assertEquals(m1, 6, 2);
-		assertEquals(d1, 10, 0);
-		doUndoRedo(undo, "014x562378");
-	}		
-		
-	public void testMoveUp() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(7, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(2, s1);
-		TextEdit i1= new InsertEdit(5, "x");
-		TextEdit d1= new DeleteEdit(9, 1);
-	
-		RangeMarker m1= new RangeMarker(7, 2);
-		s1.addChild(m1);
-		
-		fRoot.addChild(s1);
-		fRoot.addChild(i1);
-		fRoot.addChild(t1);
-		fRoot.addChild(d1);
-		
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0178234x56", fDocument.get());
-		assertEquals(s1, 10, 0);
-		assertEquals(i1, 7, 1);
-		assertEquals(t1, 2, 2);
-		assertEquals(m1, 2, 2);
-		assertEquals(d1, 10, 0);
-		doUndoRedo(undo, "0178234x56");
-	}		
-		
-	public void testMoveDownWithSourceDelete() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(7, s1);
-	
-		TextEdit d1= new DeleteEdit(2, 2);
-		d1.addChild(s1);
-		
-		RangeMarker m1= new RangeMarker(2, 2);
-		s1.addChild(m1);
-		
-		fRoot.addChild(t1);
-		fRoot.addChild(d1);
-		
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0145623789", fDocument.get());
-		assertEquals(d1, 2, 0);
-		assertTrue(s1.isDeleted());
-		assertEquals(t1, 5, 2);
-		assertEquals(m1, 5, 2);
-		doUndoRedo(undo, "0145623789");
-	}		
-	
-	public void testMoveUpWithInnerMark() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(7, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(2, s1);
-		TextEdit m= new ReplaceEdit(4, 1, "yy");
-		fRoot.addChild(t1);
-		fRoot.addChild(m);
-		fRoot.addChild(s1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "017823yy569", fDocument.get());
-		assertEquals(s1, 10, 0);
-		assertEquals(t1, 2, 2);
-		assertEquals(m, 6, 2);
-		doUndoRedo(undo, "017823yy569");
-	}	
-	
-	public void testMoveDownWithInnerMark() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(2, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(7, s1);
-		TextEdit m= new ReplaceEdit(4, 1, "yy");
-		fRoot.addChild(t1);
-		fRoot.addChild(m);
-		fRoot.addChild(s1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "01yy5623789", fDocument.get());
-		assertEquals(s1, 2, 0);
-		assertEquals(t1, 6, 2);
-		assertEquals(m, 2, 2);
-		doUndoRedo(undo, "01yy5623789");
-	}	
-	
-	public void testMoveUpWithParentMark() throws Exception {
-		RangeMarker m= new RangeMarker(2, 6);
-		MoveSourceEdit s1= new MoveSourceEdit(4, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(3, s1);
-		m.addChild(s1);
-		m.addChild(t1);
-		fRoot.addChild(m);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0124536789", fDocument.get());
-		assertEquals(m, 2, 6);
-		assertEquals(t1, 3, 2);
-		assertEquals(s1, 6, 0);		
-		doUndoRedo(undo, "0124536789");		
-	}
-	
-	public void testMoveDownWithParentMark() throws Exception {
-		RangeMarker m= new RangeMarker(2, 6);
-		MoveSourceEdit s1= new MoveSourceEdit(2, 2);
-		MoveTargetEdit t1= new MoveTargetEdit(5, s1);
-		m.addChild(s1);
-		m.addChild(t1);
-		fRoot.addChild(m);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals("Buffer content", "0142356789", fDocument.get());
-		assertEquals(m, 2, 6);
-		assertEquals(t1, 3, 2);
-		assertEquals(s1, 2, 0);		
-		doUndoRedo(undo, "0142356789");		
-	}
-	
-	public void testNestedMoveSource() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(1, 5);
-		MoveSourceEdit s2= new MoveSourceEdit(2, 3);
-		MoveSourceEdit s3= new MoveSourceEdit(3, 1);
-		s1.addChild(s2);
-		s2.addChild(s3);
-		MoveTargetEdit t1= new MoveTargetEdit(9, s1);
-		MoveTargetEdit t2= new MoveTargetEdit(8, s2);
-		MoveTargetEdit t3= new MoveTargetEdit(7, s3);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		fRoot.addChild(t2);
-		fRoot.addChild(t3);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 1, 0);
-		assertEquals(s2, 8, 0);
-		assertEquals(s3, 5, 0);
-		assertEquals(t1, 7, 2);
-		assertEquals(t2, 4, 2);
-		assertEquals(t3, 2, 1);
-		String result= "0637248159";
-		assertEquals("Buffer content", result, fDocument.get());
-		doUndoRedo(undo, result);		
-	}
-	
-	public void testNestedMoveTarget() throws Exception {
-		MoveSourceEdit s1= new MoveSourceEdit(1, 2);
-		MoveSourceEdit s2= new MoveSourceEdit(5, 3);
-		MoveTargetEdit t1= new MoveTargetEdit(6, s1);
-		MoveTargetEdit t2= new MoveTargetEdit(9, s2);
-		s2.addChild(t1);
-		fRoot.addChild(s1);
-		fRoot.addChild(s2);
-		fRoot.addChild(t2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 1, 0);
-		assertEquals(s2, 3, 0);
-		assertEquals(t1, 5, 2);
-		assertEquals(t2, 4, 5);
-		String result= "0348512679";
-		assertEquals("Buffer content", result, fDocument.get());
-		doUndoRedo(undo, result);		
-	}
-	
-	public void testCopyDown() throws Exception {
-		CopySourceEdit s1= new CopySourceEdit(2, 3);
-		CopyTargetEdit t1= new CopyTargetEdit(8, s1);
-		
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 2, 3);
-		assertEquals(t1, 8, 3);
-		String result= "0123456723489";
-		assertEquals("Buffer content", result, fDocument.get());
-		doUndoRedo(undo, result);		
-	}
-	
-	public void testCopyUp() throws Exception {
-		CopySourceEdit s1= new CopySourceEdit(7, 2);
-		CopyTargetEdit t1= new CopyTargetEdit(3, s1);
-		
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 9, 2);
-		assertEquals(t1, 3, 2);
-		String result= "012783456789";
-		assertEquals("Buffer content", result, fDocument.get());
-		doUndoRedo(undo, result);		
-	}
-	
-	public void testDoubleCopy() throws Exception {
-		CopySourceEdit s1= new CopySourceEdit(5, 2);
-		CopyTargetEdit t1= new CopyTargetEdit(8, s1);
-		CopySourceEdit s2= new CopySourceEdit(5, 2);
-		CopyTargetEdit t2= new CopyTargetEdit(2, s2);
-		s1.addChild(s2);
-		
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		fRoot.addChild(t2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 7, 2);
-		assertEquals(t1, 10, 2);
-		assertEquals(s2, 7, 2);
-		assertEquals(t2, 2, 2);
-		String result= "01562345675689";
-		assertEquals("Buffer content", result, fDocument.get());
-		doUndoRedo(undo, result);		
-	}
-	
-	public void testNestedCopySource() throws Exception {
-		CopySourceEdit s1= new CopySourceEdit(1, 5);
-		CopySourceEdit s2= new CopySourceEdit(2, 3);
-		CopySourceEdit s3= new CopySourceEdit(3, 1);
-		s1.addChild(s2);
-		s2.addChild(s3);
-		CopyTargetEdit t1= new CopyTargetEdit(9, s1);
-		CopyTargetEdit t2= new CopyTargetEdit(8, s2);
-		CopyTargetEdit t3= new CopyTargetEdit(7, s3);
-		fRoot.addChild(s1);
-		fRoot.addChild(t1);
-		fRoot.addChild(t2);
-		fRoot.addChild(t3);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 1, 5);
-		assertEquals(s2, 2, 3);
-		assertEquals(s3, 3, 1);
-		assertEquals(t1, 13, 5);
-		assertEquals(t2, 9, 3);
-		assertEquals(t3, 7, 1);
-		String result= "0123456372348123459";
-		assertEquals("Buffer content", result, fDocument.get());
-		doUndoRedo(undo, result);		
-	}
-	
-	public void testNestedCopyTarget() throws Exception {
-		CopySourceEdit s1= new CopySourceEdit(1, 2);
-		CopySourceEdit s2= new CopySourceEdit(5, 3);
-		CopyTargetEdit t1= new CopyTargetEdit(6, s1);
-		CopyTargetEdit t2= new CopyTargetEdit(9, s2);
-		s2.addChild(t1);
-		fRoot.addChild(s1);
-		fRoot.addChild(s2);
-		fRoot.addChild(t2);
-		UndoEdit undo= fRoot.apply(fDocument);
-		assertEquals(s1, 1, 2);
-		assertEquals(s2, 5, 5);
-		assertEquals(t1, 6, 2);
-		assertEquals(t2, 11, 5);
-		String result= "01234512678512679";
-		assertEquals("Buffer content", result, fDocument.get());
-		doUndoRedo(undo, result);		
-	}
-	
-	public void testSwap1() throws Exception {
-		IDocument document= new Document("foo(1, 2), 3");
-		
-		MultiTextEdit root= new MultiTextEdit();
-		{
-			CopySourceEdit innerRoot= new CopySourceEdit(0, 9);
-			
-			TextEdit e1= new ReplaceEdit(0, 9, "");
-			e1.addChild(innerRoot);
-			CopyTargetEdit t1= new CopyTargetEdit(11, innerRoot);
-			
-			TextEdit e2= new ReplaceEdit(11, 1, "");
-			CopySourceEdit s2= new CopySourceEdit(11, 1);
-			e2.addChild(s2);
-			CopyTargetEdit t2= new CopyTargetEdit(0, s2);
-
-			root.addChild(e1);
-			root.addChild(t2);
-			root.addChild(e2);				
-			root.addChild(t1);
-		}
-		
-		root.apply(document);
-
-		String result= "3, foo(1, 2)";
-		assertEquals("Buffer content", result, document.get());
-	}
-	
-	public void testSwap2() throws Exception {
-		IDocument document= new Document("foo(1, 2), 3");
-		
-		MultiTextEdit root= new MultiTextEdit();
-		{
-			TextEdit e1= new ReplaceEdit(4, 1, "");
-			CopySourceEdit s1= new CopySourceEdit(4, 1);
-			e1.addChild(s1);
-			CopyTargetEdit t1= new CopyTargetEdit(7, s1);
-			
-			TextEdit e2= new ReplaceEdit(7, 1, "");
-			CopySourceEdit s2= new CopySourceEdit(7, 1);
-			e2.addChild(s2);
-			CopyTargetEdit t2= new CopyTargetEdit(4, s2);
-			
-			root.addChild(e1);
-			root.addChild(t2);
-			root.addChild(e2);				
-			root.addChild(t1);
-		}
-		
-		root.apply(document);
-
-		String result= "foo(2, 1), 3";
-		assertEquals("Buffer content", result, document.get());
-	}	
-	
-	public void testSwap2InSwap1() throws Exception {
-		IDocument document= new Document("foo(1, 2), 3");
-		
-		CopySourceEdit innerRoot= new CopySourceEdit(0, 9);
-		{
-			TextEdit e1= new ReplaceEdit(4, 1, "");
-			CopySourceEdit s1= new CopySourceEdit(4, 1);
-			e1.addChild(s1);
-			CopyTargetEdit t1= new CopyTargetEdit(7, s1);
-			
-			TextEdit e2= new ReplaceEdit(7, 1, "");
-			CopySourceEdit s2= new CopySourceEdit(7, 1);
-			e2.addChild(s2);
-			CopyTargetEdit t2= new CopyTargetEdit(4, s2);
-			
-			innerRoot.addChild(e1);
-			innerRoot.addChild(t2);
-			innerRoot.addChild(e2);				
-			innerRoot.addChild(t1);
-		}
-		MultiTextEdit root= new MultiTextEdit();
-		{
-			TextEdit e1= new ReplaceEdit(0, 9, "");
-			e1.addChild(innerRoot);
-			CopyTargetEdit t1= new CopyTargetEdit(11, innerRoot);
-			
-			TextEdit e2= new ReplaceEdit(11, 1, "");
-			CopySourceEdit s2= new CopySourceEdit(11, 1);
-			e2.addChild(s2);
-			CopyTargetEdit t2= new CopyTargetEdit(0, s2);
-
-			root.addChild(e1);
-			root.addChild(t2);
-			root.addChild(e2);				
-			root.addChild(t1);
-		}
-
-		root.apply(document);
-
-		String result= "3, foo(2, 1)";
-		assertEquals("Buffer content", result, document.get());
-	}	
-	
-	private void doUndoRedo(UndoEdit undo, String redoResult) throws Exception {
-		UndoEdit redo= undo.apply(fDocument);
-		assertBufferContent();
-		undo= redo.apply(fDocument);
-		assertEquals("Buffer content redo", redoResult, fDocument.get());
-		undo.apply(fDocument);
-		assertBufferContent();
-	}
-	
-	private void assertEquals(TextEdit edit, int offset, int length) {
-		assertEquals("Offset", offset, edit.getOffset());
-		assertEquals("Length", length, edit.getLength());	
-	}
-	
-	private void assertBufferContent() {
-		assertEquals("Buffer content restored", "0123456789", fDocument.get());
-	}		
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeHierarchyTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeHierarchyTest.java
deleted file mode 100644
index 3a11ebe..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeHierarchyTest.java
+++ /dev/null
@@ -1,303 +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.jdt.ui.tests.core;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.text.IDocument;
-
-import org.eclipse.ui.IEditorPart;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.ITypeHierarchyChangedListener;
-
-import org.eclipse.jdt.ui.JavaUI;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-
-public class TypeHierarchyTest extends TestCase {
-	
-	private static final Class THIS= TypeHierarchyTest.class;
-	
-	private IJavaProject fJavaProject1;
-	private IJavaProject fJavaProject2;
-	
-	public TypeHierarchyTest(String name) {
-		super(name);
-	}
-			
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new AllTypesCacheTest("testHierarchyWithWorkingCopy"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-	
-	protected void setUp() throws Exception {
-		fJavaProject1= ProjectTestSetup.getProject();
-		fJavaProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin");
-	}
-
-	protected void tearDown () throws Exception {
-		JavaProjectHelper.clear(fJavaProject1, ProjectTestSetup.getDefaultClasspath());
-		JavaProjectHelper.delete(fJavaProject2);		
-	}
-					
-	public void test1() throws Exception {
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		ICompilationUnit cu1= pack1.getCompilationUnit("A.java");
-		cu1.createType("public class A {\n}\n", null, true, null);
-		
-		JavaProjectHelper.addRTJar(fJavaProject2);
-		JavaProjectHelper.addRequiredProject(fJavaProject2, fJavaProject1);
-		IPackageFragmentRoot root2= JavaProjectHelper.addSourceContainer(fJavaProject2, "src");
-		IPackageFragment pack2= root2.createPackageFragment("pack2", true, null);
-		
-		ICompilationUnit cu2= pack2.getCompilationUnit("B.java");
-		IType type2= cu2.createType("public class B extends pack1.A {\n}\n", null, true, null);
-		
-		ITypeHierarchy hierarchy= type2.newSupertypeHierarchy(null);
-		IType[] allTypes= hierarchy.getAllTypes();
-		
-		assertTrue("Should contain 3 types, contains: " + allTypes.length, allTypes.length == 3);
-		
-		IType type= fJavaProject2.findType("pack1.A");
-		assertTrue("Type not found", type != null);
-
-	}
-	
-	
-	public void testHierarchyWithWorkingCopy1() throws Exception {
-		
-		if (!JavaPlugin.USE_WORKING_COPY_OWNERS) {
-			return;
-		}
-		
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		ICompilationUnit cu1= pack1.getCompilationUnit("A.java");
-		cu1.createType("public class A {\n}\n", null, true, null);
-		
-		IPackageFragment pack2= root1.createPackageFragment("pack2", true, null);
-		
-		ICompilationUnit cu2= pack2.getCompilationUnit("B.java");
-		IType type2= cu2.createType("public class B extends pack1.A {\n}\n", null, true, null);
-		
-		final int[] updateCount= new int[] {0};
-		
-		ITypeHierarchy hierarchy= type2.newSupertypeHierarchy(null);
-		hierarchy.addTypeHierarchyChangedListener(new ITypeHierarchyChangedListener() {
-			public void typeHierarchyChanged(ITypeHierarchy typeHierarchy) {
-				updateCount[0]++;
-			}
-		});
-		
-		IType[] allTypes= hierarchy.getAllTypes();
-		
-		assertTrue("Should contain 3 types, contains: " + allTypes.length, allTypes.length == 3);
-		assertTrue("Update count should be 0, is: " + updateCount[0], updateCount[0] == 0);
-		
-		IEditorPart part= EditorUtility.openInEditor(type2);
-		try {
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			String superType= "pack1.A";
-			
-			int offset= document.get().indexOf(superType);
-			
-			document.replace(offset, superType.length(), "Object");
-			
-			allTypes= hierarchy.getAllTypes();
-		
-			// no update of hierarchies on working copies
-			assertTrue("Update count should be 0, is: " + updateCount[0], updateCount[0] == 0);
-			assertTrue("Should contain 3 types, contains: " + allTypes.length, allTypes.length == 3);
-			
-			part.doSave(null);
-			hierarchy.refresh(null);
-			
-			allTypes= hierarchy.getAllTypes();
-		
-			// update after save
-			assertTrue("Update count should be 1, is: " + updateCount[0], updateCount[0] == 1);
-			hierarchy.refresh(null);
-			assertTrue("Should contain 2 types, contains: " + allTypes.length, allTypes.length == 2);
-			
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-		
-		allTypes= hierarchy.getAllTypes();
-		
-		// update after save
-		assertTrue("Update count should be 1, is: " + updateCount[0], updateCount[0] == 1);
-		assertTrue("Should contain 2 types, contains: " + allTypes.length, allTypes.length == 2);
-
-
-	}
-	
-	public void testHierarchyWithWorkingCopy2() throws Exception {
-		
-		if (!JavaPlugin.USE_WORKING_COPY_OWNERS) {
-			return;
-		}
-		
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		ICompilationUnit cu1= pack1.getCompilationUnit("A.java");
-		cu1.createType("public class A {\n}\n", null, true, null);
-		
-		IPackageFragment pack2= root1.createPackageFragment("pack2", true, null);
-		
-		ICompilationUnit cu2= pack2.getCompilationUnit("B.java");
-		IType type2= cu2.createType("public class B extends pack1.A {\n}\n", null, true, null);
-			
-		IEditorPart part= EditorUtility.openInEditor(type2);
-
-		final int[] updateCount= new int[] {0};
-		
-		// create on type in working copy
-		ITypeHierarchy hierarchy= type2.newSupertypeHierarchy(null);
-		hierarchy.addTypeHierarchyChangedListener(new ITypeHierarchyChangedListener() {
-			public void typeHierarchyChanged(ITypeHierarchy typeHierarchy) {
-				updateCount[0]++;
-			}
-		});
-		
-		IType[] allTypes= hierarchy.getAllTypes();
-	
-		assertTrue("Update count should be 0, is: " + updateCount[0], updateCount[0] == 0);
-		assertTrue("Should contain 3 types, contains: " + allTypes.length, allTypes.length == 3);
-		
-		try {
-			
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			String superType= "pack1.A";
-			
-			int offset= document.get().indexOf(superType);
-			
-			document.replace(offset, superType.length(), "Object");
-			
-			allTypes= hierarchy.getAllTypes();
-		
-			// no update of hierarchies on working copies
-			assertTrue("Update count should be 0, is: " + updateCount[0], updateCount[0] == 0);
-			assertTrue("Should contain 3 types, contains: " + allTypes.length, allTypes.length == 3);
-			
-			part.doSave(null);
-			hierarchy.refresh(null);
-			
-			allTypes= hierarchy.getAllTypes();
-		
-			// update after save
-			assertTrue("Update count should be 1, is: " + updateCount[0], updateCount[0] == 1);
-			hierarchy.refresh(null);
-			assertTrue("Should contain 2 types, contains: " + allTypes.length, allTypes.length == 2);
-
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-		
-		allTypes= hierarchy.getAllTypes();
-		
-		// update after save
-		assertTrue("Update count should be 1, is: " + updateCount[0], updateCount[0] == 1);
-		assertTrue("Should contain 2 types, contains: " + allTypes.length, allTypes.length == 2);	
-
-	}
-	
-	public void testHierarchyWithWorkingCopy3() throws Exception {
-		
-		if (!JavaPlugin.USE_WORKING_COPY_OWNERS) {
-			return;
-		}
-		
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJavaProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("pack1", true, null);
-		
-		ICompilationUnit cu1= pack1.getCompilationUnit("A.java");
-		cu1.createType("public class A {\n}\n", null, true, null);
-		
-		IPackageFragment pack2= root1.createPackageFragment("pack2", true, null);
-		
-		ICompilationUnit cu2= pack2.getCompilationUnit("B.java");
-		IType type2= cu2.createType("public class B extends pack1.A {\n}\n", null, true, null);
-		
-		// open editor -> working copy will be created
-		IEditorPart part= EditorUtility.openInEditor(type2);
-
-		final int[] updateCount= new int[] {0};
-		
-		// create on type in working copy
-		ITypeHierarchy hierarchy= type2.newSupertypeHierarchy(null);
-		hierarchy.addTypeHierarchyChangedListener(new ITypeHierarchyChangedListener() {
-			public void typeHierarchyChanged(ITypeHierarchy typeHierarchy) {
-				updateCount[0]++;
-			}
-		});
-		
-		IType[] allTypes= hierarchy.getAllTypes();
-	
-		assertTrue("Should contain 3 types, contains: " + allTypes.length, allTypes.length == 3);
-		assertTrue("Update count should be 0, is: " + updateCount[0], updateCount[0] == 0);
-		
-		try {			
-			IDocument document= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			String superType= "pack1.A";
-			
-			int offset= document.get().indexOf(superType);
-			// modify source
-			document.replace(offset, superType.length(), "Object");
-			
-			allTypes= hierarchy.getAllTypes();
-		
-			// no update of hierarchies on working copies
-			assertTrue("Should contain 3 types, contains: " + allTypes.length, allTypes.length == 3);
-			assertTrue("Update count should be 0, is: " + updateCount[0], updateCount[0] == 0);
-			
-			// no save
-			
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-		
-		allTypes= hierarchy.getAllTypes();
-		
-		// update after save
-		assertTrue("Should contain 3 types, contains: " + allTypes.length, allTypes.length == 3);
-		assertTrue("Update count should be 0, is: " + updateCount[0], updateCount[0] == 0);
-
-	}
-	
-	
-
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeInfoTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeInfoTest.java
deleted file mode 100644
index 572c118..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeInfoTest.java
+++ /dev/null
@@ -1,316 +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.jdt.ui.tests.core;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.ITypeNameRequestor;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.internal.corext.util.AllTypesCache;
-import org.eclipse.jdt.internal.corext.util.IFileTypeInfo;
-import org.eclipse.jdt.internal.corext.util.JarFileEntryTypeInfo;
-import org.eclipse.jdt.internal.corext.util.TypeInfo;
-import org.eclipse.jdt.internal.corext.util.TypeInfoRequestor;
-
-
-public class TypeInfoTest extends TestCase {
-	
-	private static final Class THIS= TypeInfoTest.class;
-	
-	private IJavaProject fJProject1;
-	private IJavaProject fJProject2;
-
-	public TypeInfoTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new TypeInfoTest("test1"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-	protected void setUp() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		assertNotNull("jre is null", JavaProjectHelper.addRTJar(fJProject1));
-		
-		fJProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin");
-		assertNotNull("jre is null", JavaProjectHelper.addRTJar(fJProject2));		
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.delete(fJProject1);
-		JavaProjectHelper.delete(fJProject2);		
-		
-	}
-
-
-	public void test1() throws Exception {
-		
-		// add Junit source to project 2
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("Junit source", junitSrcArchive != null && junitSrcArchive.exists());
-		JavaProjectHelper.addSourceContainerWithImport(fJProject2, "src", junitSrcArchive);
-	
-		// source folder
-		IPackageFragmentRoot root1= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		IPackageFragment pack1= root1.createPackageFragment("com.oti", true, null);
-		ICompilationUnit cu1= pack1.getCompilationUnit("V.java");
-		cu1.createType("public class V {\n static class VInner {\n}\n}\n", null, true, null);
-
-		// proj1 has proj2 as prerequisit
-		JavaProjectHelper.addRequiredProject(fJProject1, fJProject2);
-
-		// internal jar
-		//IPackageFragmentRoot root2= JavaProjectHelper.addLibraryWithImport(fJProject1, JARFILE, null, null);
-		ArrayList result= new ArrayList();
-
-		IJavaElement[] elements= new IJavaElement[] { fJProject1 };
-		IJavaSearchScope scope= SearchEngine.createJavaSearchScope(elements);
-		ITypeNameRequestor requestor= new TypeInfoRequestor(result);
-		SearchEngine engine= new SearchEngine();
-
-		engine.searchAllTypeNames(
-			fJProject1.getJavaModel().getWorkspace(),
-			null, 
-			new char[] {'V'}, 
-			IJavaSearchConstants.PREFIX_MATCH, 
-			IJavaSearchConstants.CASE_INSENSITIVE, 
-			IJavaSearchConstants.TYPE, 
-			scope, 
-			requestor, 
-			IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, 
-			null); 
-		findTypeRef(result, "com.oti.V");
-		findTypeRef(result, "com.oti.V.VInner");
-		findTypeRef(result, "java.lang.VerifyError");
-		findTypeRef(result, "java.lang.Void");
-		findTypeRef(result, "java.util.Vector");
-		findTypeRef(result, "junit.samples.VectorTest");
-
-		
-		for (int i= 0; i < result.size(); i++) {
-			TypeInfo ref= (TypeInfo) result.get(i);
-			//System.out.println(ref.getTypeName());
-			IType resolvedType= ref.resolveType(scope);
-			if (resolvedType == null) {
-				assertTrue("Could not be resolved: " + ref.toString(), false);
-			}
-		}
-		assertTrue("Should find 9 elements, is " + result.size(), result.size() == 9);
-
-
-	}
-	
-	private void findTypeRef(List refs, String fullname) {
-		for (int i= 0; i <refs.size(); i++) {
-			TypeInfo curr= (TypeInfo) refs.get(i);
-			if (fullname.equals(curr.getFullyQualifiedName())) {
-				return;
-			}
-		}
-		assertTrue("Type not found: " + fullname, false);
-	}
-		
-	
-	public void test2() throws Exception {	
-		ArrayList result= new ArrayList();
-		
-		// add Junit source to project 2
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("Junit source", junitSrcArchive != null && junitSrcArchive.exists());
-		JavaProjectHelper.addSourceContainerWithImport(fJProject2, "src", junitSrcArchive);
-		
-		
-		IJavaProject[] elements= new IJavaProject[] { fJProject2 };
-		IJavaSearchScope scope= SearchEngine.createJavaSearchScope(elements);
-		ITypeNameRequestor requestor= new TypeInfoRequestor(result);
-		SearchEngine engine= new SearchEngine();
-
-		engine.searchAllTypeNames(
-			fJProject1.getJavaModel().getWorkspace(),
-			null, 
-			new char[] {'T'}, 
-			IJavaSearchConstants.PREFIX_MATCH, 
-			IJavaSearchConstants.CASE_INSENSITIVE, 
-			IJavaSearchConstants.TYPE, 
-			scope, 
-			requestor, 
-			IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, 
-			null); 
-
-		findTypeRef(result, "junit.extensions.TestDecorator");
-		findTypeRef(result, "junit.framework.Test");
-		findTypeRef(result, "junit.framework.TestListener");
-		findTypeRef(result, "junit.tests.TestCaseTest.TornDown");
-
-		assertTrue("Should find 37 elements, is " + result.size(), result.size() == 37);
-		//System.out.println("Elements found: " + result.size());
-		for (int i= 0; i < result.size(); i++) {
-			TypeInfo ref= (TypeInfo) result.get(i);
-			//System.out.println(ref.getTypeName());
-			IType resolvedType= ref.resolveType(scope);
-			if (resolvedType == null) {
-				assertTrue("Could not be resolved: " + ref.toString(), false);
-			}
-		}
-	}
-	
-	
-	
-	
-	
-	public void testNoSourceFolder() throws Exception {
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJProject1, "");
-		IPackageFragment pack1= root.createPackageFragment("", true, null);
-		ICompilationUnit cu1= pack1.getCompilationUnit("A.java");
-		cu1.createType("public class A {\n}\n", null, true, null);		
-
-		IPackageFragment pack2= root.createPackageFragment("org.eclipse", true, null);
-		ICompilationUnit cu2= pack2.getCompilationUnit("B.java");
-		cu2.createType("public class B {\n}\n", null, true, null);
-		
-		TypeInfo[] result= AllTypesCache.getAllTypes(new NullProgressMonitor());
-		for (int i= 0; i < result.length; i++) {
-			TypeInfo info= result[i];
-			if (info.getElementType() == TypeInfo.IFILE_TYPE_INFO) {
-				IFileTypeInfo fileInfo= (IFileTypeInfo)info;
-				if (info.getTypeName().equals("A")) {
-					assertEquals(info.getPackageName(), "");
-					assertEquals(fileInfo.getProject(), "TestProject1");
-					assertNull(fileInfo.getFolder());
-					assertEquals(fileInfo.getFileName(), "A");
-					assertEquals(fileInfo.getExtension(), "java");
-				} else if (info.getTypeName().equals("B")) {
-					assertEquals(info.getPackageName(), "org.eclipse");
-					assertEquals(fileInfo.getProject(), "TestProject1");
-					assertNull(fileInfo.getFolder());
-					assertEquals(fileInfo.getFileName(), "B");
-					assertEquals(fileInfo.getExtension(), "java");
-				}
-			}
-		}
-	}
-
-	public void testSourceFolder() throws Exception {
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		IPackageFragment pack1= root.createPackageFragment("", true, null);
-		ICompilationUnit cu1= pack1.getCompilationUnit("A.java");
-		cu1.createType("public class A {\n}\n", null, true, null);		
-
-		IPackageFragment pack2= root.createPackageFragment("org.eclipse", true, null);
-		ICompilationUnit cu2= pack2.getCompilationUnit("B.java");
-		cu2.createType("public class B {\n}\n", null, true, null);
-		
-		TypeInfo[] result= AllTypesCache.getAllTypes(new NullProgressMonitor());
-		for (int i= 0; i < result.length; i++) {
-			TypeInfo info= result[i];
-			if (info.getElementType() == TypeInfo.IFILE_TYPE_INFO) {
-				IFileTypeInfo fileInfo= (IFileTypeInfo)info;
-				if (info.getTypeName().equals("A")) {
-					assertEquals(info.getPackageName(), "");
-					assertEquals(fileInfo.getProject(), "TestProject1");
-					assertEquals(fileInfo.getFolder(), "src");
-					assertEquals(fileInfo.getFileName(), "A");
-					assertEquals(fileInfo.getExtension(), "java");
-				} else if (info.getTypeName().equals("B")) {
-					assertEquals(info.getPackageName(), "org.eclipse");
-					assertEquals(fileInfo.getProject(), "TestProject1");
-					assertEquals(fileInfo.getFolder(), "src");
-					assertEquals(fileInfo.getFileName(), "B");
-					assertEquals(fileInfo.getExtension(), "java");
-				}
-			}
-		}
-	}
-	
-	public void testJar() throws Exception {
-		TypeInfo[] result= AllTypesCache.getAllTypes(new NullProgressMonitor());
-		for (int i= 0; i < result.length; i++) {
-			TypeInfo info= result[i];
-			if (info.getElementType() == TypeInfo.JAR_FILE_ENTRY_TYPE_INFO) {
-				JarFileEntryTypeInfo jarInfo= (JarFileEntryTypeInfo)info;
-				if (info.getTypeName().equals("Object")) {
-					assertEquals(info.getPackageName(), "java.lang");
-					assertTrue(jarInfo.getJar().endsWith("rtstubs.jar"));
-					assertEquals(jarInfo.getFileName(), "Object");
-					assertEquals(jarInfo.getExtension(), "class");
-				}
-			}
-		}		
-	}
-
-	public void test_bug44772() throws Exception {
-		File lib= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.MYLIB);
-
-		JavaProjectHelper.addLibraryWithImport(fJProject1, new Path(lib.getPath()), null, null); // as internal 
-		JavaProjectHelper.addLibrary(fJProject1, new Path(lib.getPath())); // and as external
-		
-		ArrayList result= new ArrayList();
-
-		IJavaElement[] elements= new IJavaElement[] { fJProject1 };
-		IJavaSearchScope scope= SearchEngine.createJavaSearchScope(elements);
-		ITypeNameRequestor requestor= new TypeInfoRequestor(result);
-		SearchEngine engine= new SearchEngine();
-
-		engine.searchAllTypeNames(
-			fJProject1.getJavaModel().getWorkspace(),
-			null, 
-			"Foo".toCharArray(),
-			IJavaSearchConstants.EXACT_MATCH, 
-			IJavaSearchConstants.CASE_SENSITIVE, 
-			IJavaSearchConstants.TYPE, 
-			scope, 
-			requestor, 
-			IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, 
-			null); 
-		assertEquals("result size", result.size(), 2);
-		IType type1= ((TypeInfo) result.get(0)).resolveType(scope);
-		IType type2= ((TypeInfo) result.get(1)).resolveType(scope);
-		
-		assertNotNull(type1);
-		assertNotNull(type2);
-		assertFalse(type1.equals(type2));
-
-	}
-
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeRulesTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeRulesTest.java
deleted file mode 100644
index d153c55..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/TypeRulesTest.java
+++ /dev/null
@@ -1,199 +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.jdt.ui.tests.core;
-
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.ITypeBinding;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-
-import org.eclipse.jdt.internal.corext.dom.TypeRules;
-
-
-public class TypeRulesTest extends CoreTests {
-	
-	private static final Class THIS= TypeRulesTest.class;
-	
-	private IJavaProject fJProject1;
-
-	private IPackageFragmentRoot fSourceFolder;
-
-	public TypeRulesTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new TypeRulesTest("test1"));
-			return new ProjectTestSetup(suite);
-		}	
-	}
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.COMPILER_PB_NO_EFFECT_ASSIGNMENT, JavaCore.IGNORE);
-		options.put(JavaCore.COMPILER_PB_UNNECESSARY_TYPE_CHECK, JavaCore.IGNORE);
-		options.put(JavaCore.COMPILER_PB_UNUSED_LOCAL, JavaCore.IGNORE);
-		JavaCore.setOptions(options);
-		
-		fJProject1= ProjectTestSetup.getProject();
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	
-	private VariableDeclarationFragment[] createVariables() throws JavaModelException {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.util.Collection;\n");
-		buf.append("import java.io.Serializable;\n");
-		buf.append("import java.net.Socket;\n");
-		buf.append("public class E {\n");
-		buf.append("    boolean bool= false;\n");
-		buf.append("    char c= 0;\n");
-		buf.append("    byte b= 0;\n");
-		buf.append("    short s= 0;\n");
-		buf.append("    int i= 0;\n");
-		buf.append("    long l= 0;\n");
-		buf.append("    float f= 0;\n");
-		buf.append("    double d= 0;\n");
-		buf.append("    Object object= null;\n");
-		buf.append("    Vector vector= null;\n");
-		buf.append("    Socket socket= null;\n");
-		buf.append("    Cloneable cloneable= null;\n");
-		buf.append("    Collection collection= null;\n");
-		buf.append("    Serializable serializable= null;\n");
-		buf.append("    Object[] objectArr= null;\n");
-		buf.append("    int[] int_arr= null;\n");
-		buf.append("    long[] long_arr= null;\n");
-		buf.append("    Vector[] vector_arr= null;\n");
-		buf.append("    Socket[] socket_arr= null;\n");
-		buf.append("    Collection[] collection_arr= null;\n");
-		buf.append("    Object[][] objectArrArr= null;\n");
-		buf.append("    Collection[][] collection_arrarr= null;\n");
-		buf.append("    Vector[][] vector_arrarr= null;\n");
-		buf.append("    Socket[][] socket_arrarr= null;\n");
-		buf.append("}\n");
-		ICompilationUnit cu1=pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		IProblem[] problems= astRoot.getProblems();
-		assertNumberOf("problems", problems.length, 0);
-		
-		TypeDeclaration type= (TypeDeclaration) astRoot.types().get(0);
-		FieldDeclaration[] fields= type.getFields();
-		
-		VariableDeclarationFragment[] targets= new VariableDeclarationFragment[fields.length];
-		for (int i= 0; i < fields.length; i++) {
-			targets[i]= (VariableDeclarationFragment) fields[i].fragments().get(0);
-		}
-		return targets;
-	}
-	
-	public void testCanAssign() throws Exception {
-		VariableDeclarationFragment[] targets= createVariables();
-		
-		for (int k= 0; k < targets.length; k++) {
-			for (int n= 0; n < targets.length; n++) {
-				VariableDeclarationFragment f1= targets[k];
-				VariableDeclarationFragment f2= targets[n];
-				String line= f2.getName().getIdentifier() + "= " + f1.getName().getIdentifier();
-				
-				StringBuffer buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class F extends E {\n");
-				buf.append("    void foo() {\n");
-				buf.append("        ").append(line).append(";\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				char[] content= buf.toString().toCharArray();
-				
-				CompilationUnit astRoot= AST.parseCompilationUnit(content, "F.java", fJProject1);
-				IProblem[] problems= astRoot.getProblems();
-
-				ITypeBinding b1= f1.resolveBinding().getType();
-				assertNotNull(b1);
-				ITypeBinding b2= f2.resolveBinding().getType();
-				assertNotNull(b2);
-				boolean res= TypeRules.canAssign(b1, b2.getQualifiedName());
-				assertEquals(line, problems.length == 0, res);
-				boolean res2= TypeRules.canAssign(b1, b2);
-				assertEquals(line, problems.length == 0, res2);			
-			}	
-		}
-	}
-	
-	public void testCanCast() throws Exception {
-		VariableDeclarationFragment[] targets= createVariables();
-		for (int k= 0; k < targets.length; k++) {
-			for (int n= 0; n < targets.length; n++) {
-				VariableDeclarationFragment f1= targets[k];
-				VariableDeclarationFragment f2= targets[n];
-				
-				String castType= f2.resolveBinding().getType().getQualifiedName();
-				String line= castType + " x= (" + castType + ") " + f1.getName().getIdentifier();
-				
-				StringBuffer buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class F extends E {\n");
-				buf.append("    void foo() {\n");
-				buf.append("        ").append(line).append(";\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				char[] content= buf.toString().toCharArray();
-				
-				CompilationUnit astRoot= AST.parseCompilationUnit(content, "F.java", fJProject1);
-				IProblem[] problems= astRoot.getProblems();
-
-				ITypeBinding b1= f1.resolveBinding().getType();
-				assertNotNull(b1);
-				ITypeBinding b2= f2.resolveBinding().getType();
-				assertNotNull(b2);
-				boolean res= TypeRules.canCast(b2, b1);
-				if (res != (problems.length == 0)) {
-					res= TypeRules.canCast(b2, b1);
-					assertTrue(line, false);
-				}
-			}	
-		}
-	}
-		
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/DialogsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/DialogsTest.java
deleted file mode 100644
index 9247bce..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/DialogsTest.java
+++ /dev/null
@@ -1,204 +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.jdt.ui.tests.dialogs;
-
-import java.util.ArrayList;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.core.search.SearchEngine;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.util.DialogCheck;
-
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.JavaElementSorter;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-
-import org.eclipse.jdt.internal.corext.util.AllTypesCache;
-import org.eclipse.jdt.internal.corext.util.TypeInfo;
-import org.eclipse.jdt.internal.ui.JavaUIMessages;
-import org.eclipse.jdt.internal.ui.dialogs.MultiElementListSelectionDialog;
-import org.eclipse.jdt.internal.ui.dialogs.OpenTypeSelectionDialog;
-import org.eclipse.jdt.internal.ui.util.TypeInfoLabelProvider;
-import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
-
-public class DialogsTest extends TestCase {
-	
-	private static final String PROJECT_NAME = "DummyProject";
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite(DialogsTest.class.getName());
-//		suite.addTest(new DialogsTest("testElementListSelectionDialog2"));
-		suite.addTest(new DialogsTest("testElementListSelectionDialog"));
-		suite.addTest(new DialogsTest("testMultiElementSelectionDialog"));
-		suite.addTest(new DialogsTest("testTwoPaneSelectionDialog"));
-		suite.addTest(new DialogsTest("testElementTreeSelectionDialog"));
-		suite.addTest(new DialogsTest("testElementListSelectionDialog"));
-		return suite;
-	}
-
-	public DialogsTest(String name) {
-		super(name);
-	}
-	private Shell getShell() {
-		return DialogCheck.getShell();
-	}
-	public void testTwoPaneSelectionDialog() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		JavaProjectHelper.addSourceContainer(jproject, "src1");
-		JavaProjectHelper.addRTJar(jproject);
-		
-		OpenTypeSelectionDialog dialog= new OpenTypeSelectionDialog(getShell(), new ProgressMonitorDialog(getShell()), 
-			IJavaSearchConstants.TYPE, SearchEngine.createWorkspaceScope());
-	
-		dialog.setTitle(JavaUIMessages.getString("OpenTypeAction.dialogTitle")); //$NON-NLS-1$
-		dialog.setMessage(JavaUIMessages.getString("OpenTypeAction.dialogMessage")); //$NON-NLS-1$
-
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);
-	}
-	
-	private TypeInfo[] getRefs(ArrayList list, int off, int len) {
-		TypeInfo[] res= new TypeInfo[len];
-		for (int i= 0; i < len; i++) {
-			res[i]= (TypeInfo) list.get(off + i);
-		}
-		return res;
-	}
-	
-	public void testMultiElementSelectionDialog() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		JavaProjectHelper.addSourceContainer(jproject, "src1");
-		JavaProjectHelper.addRTJar(jproject);
-
-		ILabelProvider labelProvider= new TypeInfoLabelProvider(TypeInfoLabelProvider.SHOW_FULLYQUALIFIED);
-
-		ArrayList list= new ArrayList(200);
-
-		IJavaSearchScope searchScope= SearchEngine.createJavaSearchScope(new IJavaElement[] { jproject });		
-		AllTypesCache.getTypes(searchScope, IJavaSearchConstants.TYPE, null, list);
-		
-		MultiElementListSelectionDialog dialog= new MultiElementListSelectionDialog(getShell(), labelProvider);
-		dialog.setTitle("Title"); //$NON-NLS-1$
-		dialog.setMessage("Description:"); //$NON-NLS-1$
-	
-		assertTrue(list.size() > 15);
-		TypeInfo[][] refs= new TypeInfo[][] { getRefs(list, 0, 3), getRefs(list, 4, 6), getRefs(list, 10, 5) };
-		dialog.setElements(refs);
-		dialog.setInitialSelections(new Object[refs.length]);
-		
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);		
-	
-	}
-	
-	public void testElementTreeSelectionDialog() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		JavaProjectHelper.addSourceContainer(jproject, "src1");
-		Object initSelection= JavaProjectHelper.addSourceContainer(jproject, "src2");
-
-		IJavaProject jproject2= JavaProjectHelper.createJavaProject("Project2", "bin");
-		JavaProjectHelper.addSourceContainer(jproject2, "src1");
-		JavaProjectHelper.addSourceContainer(jproject2, "src2");
-
-		StandardJavaElementContentProvider provider= new StandardJavaElementContentProvider();
-		ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT); 
-		ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog(getShell(), labelProvider, provider);
-		dialog.setSorter(new JavaElementSorter());
-		dialog.setTitle(NewWizardMessages.getString("ContainerPage.ChooseSourceContainerDialog.title")); //$NON-NLS-1$
-		dialog.setMessage(NewWizardMessages.getString("ContainerPage.ChooseSourceContainerDialog.description")); //$NON-NLS-1$
-		
-		dialog.setInput(jproject.getJavaModel());
-		dialog.setInitialSelection(initSelection);
-		
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);	
-		JavaProjectHelper.delete(jproject2);
-	}
-	
-	public void testElementListSelectionDialog() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root=  JavaProjectHelper.addRTJar(jproject);
-		assertTrue(root != null);
-		Object[] elements= root.getChildren();
-
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT));
-		dialog.setIgnoreCase(false);
-		dialog.setTitle(NewWizardMessages.getString("TypePage.ChoosePackageDialog.title")); //$NON-NLS-1$
-		dialog.setMessage(NewWizardMessages.getString("TypePage.ChoosePackageDialog.description")); //$NON-NLS-1$
-		dialog.setEmptyListMessage(NewWizardMessages.getString("TypePage.ChoosePackageDialog.empty")); //$NON-NLS-1$		
-		dialog.setElements(elements);
-		
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);	
-	}
-	
-
-	private static class TestLabelProvider extends LabelProvider {
-		public Image getImage(Object element) {
-			return null;
-		}
-		
-		public String getText(Object element) {
-			Integer i= (Integer) element;			
-			return "e-" + i.toString();
-		}
-	}
-
-	public void testElementListSelectionDialog2() throws Exception {
-		Object[] elements= new Integer[] {
-			new Integer(0),
-			new Integer(1),
-			new Integer(2),
-			new Integer(7),
-			new Integer(12),
-			new Integer(42)			
-		};
-
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(getShell(), new TestLabelProvider());
-		dialog.setIgnoreCase(false);
-		dialog.setTitle(NewWizardMessages.getString("TypePage.ChoosePackageDialog.title")); //$NON-NLS-1$
-		dialog.setMessage(NewWizardMessages.getString("TypePage.ChoosePackageDialog.description")); //$NON-NLS-1$
-		dialog.setEmptyListMessage(NewWizardMessages.getString("TypePage.ChoosePackageDialog.empty")); //$NON-NLS-1$		
-		dialog.setElements(elements);
-		dialog.setInitialSelections(new Object[] {new Integer(7)});
-		
-		DialogCheck.assertDialog(dialog);
-		
-		Object[] results= dialog.getResult();
-		assertTrue(results.length == 1);
-		assertEquals(new Integer(7), results[0]);
-	}
-
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/DialogsTest2.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/DialogsTest2.java
deleted file mode 100644
index e5fe434..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/DialogsTest2.java
+++ /dev/null
@@ -1,83 +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.jdt.ui.tests.dialogs;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-
-import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog;
-
-import org.eclipse.jdt.core.IJavaProject;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.util.DialogCheck;
-
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.JavaElementSorter;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-
-public class DialogsTest2 extends TestCase {
-	
-	private static final String PROJECT_NAME = "DummyProject";
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite(DialogsTest2.class.getName());
-		suite.addTest(new DialogsTest2("testCheckedTreeSelectionDialog"));
-		suite.addTest(new DialogsTest2("testCheckedTreeSelectionDialog"));
-		return suite;
-	}
-
-	public DialogsTest2(String name) {
-		super(name);
-	}
-	private Shell getShell() {
-		return DialogCheck.getShell();
-	}
-	public void testCheckedTreeSelectionDialog() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		JavaProjectHelper.addSourceContainer(jproject, "src1");
-		Object initSelection= JavaProjectHelper.addSourceContainer(jproject, "src2");
-
-		IJavaProject jproject2= JavaProjectHelper.createJavaProject("Project2", "bin");
-		JavaProjectHelper.addSourceContainer(jproject2, "src1");
-		JavaProjectHelper.addSourceContainer(jproject2, "src2");
-
-		StandardJavaElementContentProvider provider= new StandardJavaElementContentProvider();
-		ILabelProvider labelProvider= new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT); 
-		CheckedTreeSelectionDialog dialog= new CheckedTreeSelectionDialog(getShell(), labelProvider, provider);
-		dialog.setSorter(new JavaElementSorter());
-		dialog.setTitle("Title"); //$NON-NLS-1$
-		dialog.setMessage("Select the elements"); //$NON-NLS-1$
-		
-		dialog.setInput(jproject.getJavaModel());
-		dialog.setInitialSelection(initSelection);
-		dialog.setExpandedElements(new Object[] { initSelection, jproject });
-		
-		DialogCheck.assertDialog(dialog);
-		
-		System.out.println("Result:");
-		Object[] checkedElements= dialog.getResult();
-		for (int i= 0; i < checkedElements.length; i++) {
-			System.out.println(labelProvider.getText(checkedElements[i]));
-		}
-		
-		
-		JavaProjectHelper.delete(jproject);	
-		JavaProjectHelper.delete(jproject2);
-	}
-
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/PreferencesTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/PreferencesTest.java
deleted file mode 100644
index ec97317..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/PreferencesTest.java
+++ /dev/null
@@ -1,325 +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.jdt.ui.tests.dialogs;
-
-import java.util.Iterator;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-import org.eclipse.ui.help.WorkbenchHelp;
-import org.eclipse.ui.internal.IHelpContextIds;
-import org.eclipse.ui.internal.WorkbenchMessages;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.dialogs.PropertyDialog;
-import org.eclipse.ui.internal.dialogs.PropertyPageContributorManager;
-import org.eclipse.ui.internal.dialogs.PropertyPageManager;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.util.DialogCheck;
-
-public class PreferencesTest extends TestCase {
-	
-	public static Test suite() {
-		TestSuite suite= new TestSuite(PreferencesTest.class.getName());
-		suite.addTest(new PreferencesTest("testJavaBasePrefPage"));
-		suite.addTest(new PreferencesTest("testClasspathVarPrefPage"));
-		suite.addTest(new PreferencesTest("testCodeFormatterPrefPage"));
-		suite.addTest(new PreferencesTest("testExecArgPropPage"));
-		suite.addTest(new PreferencesTest("testImportOrganizePrefPage"));
-		suite.addTest(new PreferencesTest("testInfoPropPage"));
-		suite.addTest(new PreferencesTest("testJARSourceAttachmentPropPage"));
-		suite.addTest(new PreferencesTest("testJavaBasePrefPage"));
-		suite.addTest(new PreferencesTest("testJavaCompilerPrefPage"));
-		suite.addTest(new PreferencesTest("testJavaDebugPrefPage"));
-		suite.addTest(new PreferencesTest("testJavaEditorPrefPage"));
-		suite.addTest(new PreferencesTest("testNoExecArgPropPage"));
-		suite.addTest(new PreferencesTest("testRefactoringPrefPage"));
-		suite.addTest(new PreferencesTest("testVMPrefPage"));
-		suite.addTest(new PreferencesTest("testVMPropPage"));
-		suite.addTest(new PreferencesTest("testVSourceLookupPage"));
-		suite.addTest(new PreferencesTest("testVariableSourceAttachmentPropPage"));					
-		return suite;
-	}	
-	
-	private static class PreferenceDialogWrapper extends PreferenceDialog {
-		
-		public PreferenceDialogWrapper(Shell parentShell, PreferenceManager manager) {
-			super(parentShell, manager);
-		}
-		protected boolean showPage(IPreferenceNode node) {
-			return super.showPage(node);
-		}
-	}
-	
-	private class PropertyDialogWrapper extends PropertyDialog {
-		
-		public PropertyDialogWrapper(Shell parentShell, PreferenceManager manager, ISelection selection) {
-			super(parentShell, manager, selection);
-		}
-		protected boolean showPage(IPreferenceNode node) {
-			return super.showPage(node);
-		}
-	}		
-	
-	
-	private boolean fIsInteractive= true;
-	
-	private static final String PROJECT_NAME = "DummyProject";
-	
-	public PreferencesTest(String name) {
-		super(name);
-	}
-
-	private Shell getShell() {
-		return DialogCheck.getShell();
-	}
-	
-	public void assertDialog(Dialog dialog, Assert assertTrue) {
-		if (fIsInteractive) {
-			DialogCheck.assertDialog(dialog);
-		} else {
-			DialogCheck.assertDialogTexts(dialog);
-		}
-	}
-	
-	
-	private PreferenceDialog getPreferenceDialog(String id) {
-		PreferenceDialogWrapper dialog = null;
-		PreferenceManager manager = WorkbenchPlugin.getDefault().getPreferenceManager();
-		if (manager != null) {
-			dialog = new PreferenceDialogWrapper(getShell(), manager);
-			dialog.create();	
-			WorkbenchHelp.setHelp(dialog.getShell(), IHelpContextIds.PREFERENCE_DIALOG);
-
-			for (Iterator iterator = manager.getElements(PreferenceManager.PRE_ORDER).iterator();
-			     iterator.hasNext();)
-			{
-				IPreferenceNode node = (IPreferenceNode)iterator.next();
-				if ( node.getId().equals(id) ) {
-					dialog.showPage(node);
-					break;
-				}
-			}
-		}
-		return dialog;
-	}
-	
-	private PropertyDialog getPropertyDialog(String id, IAdaptable element) {
-		PropertyDialogWrapper dialog = null;
-
-		PropertyPageManager manager = new PropertyPageManager();
-		String title = "";
-		String name  = "";
-
-		// load pages for the selection
-		// fill the manager with contributions from the matching contributors
-		PropertyPageContributorManager.getManager().contribute(manager, element);
-		
-		IWorkbenchAdapter adapter = (IWorkbenchAdapter)element.getAdapter(IWorkbenchAdapter.class);
-		if (adapter != null) {
-			name = adapter.getLabel(element);
-		}
-		
-		// testing if there are pages in the manager
-		Iterator pages = manager.getElements(PreferenceManager.PRE_ORDER).iterator();		
-		if (!pages.hasNext()) {
-			return null;
-		} else {
-			title = WorkbenchMessages.format("PropertyDialog.propertyMessage", new Object[] {name});
-			dialog = new PropertyDialogWrapper(getShell(), manager, new StructuredSelection(element)); 
-			dialog.create();
-			dialog.getShell().setText(title);
-			WorkbenchHelp.setHelp(dialog.getShell(), IHelpContextIds.PROPERTY_DIALOG);
-			for (Iterator iterator = manager.getElements(PreferenceManager.PRE_ORDER).iterator();
-			     iterator.hasNext();)
-			{
-				IPreferenceNode node = (IPreferenceNode)iterator.next();
-				if ( node.getId().equals(id) ) {
-					dialog.showPage(node);
-					break;
-				}
-			}
-		}
-		return dialog;
-	}
-	
-	public void testJavaBasePrefPage() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.preferences.JavaBasePreferencePage");
-		assertDialog(dialog, this);
-	}
-	
-	public void testImportOrganizePrefPage() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.preferences.ImportOrganizePreferencePage");
-		assertDialog(dialog, this);
-	}
-	
-	public void testCodeFormatterPrefPage() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.preferences.CodeFormatterPreferencePage");
-		assertDialog(dialog, this);
-	}
-	
-	public void testClasspathVarPrefPage() throws Exception {
-		IPath path= ResourcesPlugin.getWorkspace().getRoot().getLocation();		
-		JavaCore.setClasspathVariable("DUMMY_VAR", path, null);
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.preferences.ClasspathVariablesPreferencePage");
-		assertDialog(dialog, this);
-		JavaCore.removeClasspathVariable("DUMMY_VAR", null);
-	}
-	
-	public void testJavaEditorPrefPage() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.preferences.JavaEditorPreferencePage");
-		assertDialog(dialog, this);
-	}
-	
-	public void testJavaCompilerPrefPage() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.preferences.CompilerPreferencePage");
-		assertDialog(dialog, this);
-	}
-	
-	public void testJavaDebugPrefPage() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.JavaDebugPreferencePage");
-		assertDialog(dialog, this);
-	}
-	
-	public void testRefactoringPrefPage() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.preferences.RefactoringPreferencePage");
-		assertDialog(dialog, this);
-	}
-	
-	public void testVMPrefPage() {
-		Dialog dialog = getPreferenceDialog("org.eclipse.jdt.ui.preferences.VMPreferencePage");
-		assertDialog(dialog, this);
-	}
-
-	public void testBuildPathPropPage() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		JavaProjectHelper.addSourceContainer(jproject, "src");
-		JavaProjectHelper.addRTJar(jproject);
-		IJavaProject dep1= JavaProjectHelper.createJavaProject("OtherProject", "bin");
-		JavaProjectHelper.addRequiredProject(jproject, dep1);
-		
-		Dialog dialog = getPropertyDialog("org.eclipse.jdt.ui.propertyPages.BuildPathsPropertyPage", jproject);
-		assertDialog(dialog, this);
-		JavaProjectHelper.delete(jproject);
-		JavaProjectHelper.delete(dep1);
-	}
-	
-	public void testJARSourceAttachmentPropPage() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addRTJar(jproject);
-		assertTrue(root != null);
-		
-		Dialog dialog = getPropertyDialog("org.eclipse.jdt.ui.propertyPages.SourceAttachmentPage1", root);
-		assertDialog(dialog, this);
-		
-		JavaProjectHelper.delete(jproject);
-	}
-	
-	public void testVariableSourceAttachmentPropPage() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addVariableRTJar(jproject, "VAR_LIB", "VAR_SRC", "VAR_SRCROOT");
-		assertTrue(root != null);
-		
-		Dialog dialog = getPropertyDialog("org.eclipse.jdt.ui.propertyPages.SourceAttachmentPage1", root);
-		assertDialog(dialog, this);
-		
-		JavaProjectHelper.delete(jproject);
-		JavaCore.removeClasspathVariable("VAR_LIB", null);
-		JavaCore.removeClasspathVariable("VAR_SRC", null);
-		JavaCore.removeClasspathVariable("VAR_SRCROOT", null);
-	}
-	
-	public void testInfoPropPage() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(jproject, "src");
-		IPackageFragment pack= root.createPackageFragment("org.eclipse.jdt.internal.ui.wizards.dummy", true, null);
-		ICompilationUnit cu= pack.getCompilationUnit("DummyCompilationUnitWizard.java");
-		cu.createType("public class DummyCompilationUnitWizard {\n\n}\n", null, true, null);	
-		
-		Dialog dialog = getPropertyDialog("org.eclipse.jdt.ui.propertyPages.InfoPage", cu);
-		assertDialog(dialog, this);
-		
-		JavaProjectHelper.delete(jproject);
-	}
-	
-	public void testNoExecArgPropPage() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(jproject, "src");
-		IPackageFragment pack= root.createPackageFragment("org.eclipse.jdt.internal.ui.hello", true, null);
-		ICompilationUnit cu= pack.getCompilationUnit("HelloWorld.java");
-		cu.createType("public class HelloWorld {\n\n}\n", null, true, null);	
-	
-		Dialog dialog = getPropertyDialog("org.eclipse.jdt.ui.propertyPages.ExecutionArgsPage", cu);
-		assertDialog(dialog, this);
-		
-		JavaProjectHelper.delete(jproject);
-	}	
-	
-	public void testExecArgPropPage() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(jproject, "src");
-		IPackageFragment pack= root.createPackageFragment("org.eclipse.jdt.internal.ui.hello", true, null);
-		ICompilationUnit cu= pack.getCompilationUnit("HelloWorld.java");
-		cu.createType("public class HelloWorld {\npublic static void main(String[] args) {}\n}\n", null, true, null);	
-	
-		Dialog dialog = getPropertyDialog("org.eclipse.jdt.ui.propertyPages.ExecutionArgsPage", cu);
-		assertDialog(dialog, this);
-		
-		JavaProjectHelper.delete(jproject);
-	}	
-		
-
-	public void testVMPropPage() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-
-		Dialog dialog = getPropertyDialog("org.eclipse.jdt.ui.propertyPages.VMPropertyPage", jproject);
-		assertDialog(dialog, this);
-		
-		JavaProjectHelper.delete(jproject);
-	}	
-	
-	public void testVSourceLookupPage() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IJavaProject dep1= JavaProjectHelper.createJavaProject("OtherProject", "bin");
-		JavaProjectHelper.addRequiredProject(jproject, dep1);
-		
-		Dialog dialog = getPropertyDialog("org.eclipse.jdt.ui.launching.SourceLookupPage", jproject);
-		assertDialog(dialog, this);
-		
-		JavaProjectHelper.delete(jproject);
-		JavaProjectHelper.delete(dep1);
-	}	
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/WizardsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/WizardsTest.java
deleted file mode 100644
index a84d2a4..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/dialogs/WizardsTest.java
+++ /dev/null
@@ -1,172 +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.jdt.ui.tests.dialogs;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.swt.widgets.Shell;
-
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.wizard.WizardDialog;
-
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.util.DialogCheck;
-
-import org.eclipse.jdt.internal.ui.jarpackager.JarPackageWizard;
-import org.eclipse.jdt.internal.ui.wizards.NewClassCreationWizard;
-import org.eclipse.jdt.internal.ui.wizards.NewInterfaceCreationWizard;
-import org.eclipse.jdt.internal.ui.wizards.NewPackageCreationWizard;
-import org.eclipse.jdt.internal.ui.wizards.NewProjectCreationWizard;
-import org.eclipse.jdt.internal.ui.wizards.NewSnippetFileCreationWizard;
-import org.eclipse.jdt.internal.ui.wizards.NewSourceFolderCreationWizard;
-
-public class WizardsTest extends TestCase {
-	
-	private static final String PROJECT_NAME = "DummyProject";
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite(WizardsTest.class.getName());
-		suite.addTest(new WizardsTest("testClassWizard"));
-		suite.addTest(new WizardsTest("testInterfaceWizard"));
-		suite.addTest(new WizardsTest("testJarPackageWizard"));
-		suite.addTest(new WizardsTest("testNewProjectWizard"));
-		suite.addTest(new WizardsTest("testPackageWizard"));
-		suite.addTest(new WizardsTest("testScrapbookWizard"));
-		suite.addTest(new WizardsTest("testSourceFolderWizard"));				
-		return suite;
-	}		
-	
-	public WizardsTest(String name) {
-		super(name);
-	}
-	private Shell getShell() {
-		return DialogCheck.getShell();
-	}
-	private IWorkbench getWorkbench() {
-		return WorkbenchPlugin.getDefault().getWorkbench();
-	}
-	
-	public void testNewProjectWizard() throws Exception {	
-		NewProjectCreationWizard wizard = new NewProjectCreationWizard();
-		wizard.init(getWorkbench(),  null);
-		wizard.setForcePreviousAndNextButtons(true);
-		WizardDialog dialog = new WizardDialog(getShell(), wizard);
-		dialog.create();
-		DialogCheck.assertDialog(dialog);
-	}
-	
-	public void testSourceFolderWizard() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		JavaProjectHelper.addSourceContainer(jproject, "src1");
-		JavaProjectHelper.addRTJar(jproject);
-	
-		NewSourceFolderCreationWizard wizard = new NewSourceFolderCreationWizard();
-		wizard.init(getWorkbench(), new StructuredSelection(jproject));
-		wizard.setForcePreviousAndNextButtons(true);
-		WizardDialog dialog = new WizardDialog(getShell(), wizard);
-		dialog.create();
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);
-	}
-	
-	public void testPackageWizard() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(jproject, "src1");
-		JavaProjectHelper.addRTJar(jproject);
-	
-		NewPackageCreationWizard wizard = new NewPackageCreationWizard();
-		wizard.init(getWorkbench(), new StructuredSelection(root));
-		wizard.setForcePreviousAndNextButtons(true);
-		WizardDialog dialog = new WizardDialog(getShell(), wizard);
-		dialog.create();
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);
-	}
-	
-	public void testClassWizard() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(jproject, "src1");
-		IPackageFragment pack= root.createPackageFragment("org.eclipse.jdt.internal.ui.hello", true, null);
-		JavaProjectHelper.addRTJar(jproject);
-	
-		NewClassCreationWizard wizard = new NewClassCreationWizard();
-		wizard.init(getWorkbench(), new StructuredSelection(pack));
-		wizard.setForcePreviousAndNextButtons(true);
-		WizardDialog dialog = new WizardDialog(getShell(), wizard);
-		dialog.create();
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);
-	}
-	
-	public void testInterfaceWizard() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(jproject, "src1");
-		IPackageFragment pack= root.createPackageFragment("org.eclipse.jdt.internal.ui.hello", true, null);
-		JavaProjectHelper.addRTJar(jproject);
-	
-		NewInterfaceCreationWizard wizard = new NewInterfaceCreationWizard();
-		wizard.init(getWorkbench(), new StructuredSelection(pack));
-		wizard.setForcePreviousAndNextButtons(true);
-		WizardDialog dialog = new WizardDialog(getShell(), wizard);
-		dialog.create();
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);
-	}
-	
-	public void testScrapbookWizard() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(jproject, "src1");
-		JavaProjectHelper.addRTJar(jproject);
-	
-		NewSnippetFileCreationWizard wizard = new NewSnippetFileCreationWizard();
-		wizard.init(getWorkbench(), new StructuredSelection(root));
-		wizard.setForcePreviousAndNextButtons(true);
-		WizardDialog dialog = new WizardDialog(getShell(), wizard);
-		dialog.create();
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);
-	}
-	
-	public void testJarPackageWizard() throws Exception {
-		IJavaProject jproject= JavaProjectHelper.createJavaProject(PROJECT_NAME, "bin");
-		IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(jproject, "src1");
-		JavaProjectHelper.addRTJar(jproject);
-		IPackageFragment pack= root.createPackageFragment("org.eclipse.jdt.internal.ui.hello", true, null);
-		ICompilationUnit cu= pack.getCompilationUnit("HelloWorld.java");
-		cu.createType("public class HelloWorld {\npublic static void main(String[] args) {}\n}\n", null, true, null);	
-	
-		JarPackageWizard wizard = new JarPackageWizard();
-		wizard.init(getWorkbench(), new StructuredSelection(root));
-		wizard.setForcePreviousAndNextButtons(true);
-		WizardDialog dialog = new WizardDialog(getShell(), wizard);
-		dialog.create();
-		DialogCheck.assertDialog(dialog);
-		
-		JavaProjectHelper.delete(jproject);
-	}				
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests1.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests1.java
deleted file mode 100644
index 476a51d..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests1.java
+++ /dev/null
@@ -1,453 +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.jdt.ui.tests.packageview;
-
-
-import java.util.ArrayList;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-/**
- * Tests for the PackageExplorerContentProvider.
- * 
- * @since 2.1
- */
-public class ContentProviderTests1 extends TestCase {
-
-
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite("org.eclipse.jdt.ui.ContentProviderTests1"); //$NON-NLS-1$
-		//$JUnit-BEGIN$
-	   suite.addTestSuite(ContentProviderTests1.class);
-		//$JUnit-END$
-		return suite;
-	}
-
-	private IJavaProject fJProject1;
-	private IJavaProject fJProject2;
-	
-	private IPackageFragmentRoot fRoot1;
-	private IPackageFragment fPack1;
-	private IPackageFragment fPack2;
-	private IPackageFragment fPack4;
-	private IPackageFragment fPack3;
-	private IWorkspace fWorkspace;
-	private IWorkbench fWorkbench;
-	private MockPluginView fMyPart;
-	
-	private ITreeContentProvider fProvider;
-	private IPackageFragmentRoot fArchiveFragmentRoot;
-	private IPackageFragment fPackJunit;
-	private IPackageFragment fPackJunitSamples;
-	private IPackageFragment fPackJunitSamplesMoney;
-
-	private IPackageFragment fPack5;
-	private IPackageFragment fPack6;
-	private IFile fFile1;
-	private IFile fFile2;
-	private ICompilationUnit fCUIMoney;
-	private ICompilationUnit fCUMoney;
-	private ICompilationUnit fCUMoneyBag;
-	private ICompilationUnit fCUMoneyTest;
-	
-	private ICompilationUnit fCU1;
-	private ICompilationUnit fCU2;
-	
-	private IWorkbenchPage page;
-	private ICompilationUnit fCUAllTests;
-	private ICompilationUnit fCUVectorTest;
-	private ICompilationUnit fCUSimpleTest;
-	private boolean fEnableAutoBuildAfterTesting;
-	private ICompilationUnit fCU3;
-	
-	public ContentProviderTests1(String name) {
-		super(name);
-	}
-	
-	//---------Test for getChildren-------------------
-
-	public void testGetChildrenProjectWithSourceFolders() throws Exception{
-		Object[] expectedChildren= new Object[]{fRoot1, fFile1, fFile2};
-		Object[] children= fProvider.getChildren(fJProject2);
-		assertTrue("Wrong children found for project", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	
-	public void testGetChildrentMidLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{fPack4, fPack5};
-		Object[] children= fProvider.getChildren(fPack3);
-		assertTrue("Wrong children found for PackageFragment",compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{fCU1};
-		Object[] children= fProvider.getChildren(fPack2);
-		assertTrue("Wrong children found for PackageFragment",compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-
-	public void testGetChildrenMidLevelFragmentInArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{fPackJunitSamplesMoney, fCUAllTests, fCUSimpleTest, fCUVectorTest };
-		Object[] children= fProvider.getChildren(fPackJunitSamples);
-		assertTrue("wrong chidren found for mid level PackageFragment in Archive", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-
-	public void testGetChildrenBottomLevelFragmentInArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{fCUIMoney, fCUMoney, fCUMoneyBag, fCUMoneyTest};
-		Object[] children= fProvider.getChildren(fPackJunitSamplesMoney);
-		assertTrue("wrong children found for a bottom PackageFragment in PackageFragmentRoot Archive", compareArrays(children, expectedChildren));	//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenSourceFolder() throws Exception {
-		Object[] expectedChildren = new Object[] { fPack1, fPack2, fPack3, fRoot1.getPackageFragment("")};//$NON-NLS-1$
-		Object[] children = fProvider.getChildren(fRoot1);
-		assertTrue("Wrong children found for PackageFragmentRoot", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenArchive(){	Object[] expectedChildren= new Object[]{fPackJunit, fArchiveFragmentRoot.getPackageFragment("")};//$NON-NLS-1$
-		Object[] children= fProvider.getChildren(fArchiveFragmentRoot);
-		assertTrue("Wrong child found for PackageFragmentRoot Archive", compareArrays(children,expectedChildren));//$NON-NLS-1$
-	}
-	
-	//---------------Get Parent Tests-----------------------------
-	
-	public void testGetParentArchive() throws Exception{
-		Object parent= fProvider.getParent(fArchiveFragmentRoot);
-		assertTrue("Wrong parent found for PackageFragmentRoot Archive", parent==fJProject1);//$NON-NLS-1$
-	}
-
-	public void testGetParentMidLevelFragmentInArchive() throws Exception{
-		Object expectedParent= fPackJunitSamples;
-		Object parent= fProvider.getParent(fPackJunitSamplesMoney);
-		assertTrue("Wrong parent found for a NON top level PackageFragment in an Archive", expectedParent.equals(parent));//$NON-NLS-1$
-	}	
-	
-	public void testGetParentTopLevelFragmentInArchive() throws Exception{
-		Object expectedParent= fPackJunit;
-		Object parent= fProvider.getParent(fPackJunitSamples);
-		assertTrue("Wrong parent found for a top level PackageFragment in an Archive", expectedParent.equals(parent));	//$NON-NLS-1$
-	}
-	
-	public void testGetParentTopLevelFragment() throws Exception{
-		Object expectedParent= fRoot1;
-		Object parent= fProvider.getParent(fPack3);
-		assertTrue("Wrong parent found for a top level PackageFragment", expectedParent.equals(parent));//$NON-NLS-1$
-	}
-	
-	public void testGetParentMidLevelFragment() throws Exception{
-		Object expectedParent= fPack3;
-		Object parent= fProvider.getParent(fPack4);
-		assertTrue("Wrong parent found for a NON top level PackageFragment", expectedParent.equals(parent));//$NON-NLS-1$
-	}
-	
-	
-	public void testDeleteBottomLevelFragment() throws Exception{
-		
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener)fProvider;
-		IJavaElementDelta delta= TestDelta.createDelta(fPack4, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-		
-		//force events from dispaly
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-		
-		assertTrue("Remove happened", fMyPart.hasRemoveHappened());//$NON-NLS-1$
-		assertTrue("Correct Remove", fMyPart.getRemovedObject().contains(fPack4));//$NON-NLS-1$
-		assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size());//$NON-NLS-1$
-	}
-	
-	public void testAddBottomLevelFragment() throws Exception {
-		IPackageFragment test= fRoot1.createPackageFragment("test", true, null);//$NON-NLS-1$
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createDelta(test, IJavaElementDelta.ADDED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from dispaly
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-
-		assertTrue("Add happened", fMyPart.hasAddHappened()); //$NON-NLS-1$
-		assertTrue("Correct Add", test.equals(fMyPart.getAddedObject())); //$NON-NLS-1$
-		assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-
-	public void testChangedTopLevelPackageFragment() throws Exception {
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createDelta(fPack3, IJavaElementDelta.CHANGED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-
-		assertEquals("No refresh happened", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-	
-	public void testChangeBottomLevelPackageFragment() throws Exception{
-		//send a delta indicating fragment deleted
-		fMyPart.fRefreshedObjects= new ArrayList();
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createDelta(fPack6, IJavaElementDelta.CHANGED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-		
-		//force events from display
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-
-		assertEquals("No refresh happened", 0, fMyPart.getRefreshedObject().size());//$NON-NLS-1$
-	}
-		
-	public void testRemoveCUsFromPackageFragment() throws Exception{
-		
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[] { fCU2, fCU3 }, fPack6, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-		
-		//force events from display
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-		
-		assertTrue("Remove happened", fMyPart.hasRemoveHappened()); //$NON-NLS-1$
-		assertEquals("2 elements removed", 2, fMyPart.getRemovedObject().size()); //$NON-NLS-1$
-		assertTrue("Correct elements removed", fMyPart.getRemovedObject().contains(fCU2) && fMyPart.getRemovedObject().contains(fCU3)); //$NON-NLS-1$
-		assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-	
-	public void testRemoveCUFromPackageFragment() throws Exception {
-		
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[]{fCU2}, fPack6, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display			
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-
-		assertTrue("Remove happened", fMyPart.hasRemoveHappened()); //$NON-NLS-1$
-		assertTrue("Correct refresh", fMyPart.getRemovedObject().contains(fCU2)); //$NON-NLS-1$
-		assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-	
-
-	/**
-	 * @see TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		fWorkspace= ResourcesPlugin.getWorkspace();
-		assertNotNull(fWorkspace);
-		IWorkspaceDescription workspaceDesc= fWorkspace.getDescription();
-		fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding();
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(false);
-		
-		assertNotNull(fWorkspace);	
-		
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		fJProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		
-		assertNotNull("project1 null", fJProject1);//$NON-NLS-1$
-		assertNotNull("project2 null", fJProject2);//$NON-NLS-1$
-		
-		fJProject1.setRawClasspath(new IClasspathEntry[0], null);
-
-		Object[] resource= fJProject2.getNonJavaResources();
-		for (int i = 0; i < resource.length; i++) {
-			Object object = resource[i];
-			if(object instanceof IFile){
-				IFile file = (IFile) object;
-				if(".classpath".equals(file.getName()))//$NON-NLS-1$
-					fFile1= file;
-				else if (".project".equals(file.getName()))//$NON-NLS-1$
-					fFile2= file;
-			}
-		}
-		assertNotNull(fFile1);
-		assertNotNull(fFile2);
-		
-		//set up project #1 : External Jar and zip file
-		IPackageFragmentRoot jdk= JavaProjectHelper.addVariableRTJar(fJProject1, "JRE_LIB_TEST", null, null);//$NON-NLS-1$
-		assertTrue("jdk not found", jdk != null);//$NON-NLS-1$
-
-		java.io.File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());//$NON-NLS-1$
-
-		fArchiveFragmentRoot= JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);//$NON-NLS-1$
-		assertTrue("Unable to create zipfile archive",fArchiveFragmentRoot.exists());//$NON-NLS-1$
-		
-		fPackJunit= fArchiveFragmentRoot.getPackageFragment("junit");//$NON-NLS-1$
-		fPackJunitSamples= fArchiveFragmentRoot.getPackageFragment("junit.samples");//$NON-NLS-1$
-		fPackJunitSamplesMoney= fArchiveFragmentRoot.getPackageFragment("junit.samples.money");//$NON-NLS-1$
-		
-		assertNotNull("creating fPackJunit", fPackJunit);//$NON-NLS-1$
-		assertNotNull("creating fPackJunitSamples", fPackJunitSamples);//$NON-NLS-1$
-		assertNotNull("creating fPackJunitSamplesMoney",fPackJunitSamplesMoney);//$NON-NLS-1$
-		
-		fCUIMoney= fPackJunitSamplesMoney.getCompilationUnit("IMoney.java");//$NON-NLS-1$
-		fCUMoney= fPackJunitSamplesMoney.getCompilationUnit("Money.java");//$NON-NLS-1$
-		fCUMoneyBag= fPackJunitSamplesMoney.getCompilationUnit("MoneyBag.java");//$NON-NLS-1$
-		fCUMoneyTest= fPackJunitSamplesMoney.getCompilationUnit("MoneyTest.java");//$NON-NLS-1$
-		
-		fCUAllTests= fPackJunitSamples.getCompilationUnit("AllTests.java");//$NON-NLS-1$
-		fCUVectorTest= fPackJunitSamples.getCompilationUnit("VectorTest.java");//$NON-NLS-1$
-		fCUSimpleTest= fPackJunitSamples.getCompilationUnit("SimpleTest.java");//$NON-NLS-1$
-		//set up project #2: file system structure with in a source folder
-
-	//	JavaProjectHelper.addVariableEntry(fJProject2, new Path("JRE_LIB_TEST"), null, null);
-
-		fRoot1= JavaProjectHelper.addSourceContainer(fJProject2, "src1");//$NON-NLS-1$
-		fPack1= fRoot1.createPackageFragment("pack1", true, null);//$NON-NLS-1$
-		fPack2= fRoot1.createPackageFragment("pack2", true, null);//$NON-NLS-1$
-		fPack3= fRoot1.createPackageFragment("pack3",true,null);//$NON-NLS-1$
-		fPack4= fRoot1.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$
-		fPack5= fRoot1.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$
-		fPack6= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$
-		
-		fCU1= fPack2.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU2= fPack6.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU3= fPack6.createCompilationUnit("Jen.java","", true,null);//$NON-NLS-1$//$NON-NLS-2$
-		
-		//set up the mock view
-		setUpMockView();
-	}
-	
-	public void setUpMockView() throws Exception{
-		
-		fWorkbench= PlatformUI.getWorkbench();
-		assertNotNull(fWorkbench);
-		
-		page= fWorkbench.getActiveWorkbenchWindow().getActivePage();
-		assertNotNull(page);
-		
-		//just testing to make sure my part can be created
-		IViewPart myPart= new MockPluginView();
-		assertNotNull(myPart);
-		
-		myPart= page.showView("org.eclipse.jdt.ui.tests.packageview.MockPluginView");//$NON-NLS-1$
-		if (myPart instanceof MockPluginView) {
-			fMyPart= (MockPluginView) myPart;
-			fMyPart.setFolding(false);
-			// above call might cause a property change event being sent
-			fMyPart.fRefreshedObjects.clear();
-			fProvider= (ITreeContentProvider)fMyPart.getTreeViewer().getContentProvider();
-		}else assertTrue("Unable to get view",false);//$NON-NLS-1$
-	
-		assertNotNull(fProvider);		
-	}
-
-	/**
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		fArchiveFragmentRoot.close();
-			
-		JavaProjectHelper.delete(fJProject1);
-		JavaProjectHelper.delete(fJProject2);
-		page.hideView(fMyPart);
-		fMyPart.dispose();
-		
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);
-		
-		super.tearDown();
-	}
-	
-	/**
-	 * Method compareArrays. Both arrays must be of IPackageFragments or compare will fail.
-	 * @param children
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean compareArrays(Object[] children, Object[] expectedChildren) {
-		if(children.length!=expectedChildren.length)
-			return false;
-		for (int i= 0; i < children.length; i++) {
-			Object child= children[i];
-			if (child instanceof IJavaElement) {
-				IJavaElement el= (IJavaElement) child;
-				if(!contains(el, expectedChildren))
-					return false;
-			} else if(child instanceof IResource){
-				IResource res = (IResource) child;	
-				if(!contains(res, expectedChildren)){
-					return false;	
-				}
-			}
-		}
-		return true;
-	}
-	/**
-	 * Method contains.
-	 * @param res
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean contains(IResource res, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IResource) {
-				IResource expres= (IResource) object;
-				if(expres.equals(res))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Method contains.
-	 * @param fragment
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean contains(IJavaElement fragment, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IJavaElement) {
-				IJavaElement expfrag= (IJavaElement) object;
-				if(expfrag.equals(fragment))
-					return true;
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests2.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests2.java
deleted file mode 100644
index 73a9501..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests2.java
+++ /dev/null
@@ -1,356 +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.jdt.ui.tests.packageview;
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-/**
- * Tests for the PackageExplorerContentProvider.
- * 
- * @since 2.1
- */
-public class ContentProviderTests2 extends TestCase{
-
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite("org.eclipse.jdt.ui.ContentProviderTests2"); //$NON-NLS-1$
-		//$JUnit-BEGIN$
-	   suite.addTestSuite(ContentProviderTests2.class);
-		//$JUnit-END$
-		return suite;
-	}
-	
-	private IPackageFragmentRoot fRoot1;
-	private IPackageFragment fPack1;
-	private IPackageFragment fPack2;
-	private IPackageFragment fPack4;
-	private IPackageFragment fPack3;
-	private IWorkspace fWorkspace;
-	private IWorkbench fWorkbench;
-	private MockPluginView fMyPart;
-	
-	private ITreeContentProvider fProvider;
-	
-	private IPackageFragmentRoot jdk;
-
-	private IPackageFragment fPack5;
-	private IJavaProject fJProject3;
-	private IPackageFragment fPack6;
-	private IPackageFragmentRoot fInternalRoot1;
-	private IPackageFragment fA;
-	private IPackageFragment fX;
-	private IPackageFragment fB;
-	private IPackageFragment fC;
-	private IPackageFragment fD;
-	private IPackageFragment fY;
-	private IFile fFile1;
-	private IFile fFile2;
-	private ICompilationUnit fCU1;
-	private ICompilationUnit fCU2;
-	private IClassFile fYClassFile;
-	
-	private IWorkbenchPage page;
-	private boolean fEnableAutoBuildAfterTesting;
-	
-	public ContentProviderTests2(String name) {
-		super(name);
-	}
-	
-	public void testGetChildrenProject() throws Exception{
-		Object[] expectedChildren= new Object[]{fPack1, fPack2, fPack3, fRoot1.getPackageFragment(""), fFile1, fFile2,fInternalRoot1,jdk}; //$NON-NLS-1$
-		Object[] children= fProvider.getChildren(fJProject3);
-		assertTrue("Wrong children found for project", compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrentMidLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{fPack4, fPack5};
-		Object[] children= fProvider.getChildren(fPack3);
-		assertTrue("Wrong children found for PackageFragment",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{};
-		Object[] children= fProvider.getChildren(fPack1);
-		assertTrue("Wrong children found for PackageFragment",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragmentWithCU() throws Exception{
-		Object[] expectedChildren= new Object[]{fCU1};
-		Object[] children= fProvider.getChildren(fPack2);
-		assertTrue("Wrong children found for PackageFragment with CU",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragmentFile() throws Exception{
-		Object[] expectedChildren= new Object[]{};
-		Object[] children= fProvider.getChildren(fPack1);
-		assertTrue("Wrong children found for PackageFragment with File",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragment2() throws Exception{
-		Object[] expectedChildren= new Object[]{fCU2};
-		Object[] children= fProvider.getChildren(fPack6);
-		assertTrue("Wrong children found for PackageFragment",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-
-	public void testGetChildrenMidLevelFragmentInInternalArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{fC};
-		Object[] children= fProvider.getChildren(fB);
-		assertTrue("wrong children found for a NON bottom PackageFragment in PackageFragmentRoot Internal Archive", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-
-	public void testGetChildrenBottomLevelFragmentInInternalArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{fYClassFile};
-		Object[] children= fProvider.getChildren(fY);
-		assertTrue("wrong children found for a bottom PackageFragment in PackageFragmentRoot Internal Archive", compareArrays(children, expectedChildren));	//$NON-NLS-1$
-	}
-	
-	public void getChildrenInternalArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{fX,fA, fInternalRoot1.getPackageFragment("")}; //$NON-NLS-1$
-		Object[] children= fProvider.getChildren(fInternalRoot1);	
-		assertTrue("Wrong child found for PackageFragmentRoot Internal Archive", compareArrays(children,expectedChildren));//$NON-NLS-1$
-	}
-	
-	//---------------Get Parent Tests-----------------------------
-	
-	public void testGetParentArchive() throws Exception{
-		Object parent= fProvider.getParent(fInternalRoot1);
-		assertTrue("Wrong parent found for PackageFragmentRoot Archive", parent==fJProject3); //$NON-NLS-1$
-	}
-
-	public void testGetParentMidLevelFragmentInArchive() throws Exception{
-		Object expectedParent= fB;
-		Object parent= fProvider.getParent(fC);
-		assertTrue("Wrong parent found for a NON top level PackageFragment in an Archive", expectedParent.equals(parent)); //$NON-NLS-1$
-	}	
-	
-	public void testGetParentTopLevelFragmentInArchive() throws Exception{
-		Object expectedParent= fInternalRoot1;
-		Object parent= fProvider.getParent(fA);
-		assertTrue("Wrong parent found for a top level PackageFragment in an Archive", expectedParent.equals(parent));	 //$NON-NLS-1$
-	}
-	
-	public void testGetParentTopLevelFragment() throws Exception{
-		Object expectedParent= fJProject3;
-		Object parent= fProvider.getParent(fPack3);
-		assertTrue("Wrong parent found for a top level PackageFragment", expectedParent.equals(parent)); //$NON-NLS-1$
-	}
-	
-	public void testGetParentMidLevelFragment() throws Exception{
-		Object expectedParent= fPack3;
-		Object parent= fProvider.getParent(fPack5);
-		assertTrue("Wrong parent found for a NON top level PackageFragment", expectedParent.equals(parent)); //$NON-NLS-1$
-	}
-	
-	
-	//-------------------Set up methods--------------------------------
-	/**
-	 * @see TestCase#setUp()
-	 */
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-			
-		fWorkspace= ResourcesPlugin.getWorkspace();
-		assertNotNull(fWorkspace);
-		IWorkspaceDescription workspaceDesc= fWorkspace.getDescription();
-		fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding();
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(false);
-		
-		//create project
-		fJProject3= JavaProjectHelper.createJavaProject("TestProject3", "bin"); //$NON-NLS-1$ //$NON-NLS-2$
-		assertNotNull("project3 null", fJProject3); //$NON-NLS-1$
-		
-		Object[] resource= fJProject3.getNonJavaResources();
-		for (int i = 0; i < resource.length; i++) {
-			Object object = resource[i];
-			if(object instanceof IFile){
-				IFile file = (IFile) object;
-				if(".classpath".equals(file.getName())) //$NON-NLS-1$
-					fFile1= file;
-				else if (".project".equals(file.getName())) //$NON-NLS-1$
-					fFile2= file;
-			}
-		}
-		assertNotNull(fFile1);
-		assertNotNull(fFile2);
-
-		//add rt.jar
-		jdk= JavaProjectHelper.addVariableRTJar(fJProject3, "JRE_LIB_TEST", null, null); //$NON-NLS-1$
-		assertTrue("jdk not found", jdk != null); //$NON-NLS-1$
-		
-		//create the PackageFragmentRoot that represents the project as source folder
-		fRoot1= JavaProjectHelper.addSourceContainer(fJProject3, ""); //$NON-NLS-1$
-		assertNotNull("getting default package", fRoot1); //$NON-NLS-1$
-		
-		//set up project #3: file system structure with project as source folder
-		//add an internal jar
-		File myInternalLibJar= JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/myinternallib.jar")); //$NON-NLS-1$
-		assertTrue("lib not found", myInternalLibJar != null && myInternalLibJar.exists()); //$NON-NLS-1$
-		fInternalRoot1= JavaProjectHelper.addLibraryWithImport(fJProject3, new Path(myInternalLibJar.getPath()), null, null);
-	
-		//create internal PackageFragments
-		fA= fInternalRoot1.getPackageFragment("a"); //$NON-NLS-1$
-		fX= fInternalRoot1.getPackageFragment("x"); //$NON-NLS-1$
-		fB= fInternalRoot1.getPackageFragment("a.b"); //$NON-NLS-1$
-		fC= fInternalRoot1.getPackageFragment("a.b.c"); //$NON-NLS-1$
-		fD= fInternalRoot1.getPackageFragment("a.d"); //$NON-NLS-1$
-		fY= fInternalRoot1.getPackageFragment("x.y"); //$NON-NLS-1$
-		
-		fYClassFile= fY.getClassFile("Y.class"); //$NON-NLS-1$
-		
-		//create PackageFragments
-		fPack1= fRoot1.createPackageFragment("pack1", true, null); //$NON-NLS-1$
-		fPack2= fRoot1.createPackageFragment("pack2", true, null); //$NON-NLS-1$
-		fPack3= fRoot1.createPackageFragment("pack3",true,null); //$NON-NLS-1$
-		fPack4= fRoot1.createPackageFragment("pack3.pack4", true,null); //$NON-NLS-1$
-		fPack5= fRoot1.createPackageFragment("pack3.pack5",true,null); //$NON-NLS-1$
-		fPack6= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null); //$NON-NLS-1$
-		
-		fCU1= fPack2.createCompilationUnit("Object.java", "", true, null); //$NON-NLS-1$ //$NON-NLS-2$
-		fCU2= fPack6.createCompilationUnit("Object.java","", true, null); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		//set up the mock view
-		setUpMockView();
-	}
-	
-	public void setUpMockView() throws Exception {
-//		fWorkspace = ResourcesPlugin.getWorkspace();
-//		assertNotNull(fWorkspace);
-
-		fWorkbench = PlatformUI.getWorkbench();
-		assertNotNull(fWorkbench);
-
-		page = fWorkbench.getActiveWorkbenchWindow().getActivePage();
-		assertNotNull(page);
-
-		//just testing to make sure my part can be created
-		IViewPart myPart = new MockPluginView();
-		assertNotNull(myPart);
-
-		myPart = page.showView("org.eclipse.jdt.ui.tests.packageview.MockPluginView"); //$NON-NLS-1$
-		if (myPart instanceof MockPluginView) {
-			fMyPart = (MockPluginView) myPart;
-			fMyPart.setFolding(false);
-			// above call might cause a property change event being sent
-			fMyPart.fRefreshedObjects.clear();
-			fProvider = (ITreeContentProvider) fMyPart.getTreeViewer().getContentProvider();
-		} else
-			assertTrue("Unable to get view", false); //$NON-NLS-1$
-
-		assertNotNull(fProvider);
-	}
-	
-	/**
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		fInternalRoot1.close();
-		JavaProjectHelper.delete(fJProject3);
-		page.hideView(fMyPart);
-		fMyPart.dispose();
-		
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);
-
-		super.tearDown();
-	}
-	
-	/**
-	 * Method compareArrays. Both arrays must be of IPackageFragments or compare will fail.
-	 * @param children
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean compareArrays(Object[] children, Object[] expectedChildren) {
-		if(children.length!=expectedChildren.length)
-			return false;
-		for (int i= 0; i < children.length; i++) {
-			Object child= children[i];
-			if (child instanceof IJavaElement) {
-				IJavaElement el= (IJavaElement) child;
-				if(!contains(el, expectedChildren))
-					return false;
-			} else if(child instanceof IResource){
-				IResource res = (IResource) child;	
-				if(!contains(res, expectedChildren)){
-					return false;	
-				}
-			}
-		}
-		return true;
-	}
-	/**
-	 * Method contains.
-	 * @param res
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean contains(IResource res, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IResource) {
-				IResource expres= (IResource) object;
-				if(expres.equals(res))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Method contains.
-	 * @param fragment
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean contains(IJavaElement fragment, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IJavaElement) {
-				IJavaElement expfrag= (IJavaElement) object;
-				if(expfrag.equals(fragment))
-					return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests3.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests3.java
deleted file mode 100644
index bb92da0..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests3.java
+++ /dev/null
@@ -1,472 +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.jdt.ui.tests.packageview;
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.jdt.core.ElementChangedEvent;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IElementChangedListener;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-/**
- * Tests for the PackageExplorerContentProvider.
- * 
- * @since 2.1
- */
-public class ContentProviderTests3 extends TestCase {
-
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite("org.eclipse.jdt.ui.tests.ContentProviderTests3"); //$NON-NLS-1$
-		//$JUnit-BEGIN$
-	   suite.addTestSuite(ContentProviderTests3.class);
-		//$JUnit-END$
-		return suite;
-	}
-
-
-	private IJavaProject fJProject1;
-	private IJavaProject fJProject2;
-	
-	private IPackageFragmentRoot fRoot1;
-	private IPackageFragment fPack1;
-	private IPackageFragment fPack2;
-	private IPackageFragment fPack4;
-	private IPackageFragment fPack3;
-	private IWorkspace fWorkspace;
-	private IWorkbench fWorkbench;
-	private MockPluginView fMyPart;
-	
-	private ITreeContentProvider fProvider;
-	private IPackageFragmentRoot fArchiveFragmentRoot;
-	private IPackageFragment fPackJunit;
-	private IPackageFragment fPackJunitSamples;
-	private IPackageFragment fPackJunitSamplesMoney;
-
-	private IPackageFragment fPack5;
-	private IPackageFragment fPack6;
-	private IPackageFragment fPackJunitExtentions;
-	private IPackageFragment fPackJunitFramework;
-	private IPackageFragment fPackJunitRunner;
-	private IPackageFragment fPackJunitTextUi;
-	private IPackageFragment fPackJunitUi;
-	private IPackageFragment fPackJunitTests;
-	
-	private ICompilationUnit fCUIMoney;
-	private ICompilationUnit fCUMoney;
-	private ICompilationUnit fCUMoneyBag;
-	private ICompilationUnit fCUMoneyTest;
-	private ICompilationUnit fCU1;
-	private ICompilationUnit fCU2;
-	private ICompilationUnit fCU3;
-	private IFile fFile1;
-	private IFile fFile2;
-	
-	private IWorkbenchPage page;
-	private IPackageFragmentRoot jdk;
-	private boolean fEnableAutoBuildAfterTesting;
-	
-	public ContentProviderTests3(String name) {
-		super(name);
-	}
-	
-	//---------Test for getChildren-------------------
-
-	public void testGetChildrenProjectWithSourceFolders() throws Exception{
-		Object[] expectedChildren= new Object[]{fRoot1, fFile1, fFile2, jdk};
-		Object[] children= fProvider.getChildren(fJProject2);
-		assertTrue("Wrong children found for project with folding", compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	
-	public void testGetChildrentMidLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{fPack4, fPack6};
-		Object[] children= fProvider.getChildren(fPack3);
-		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren));//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{};
-		Object[] children= fProvider.getChildren(fPack1);
-		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren));//$NON-NLS-1$
-		
-	}
-	
-	public void testGetChildrenBottomLevelFragmentWithCU() throws Exception{
-		Object[] expectedChildren= new Object[]{fCU1};
-		Object[] children= fProvider.getChildren(fPack2);
-		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren));	//$NON-NLS-1$
-	}
-
-	public void testGetChildrenBottomLevelFragmentInArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{fCUIMoney, fCUMoney, fCUMoneyBag, fCUMoneyTest};
-		Object[] children= fProvider.getChildren(fPackJunitSamplesMoney);
-		assertTrue("wrong children found for a bottom PackageFragment in PackageFragmentRoot Archive with folding", compareArrays(children, expectedChildren));	//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenSource() throws Exception{
-		Object[] expectedChildren= new Object[]{fPack1,fPack2,fPack3, fRoot1.getPackageFragment("")};//$NON-NLS-1$
-		Object[] children= fProvider.getChildren(fRoot1);
-		assertTrue("Wrong children found for PackageFragmentRoot with folding", compareArrays(children, expectedChildren));	//$NON-NLS-1$
-	}
-	
-	public void testGetChildrenArchive(){
-		Object[] expectedChildren= new Object[]{fPackJunit, fArchiveFragmentRoot.getPackageFragment("")};//$NON-NLS-1$
-		Object[] children= fProvider.getChildren(fArchiveFragmentRoot);
-		assertTrue("Wrong child found for PackageFragmentRoot Archive with folding", compareArrays(children,expectedChildren));//$NON-NLS-1$
-		
-	}
-	
-	//---------------Get Parent Tests-----------------------------
-	
-	public void testGetParentArchive() throws Exception{
-		Object parent= fProvider.getParent(fArchiveFragmentRoot);
-		assertTrue("Wrong parent found for PackageFragmentRoot Archive with folding", parent==fJProject1);//$NON-NLS-1$
-	}	
-	
-	public void testGetParentTopLevelFragmentInArchive() throws Exception{
-		Object expectedParent= fPackJunit;
-		Object parent= fProvider.getParent(fPackJunitSamples);
-		assertTrue("Wrong parent found for a top level PackageFragment in an Archive with folding", expectedParent.equals(parent));	//$NON-NLS-1$
-	}
-	
-	public void testGetParentTopLevelFragment() throws Exception{
-		Object expectedParent= fRoot1;
-		Object parent= fProvider.getParent(fPack3);
-		assertTrue("Wrong parent found for a top level PackageFragment with folding", expectedParent.equals(parent)); //$NON-NLS-1$
-	}
-	
-	public void testGetParentFoldedBottomFragment() throws Exception{
-		Object expectedParent= fRoot1;
-		Object parent= fProvider.getParent(fPack3);
-		assertTrue("Wrong parent found for a top level PackageFragment with folding", expectedParent.equals(parent));//$NON-NLS-1$
-		
-	}
-	
-	public void testGetParentMidLevelFragment() throws Exception{
-		Object expectedParent= fPack3;
-		Object parent= fProvider.getParent(fPack4);
-		assertTrue("Wrong parent found for a NON top level PackageFragment with folding", expectedParent.equals(parent));//$NON-NLS-1$
-	}
-	
-	public void testDeleteBottomLevelFragmentFolding() throws Exception {
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createDelta(fPack4, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from dispaly
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-
-		assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-		assertTrue("Correct Refresh", fMyPart.wasObjectRefreshed(fRoot1)); //$NON-NLS-1$
-		assertTrue("Single refresh", fMyPart.getRefreshedObject().size() == 1); //$NON-NLS-1$
-	}
-
-	public void testAddBottomLevelFragmentFolding() throws Exception {
-		IPackageFragment test= fRoot1.createPackageFragment("test", true, null); //$NON-NLS-1$
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createDelta(test, IJavaElementDelta.ADDED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from dispaly
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-
-		assertTrue("Refresh happened", fMyPart.hasRefreshHappened()); //$NON-NLS-1$
-		assertTrue("Correct Refresh", fMyPart.wasObjectRefreshed(fRoot1)); //$NON-NLS-1$
-		assertTrue("Single refreshe", fMyPart.getRefreshedObject().size() == 1); //$NON-NLS-1$
-	}
-
-	public void testChangedTopLevelPackageFragmentFolding() throws Exception {
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createDelta(fPack3, IJavaElementDelta.CHANGED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from dispaly
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-		
-		assertEquals("No refreshs", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-
-	public void testChangeBottomLevelPackageFragmentFolding() throws Exception {
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createDelta(fPack6, IJavaElementDelta.CHANGED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from dispaly
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-		
-		assertEquals("No refreshs",0,  fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-	
-	public void testRemoveCUsFromPackageFragment() throws Exception{
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[] { fCU2, fCU3 }, fPack6, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-
-		assertTrue("Remove happened", fMyPart.hasRemoveHappened()); //$NON-NLS-1$
-		assertEquals("2 elements removed", 2, fMyPart.getRemovedObject().size()); //$NON-NLS-1$
-		assertTrue("Correct elements removed", fMyPart.getRemovedObject().contains(fCU2) && fMyPart.getRemovedObject().contains(fCU3)); //$NON-NLS-1$
-		assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-
-	public void testRemoveCUFromPackageFragment() throws Exception {
-
-		//send a delta indicating fragment deleted
-		IElementChangedListener listener= (IElementChangedListener) fProvider;
-		IJavaElementDelta delta= TestDelta.createCUDelta(new ICompilationUnit[]{fCU2}, fPack6, IJavaElementDelta.REMOVED);
-		listener.elementChanged(new ElementChangedEvent(delta, ElementChangedEvent.POST_CHANGE));
-
-		//force events from display
-		while(fMyPart.getTreeViewer().getControl().getDisplay().readAndDispatch());
-
-		assertTrue("Remove happened", fMyPart.hasRemoveHappened()); //$NON-NLS-1$
-		assertTrue("Correct refresh", fMyPart.getRemovedObject().contains(fCU2)); //$NON-NLS-1$
-		assertEquals("No refreshes", 0, fMyPart.getRefreshedObject().size()); //$NON-NLS-1$
-	}
-	
-
-	/*
-	 * @see TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		fWorkspace= ResourcesPlugin.getWorkspace();
-		assertNotNull(fWorkspace);
-		IWorkspaceDescription workspaceDesc= fWorkspace.getDescription();
-		fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding();
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(false);
-
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		fJProject2= JavaProjectHelper.createJavaProject("TestProject2", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		
-		assertNotNull("project1 null", fJProject1);//$NON-NLS-1$
-		assertNotNull("project2 null", fJProject2);//$NON-NLS-1$
-		
-		Object[] resource= fJProject2.getNonJavaResources();
-		for (int i = 0; i < resource.length; i++) {
-			Object object = resource[i];
-			if(object instanceof IFile){
-				IFile file = (IFile) object;
-				if(".classpath".equals(file.getName()))//$NON-NLS-1$
-					fFile1= file;
-				else if (".project".equals(file.getName()))//$NON-NLS-1$
-					fFile2= file;
-			}
-		}
-		assertNotNull(fFile1);
-		assertNotNull(fFile2);
-		
-		//set up project #1 : External Jar and zip file
-		jdk= JavaProjectHelper.addVariableRTJar(fJProject1, "JRE_LIB_TEST", null, null);//$NON-NLS-1$
-		assertTrue("jdk not found", jdk != null);//$NON-NLS-1$
-
-		File junitSrcArchive= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.JUNIT_SRC);
-		
-		assertTrue("junit src not found", junitSrcArchive != null && junitSrcArchive.exists());//$NON-NLS-1$
-
-		fArchiveFragmentRoot= JavaProjectHelper.addSourceContainerWithImport(fJProject1, "src", junitSrcArchive);//$NON-NLS-1$
-		
-		fPackJunit= fArchiveFragmentRoot.getPackageFragment("junit");//$NON-NLS-1$
-		fPackJunitSamples= fArchiveFragmentRoot.getPackageFragment("junit.samples");//$NON-NLS-1$
-		fPackJunitSamplesMoney= fArchiveFragmentRoot.getPackageFragment("junit.samples.money");//$NON-NLS-1$
-		fPackJunitExtentions= fArchiveFragmentRoot.getPackageFragment("junit.extensions");//$NON-NLS-1$
-		fPackJunitFramework= fArchiveFragmentRoot.getPackageFragment("junit.framework");//$NON-NLS-1$
-		fPackJunitRunner= fArchiveFragmentRoot.getPackageFragment("junit.runner");//$NON-NLS-1$
-		fPackJunitTests= fArchiveFragmentRoot.getPackageFragment("junit.tests");//$NON-NLS-1$
-		fPackJunitTextUi= fArchiveFragmentRoot.getPackageFragment("junit.textui");//$NON-NLS-1$
-		fPackJunitUi= fArchiveFragmentRoot.getPackageFragment("junit.ui");//$NON-NLS-1$
-		
-		assertNotNull("creating fPackJunit", fPackJunit);//$NON-NLS-1$
-		assertNotNull("creating fPackJunitSamples", fPackJunitSamples);//$NON-NLS-1$
-		assertNotNull("creating fPackJunitSamplesMoney",fPackJunitSamplesMoney);//$NON-NLS-1$
-		assertNotNull("", fPackJunitExtentions);//$NON-NLS-1$
-		assertNotNull("",fPackJunitFramework);//$NON-NLS-1$
-		assertNotNull("",fPackJunitRunner);//$NON-NLS-1$
-		assertNotNull("",fPackJunitTests);//$NON-NLS-1$
-		assertNotNull("",fPackJunitTextUi);//$NON-NLS-1$
-		assertNotNull("",fPackJunitUi);//$NON-NLS-1$
-		
-		fCUIMoney= fPackJunitSamplesMoney.getCompilationUnit("IMoney.java");//$NON-NLS-1$
-		fCUMoney= fPackJunitSamplesMoney.getCompilationUnit("Money.java");//$NON-NLS-1$
-		fCUMoneyBag= fPackJunitSamplesMoney.getCompilationUnit("MoneyBag.java");//$NON-NLS-1$
-		fCUMoneyTest= fPackJunitSamplesMoney.getCompilationUnit("MoneyTest.java");//$NON-NLS-1$
-		
-		File mylibJar= JavaTestPlugin.getDefault().getFileInPlugin(JavaProjectHelper.MYLIB);
-		assertTrue("lib not found", mylibJar != null && mylibJar.exists());//$NON-NLS-1$
-		JavaProjectHelper.addLibraryWithImport(fJProject1, new Path(mylibJar.getPath()), null, null);
-
-		//set up project #2: file system structure with in a source folder
-
-		JavaProjectHelper.addVariableEntry(fJProject2, new Path("JRE_LIB_TEST"), null, null);//$NON-NLS-1$
-
-		fRoot1= JavaProjectHelper.addSourceContainer(fJProject2, "src1");//$NON-NLS-1$
-		fPack1= fRoot1.createPackageFragment("pack1", true, null);//$NON-NLS-1$
-		fPack2= fRoot1.createPackageFragment("pack2", true, null);//$NON-NLS-1$
-		fPack3= fRoot1.createPackageFragment("pack3",true,null);//$NON-NLS-1$
-		fPack4= fRoot1.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$
-		fPack5= fRoot1.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$
-		fPack6= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$
-		
-		fCU1= fPack2.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU2= fPack6.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU3= fPack6.createCompilationUnit("Jen.java","", true,null);//$NON-NLS-1$//$NON-NLS-2$
-
-		//set up the mock view
-		setUpMockView();
-	}
-	
-	public void setUpMockView() throws Exception{
-		
-		
-//		fWorkspace= ResourcesPlugin.getWorkspace();
-//		assertNotNull(fWorkspace);	
-		
-		fWorkbench= PlatformUI.getWorkbench();
-		assertNotNull(fWorkbench);
-		
-		page= fWorkbench.getActiveWorkbenchWindow().getActivePage();
-		assertNotNull(page);
-		
-		//just testing to make sure my part can be created
-		IViewPart myPart= new MockPluginView();
-		assertNotNull(myPart);
-		
-		myPart= page.showView("org.eclipse.jdt.ui.tests.packageview.MockPluginView");//$NON-NLS-1$
-		if (myPart instanceof MockPluginView) {
-			fMyPart= (MockPluginView) myPart;
-			//turn on folding
-			fMyPart.setFolding(true);
-			// above call might cause a property change event being sent
-			fMyPart.fRefreshedObjects.clear();
-			fProvider= (ITreeContentProvider)fMyPart.getTreeViewer().getContentProvider();
-	
-		}else assertTrue("Unable to get view",false);//$NON-NLS-1$
-	
-		assertNotNull(fProvider);
-	}
-
-	/**
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		fArchiveFragmentRoot.close();
-		JavaProjectHelper.delete(fJProject1);
-		JavaProjectHelper.delete(fJProject2);
-		page.hideView(fMyPart);
-		fMyPart.dispose();
-		
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);
-		
-		super.tearDown();
-	}
-	
-	/**
-	 * Method compareArrays. Both arrays must be of IPackageFragments or compare will fail.
-	 * @param children
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean compareArrays(Object[] children, Object[] expectedChildren) {
-		if(children.length!=expectedChildren.length)
-			return false;
-		for (int i= 0; i < children.length; i++) {
-			Object child= children[i];
-			if (child instanceof IJavaElement) {
-				IJavaElement el= (IJavaElement) child;
-				if(!contains(el, expectedChildren))
-					return false;
-			} else if(child instanceof IResource){
-				IResource res = (IResource) child;	
-				if(!contains(res, expectedChildren)){
-					return false;	
-				}
-			}
-		}
-		return true;
-	}
-	/**
-	 * Method contains.
-	 * @param res
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean contains(IResource res, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IResource) {
-				IResource expres= (IResource) object;
-				if(expres.equals(res))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Method contains.
-	 * @param fragment
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean contains(IJavaElement fragment, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IJavaElement) {
-				IJavaElement expfrag= (IJavaElement) object;
-				if(expfrag.equals(fragment))
-					return true;
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests4.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests4.java
deleted file mode 100644
index 9e72dc6..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/ContentProviderTests4.java
+++ /dev/null
@@ -1,370 +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.jdt.ui.tests.packageview;
-
-import java.io.File;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-import org.eclipse.jdt.core.IClassFile;
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-import org.eclipse.jdt.testplugin.JavaTestPlugin;
-
-/**
- * Tests for the PackageExplorerContentProvider.
- * 
- * @since 2.1
- */
-public class ContentProviderTests4 extends TestCase{
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite("org.eclipse.jdt.ui.tests.ContentProviderTests4"); //$NON-NLS-1$
-		//$JUnit-BEGIN$
-	   suite.addTestSuite(ContentProviderTests4.class);
-		//$JUnit-END$
-		return suite;
-	}
-
-	
-	private IPackageFragmentRoot fRoot1;
-	private IPackageFragment fPack1;
-	private IPackageFragment fPack2;
-	private IPackageFragment fPack4;
-	private IPackageFragment fPack3;
-	private IWorkspace fWorkspace;
-	private IWorkbench fWorkbench;
-	private MockPluginView fMyPart;
-	
-	private ITreeContentProvider fProvider;
-	
-	private IPackageFragment fPack5;
-	private IJavaProject fJProject3;
-	private IPackageFragment fPack6;
-	private IPackageFragmentRoot fInternalRoot1;
-	private IPackageFragment fA;
-	private IPackageFragment fX;
-	private IPackageFragment fB;
-	private IPackageFragment fC;
-	private IPackageFragment fD;
-	private IPackageFragment fY;
-	private IPackageFragment fDefaultPackage;
-	private ICompilationUnit fCU1;
-	private ICompilationUnit fCU2;
-	private IClassFile fYClassFile;
-	
-	private IPackageFragmentRoot jdk;
-	private IFile fFile1;
-	private IFile fFile2;
-	private IClassFile fAClassFile;
-	
-	private IWorkbenchPage page;
-	private ICompilationUnit fCUinDefault;
-	private File myInternalLibJar;
-	private boolean fEnableAutoBuildAfterTesting;
-	
-	public ContentProviderTests4(String name) {
-		super(name);
-	}
-	
-	public void testGetChildrenProject() throws Exception{
-		Object[] expectedChildren= new Object[]{fPack1, fPack2, fPack3, fDefaultPackage, fFile1, fFile2,fInternalRoot1,jdk};
-		Object[] children= fProvider.getChildren(fJProject3);
-		assertTrue("Wrong children found for project with folding", compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrenDefaultProject(){
-		Object[] expectedChildren= new Object[]{fCUinDefault};
-		Object[] children= fProvider.getChildren(fDefaultPackage);
-		assertTrue("Wrong children found for default package with folding", compareArrays(children, expectedChildren));	 //$NON-NLS-1$
-	}
-	
-	public void testGetChildrentMidLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{fPack4, fPack6};
-		Object[] children= fProvider.getChildren(fPack3);
-		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragment() throws Exception{
-		Object[] expectedChildren= new Object[]{};
-		Object[] children= fProvider.getChildren(fPack1);
-		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragmentWithCU() throws Exception{
-		Object[] expectedChildren= new Object[]{fCU1};
-		Object[] children= fProvider.getChildren(fPack2);
-		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-	
-	public void testGetChildrenBottomLevelFragmenWithCU2() throws Exception{
-		Object[] expectedChildren= new Object[]{fCU2};
-		Object[] children= fProvider.getChildren(fPack6);
-		assertTrue("Wrong children found for PackageFragment with folding",compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-
-	public void testGetChildrenMidLevelFragmentInInternalArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{fC, fD, fAClassFile};
-		Object[] children= fProvider.getChildren(fA);
-		assertTrue("wrong children found for a NON bottom PackageFragment in PackageFragmentRoot Internal Archive with folding", compareArrays(children, expectedChildren)); //$NON-NLS-1$
-	}
-
-	public void testGetChildrenBottomLevelFragmentInInternalArchive() throws Exception{
-		Object[] expectedChildren= new Object[]{fYClassFile};
-		Object[] children= fProvider.getChildren(fY);
-		assertTrue("wrong children found for a bottom PackageFragment in PackageFragmentRoot Internal Archive with folding", compareArrays(children, expectedChildren));	 //$NON-NLS-1$
-	}
-	
-	public void getChildrenInternalArchive() throws Exception{	
-		Object[] expectedChildren= new Object[]{fX,fA, fInternalRoot1.getPackageFragment("")}; //$NON-NLS-1$
-		Object[] children= fProvider.getChildren(fInternalRoot1);	
-		assertTrue("Wrong child found for PackageFragmentRoot Internal Archive with folding", compareArrays(children,expectedChildren)); //$NON-NLS-1$
-	}
-	
-	//---------------Get Parent Tests-----------------------------
-	
-	public void testGetParentArchive() throws Exception{
-		Object parent= fProvider.getParent(fInternalRoot1);
-		assertTrue("Wrong parent found for PackageFragmentRoot Archive with folding", parent==fJProject3);//$NON-NLS-1$
-	}
-
-	public void testGetParentMidLevelFragmentInArchive() throws Exception{
-		Object expectedParent= fA;
-		Object parent= fProvider.getParent(fC);
-		assertTrue("Wrong parent found for a NON top level PackageFragment in an Archive with folding", expectedParent.equals(parent));//$NON-NLS-1$
-	}	
-	
-	public void testGetParentTopLevelFragmentInArchive() throws Exception{
-		Object expectedParent= fInternalRoot1;
-		Object parent= fProvider.getParent(fA);
-		assertTrue("Wrong parent found for a top level PackageFragment in an Archive with folding", expectedParent.equals(parent));	//$NON-NLS-1$
-	}
-	
-	public void testGetParentTopLevelFragment() throws Exception{
-		Object expectedParent= fJProject3;
-		Object parent= fProvider.getParent(fPack3);
-		assertTrue("Wrong parent found for a top level PackageFragment with folding", expectedParent.equals(parent));//$NON-NLS-1$
-	}
-	
-	public void testGetParentMidLevelFragment() throws Exception{
-		Object expectedParent= fPack3;
-		Object parent= fProvider.getParent(fPack6);
-		assertTrue("Wrong parent found for a NON top level PackageFragment with folding", expectedParent.equals(parent));//$NON-NLS-1$
-	}
-	
-	public void testGetParentMidLevelFragment2() throws Exception{
-		Object expectedParent= fPack3;
-		Object parent= fProvider.getParent(fPack5);
-		assertTrue("Wrong parent found for a NON top level PackageFragment with folding", expectedParent.equals(parent));//$NON-NLS-1$
-	}
-	
-	
-	//-------------------Set up methods--------------------------------
-	/**
-	 * @see TestCase#setUp()
-	 */
-	
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		fWorkspace= ResourcesPlugin.getWorkspace();
-		assertNotNull(fWorkspace);
-		IWorkspaceDescription workspaceDesc= fWorkspace.getDescription();
-		fEnableAutoBuildAfterTesting= workspaceDesc.isAutoBuilding();
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(false);
-		
-		//create project
-		fJProject3 = JavaProjectHelper.createJavaProject("TestProject3", "bin");//$NON-NLS-1$//$NON-NLS-2$
-		assertNotNull("project3 null", fJProject3);//$NON-NLS-1$
-
-		Object[] resource = fJProject3.getNonJavaResources();
-		for (int i = 0; i < resource.length; i++) {
-			Object object = resource[i];
-			if (object instanceof IFile) {
-				IFile file = (IFile) object;
-				if (".classpath".equals(file.getName()))//$NON-NLS-1$
-					fFile1 = file;
-				else if (".project".equals(file.getName()))//$NON-NLS-1$
-					fFile2 = file;
-			}
-		}
-		assertNotNull(fFile1);
-		assertNotNull(fFile2);
-
-		//add rt.jar
-		jdk= JavaProjectHelper.addVariableRTJar(fJProject3, "JRE_LIB_TEST", null, null);//$NON-NLS-1$
-		assertTrue("jdk not found", jdk != null);//$NON-NLS-1$
-		
-		//create the PackageFragmentRoot that represents the project as source folder
-		fRoot1= JavaProjectHelper.addSourceContainer(fJProject3, "");//$NON-NLS-1$
-		assertNotNull("getting default package", fRoot1);//$NON-NLS-1$
-		
-		fDefaultPackage= fRoot1.createPackageFragment("",true,null);//$NON-NLS-1$
-		fCUinDefault= fDefaultPackage.createCompilationUnit("Object.java","",true, null);//$NON-NLS-1$//$NON-NLS-2$
-		
-		//set up project #3: file system structure with project as source folder
-		//add an internal jar
-		myInternalLibJar = JavaTestPlugin.getDefault().getFileInPlugin(new Path("testresources/myinternallib.jar"));//$NON-NLS-1$
-		assertTrue("lib not found", myInternalLibJar != null && myInternalLibJar.exists()); //$NON-NLS-1$
-		fInternalRoot1= JavaProjectHelper.addLibraryWithImport(fJProject3, new Path(myInternalLibJar.getPath()), null, null);
-	
-		//create internal PackageFragments
-		fA= fInternalRoot1.getPackageFragment("a");//$NON-NLS-1$
-		fX= fInternalRoot1.getPackageFragment("x");//$NON-NLS-1$
-		fB= fInternalRoot1.getPackageFragment("a.b");//$NON-NLS-1$
-		fC= fInternalRoot1.getPackageFragment("a.b.c");//$NON-NLS-1$
-		fD= fInternalRoot1.getPackageFragment("a.d");//$NON-NLS-1$
-		fY= fInternalRoot1.getPackageFragment("x.y");//$NON-NLS-1$
-		
-		fYClassFile= fY.getClassFile("Y.class");//$NON-NLS-1$
-		fAClassFile= fA.getClassFile("A.class");//$NON-NLS-1$
-		
-		//create PackageFragments
-		fPack1= fRoot1.createPackageFragment("pack1", true, null);//$NON-NLS-1$
-		fPack2= fRoot1.createPackageFragment("pack2", true, null);//$NON-NLS-1$
-		fPack3= fRoot1.createPackageFragment("pack3",true,null);//$NON-NLS-1$
-		fPack4= fRoot1.createPackageFragment("pack3.pack4", true,null);//$NON-NLS-1$
-		fPack5= fRoot1.createPackageFragment("pack3.pack5",true,null);//$NON-NLS-1$
-		fPack6= fRoot1.createPackageFragment("pack3.pack5.pack6", true, null);//$NON-NLS-1$
-		
-		fCU1= fPack2.createCompilationUnit("Object.java", "", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		fCU2= fPack6.createCompilationUnit("Object.java","", true, null);//$NON-NLS-1$//$NON-NLS-2$
-		
-		//set up the mock view
-		setUpMockView();
-	}
-	
-	public void setUpMockView() throws Exception {
-//		fWorkspace = ResourcesPlugin.getWorkspace();
-//		assertNotNull(fWorkspace);
-
-		fWorkbench = PlatformUI.getWorkbench();
-		assertNotNull(fWorkbench);
-
-		page = fWorkbench.getActiveWorkbenchWindow().getActivePage();
-		assertNotNull(page);
-
-		//just testing to make sure my part can be created
-		IViewPart myPart = new MockPluginView();
-		assertNotNull(myPart);
-
-		myPart = page.showView("org.eclipse.jdt.ui.tests.packageview.MockPluginView");//$NON-NLS-1$
-		if (myPart instanceof MockPluginView) {
-			fMyPart = (MockPluginView) myPart;
-			fMyPart.setFolding(true);
-			// above call might cause a property change event being sent
-			fMyPart.fRefreshedObjects.clear();
-			fProvider = (ITreeContentProvider) fMyPart.getTreeViewer().getContentProvider();
-		} else
-			assertTrue("Unable to get view", false);//$NON-NLS-1$
-
-		assertNotNull(fProvider);
-	}
-	
-	/**
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-	   
-		fInternalRoot1.close();
-		JavaProjectHelper.delete(fJProject3);
-		page.hideView(fMyPart);
-		fMyPart.dispose();
-		
-		if (fEnableAutoBuildAfterTesting)
-			JavaProjectHelper.setAutoBuilding(true);
-		
-		super.tearDown();
-	}
-	
-	/**
-	 * Method compareArrays. Both arrays must be of IPackageFragments or compare will fail.
-	 * @param children
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean compareArrays(Object[] children, Object[] expectedChildren) {
-		if(children.length!=expectedChildren.length)
-			return false;
-		for (int i= 0; i < children.length; i++) {
-			Object child= children[i];
-			if (child instanceof IJavaElement) {
-				IJavaElement el= (IJavaElement) child;
-				if(!contains(el, expectedChildren))
-					return false;
-			} else if(child instanceof IResource){
-				IResource res = (IResource) child;	
-				if(!contains(res, expectedChildren)){
-					return false;	
-				}
-			}
-		}
-		return true;
-	}
-	/**
-	 * Method contains.
-	 * @param res
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean contains(IResource res, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IResource) {
-				IResource expres= (IResource) object;
-				if(expres.equals(res))
-					return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Method contains.
-	 * @param fragment
-	 * @param expectedChildren
-	 * @return boolean
-	 */
-	private boolean contains(IJavaElement fragment, Object[] expectedChildren) {
-		for (int i= 0; i < expectedChildren.length; i++) {
-			Object object= expectedChildren[i];
-			if (object instanceof IJavaElement) {
-				IJavaElement expfrag= (IJavaElement) object;
-				if(expfrag.equals(fragment))
-					return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/MockPluginView.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/MockPluginView.java
deleted file mode 100644
index c2fa2a5..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/MockPluginView.java
+++ /dev/null
@@ -1,213 +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.jdt.ui.tests.packageview;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-
-import org.eclipse.jface.viewers.IContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-
-import org.eclipse.jdt.core.IJavaElement;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
-import org.eclipse.jdt.internal.ui.viewsupport.ProblemTreeViewer;
-
-/**
- * Helper to test the PackageExplorerContentProvider.
- * 
- * @since 2.1
- */
-public class MockPluginView extends PackageExplorerPart {
-
-	TreeViewer fViewer;
-	private ITreeContentProvider contentProvider;
-	private boolean fRefreshHappened;
-	public List fRefreshedObjects;
-	private boolean fRemoveHappened;
-	private boolean fAddHappened;
-	
-	private List fRemovedObject;
-	private Object fAddedObject;
-	private Object fAddedParentObject;
-
-	/**
-	 * Constructor for MockPluginView.
-	 */
-	public MockPluginView() {
-		super();
-		fRefreshedObjects= new ArrayList();
-		fRemovedObject= new ArrayList();
-	}
-	
-	/**
-	 * Creates only the viewer and the content provider.
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createPartControl(Composite parent) {
-	
-		//create viewer
-		fViewer= createViewer(parent);
-		
-		//create my contentProvider
-		contentProvider= createContentProvider();
-		contentProvider.inputChanged(fViewer, null, null);
-		
-		//set content provider
-		fViewer.setContentProvider(contentProvider);
-		
-	}
-	
-	private TreeViewer createViewer(Composite parent) {
-		return new TestProblemTreeViewer(parent, SWT.MULTI);
-	}
-
-	public void dispose() {
-		if (fViewer != null) {
-			IContentProvider p = fViewer.getContentProvider();
-			if(p!=null)	
-				p.dispose();
-		}
-		
-		super.dispose();
-	}
-
-	/*
-	 * @see org.eclipse.ui.IWorkbenchPart#setFocus()
-	 */
-	public void setFocus() {
-	}
-	
-	public TreeViewer getTreeViewer(){
-		return fViewer;
-	}
-	
-
-	/*
-	 * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#findElementToSelect(org.eclipse.jdt.core.IJavaElement)
-	 */
-	protected IJavaElement findElementToSelect(IJavaElement je) {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#getHelpContextId()
-	 */
-	protected String getHelpContextId() {
-		return null;
-	}
-
-	/**
-	 * @see org.eclipse.jdt.internal.ui.browsing.JavaBrowsingPart#isValidInput(java.lang.Object)
-	 */
-	protected boolean isValidInput(Object element) {
-		return false;
-	}
-	
-	private class TestProblemTreeViewer extends ProblemTreeViewer{
-		
-		public TestProblemTreeViewer(Composite parent, int flag){
-			super(parent,flag);
-		}
-		
-		public void refresh(Object object){
-			fRefreshHappened= true;
-			fRefreshedObjects.add(object);
-		}
-		
-		public void remove(Object object) {
-			fRemoveHappened= true;
-			fRemovedObject.add(object);
-		}
-		
-		public void add(Object parentObject, Object object){
-			fAddHappened= true;
-			fAddedObject= object;
-			fAddedParentObject= parentObject;
-		}
-	}
-
-	/**
-	 * Returns the refreshed object.
-	 * @return Object
-	 */
-	public boolean wasObjectRefreshed(Object c) {
-		return fRefreshedObjects.contains(c);
-	}
-	
-	public List getRefreshedObject(){
-		return fRefreshedObjects;	
-	}
-
-	/**
-	 * Returns the object added to the tree viewer
-	 * @return Object
-	 */
-	public Object getParentOfAddedObject() {
-		return fAddedParentObject;
-	}
-
-	/**
-	 * Returns true if something was added to the viewer
-	 * @return boolean
-	 */
-	public boolean hasAddHappened() {
-		return fAddHappened;
-	}
-
-	/**
-	 * Returns true if an object was removed from the viewer
-	 * @return boolean
-	 */
-	public boolean hasRemoveHappened() {
-		return fRemoveHappened;
-	}	
-	/**
-	 * Returns the object removed from the viewer
-	 * @return Object
-	 */
-	public List getRemovedObject() {
-		return fRemovedObject;
-	}
-
-	/**
-	 * Returns the object added to the viewer
-	 * @return Object
-	 */
-	public Object getAddedObject() {
-		return fAddedObject;
-	}
-	
-	/**
-	 * Returns true if a refresh happened
-	 * @return boolean
-	 */
-	public boolean hasRefreshHappened() {
-		return fRefreshHappened;
-	}
-	
-	/**
-	 * Sets the folding preference.
-	 * @param fold
-	 */
-	public void setFolding(boolean fold) {
-		JavaPlugin.getDefault().getPreferenceStore().setValue(PreferenceConstants.APPEARANCE_FOLD_PACKAGES_IN_PACKAGE_EXPLORER, fold);
-	}		
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/TestDelta.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/TestDelta.java
deleted file mode 100644
index 4132830..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/packageview/TestDelta.java
+++ /dev/null
@@ -1,139 +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.jdt.ui.tests.packageview;
-
-import org.eclipse.core.resources.IResourceDelta;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaElementDelta;
-import org.eclipse.jdt.core.IJavaModel;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-
-/**
- * @author Jen's account
- *
- */
-public class TestDelta implements IJavaElementDelta {
-
-	private int fKind;
-	private IJavaElement fElement;
-
-	private IJavaElementDelta[] fAffectedChildren;
-
-	public TestDelta(int kind, IJavaElement element) {
-		fKind= kind;
-		fElement= element;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getAddedChildren()
-		*/
-	public IJavaElementDelta[] getAddedChildren() {
-		return null;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getAffectedChildren()
-		*/
-	public IJavaElementDelta[] getAffectedChildren() {
-		if (fAffectedChildren == null)
-			return new IJavaElementDelta[0];
-		else
-			return fAffectedChildren;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getChangedChildren()
-		*/
-	public IJavaElementDelta[] getChangedChildren() {
-		return null;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getElement()
-		*/
-	public IJavaElement getElement() {
-		return fElement;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getFlags()
-		*/
-	public int getFlags() {
-		return 0;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getKind()
-		*/
-	public int getKind() {
-		return fKind;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getMovedFromElement()
-		*/
-	public IJavaElement getMovedFromElement() {
-		return null;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getMovedToElement()
-		*/
-	public IJavaElement getMovedToElement() {
-		return null;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getRemovedChildren()
-		*/
-	public IJavaElementDelta[] getRemovedChildren() {
-		return null;
-	}
-	/**
-		* @see org.eclipse.jdt.core.IJavaElementDelta#getResourceDeltas()
-		*/
-	public IResourceDelta[] getResourceDeltas() {
-		return null;
-	}
-
-	public void setAffectedChildren(IJavaElementDelta[] children) {
-		fAffectedChildren= children;
-	}
-	
-	public static TestDelta createParentDeltas(IPackageFragment frag, TestDelta delta) {
-		IJavaElement root= frag.getParent();
-		TestDelta rootDelta= new TestDelta(IJavaElementDelta.CHANGED, root);
-
-		IJavaProject proj= root.getJavaProject();
-		TestDelta projectDelta= new TestDelta(IJavaElementDelta.CHANGED, proj);
-
-		IJavaModel model= proj.getJavaModel();
-		TestDelta modelDelta= new TestDelta(IJavaElementDelta.CHANGED, model);
-
-		//set affected children
-		modelDelta.setAffectedChildren(new IJavaElementDelta[] { projectDelta });
-		projectDelta.setAffectedChildren(new IJavaElementDelta[] { rootDelta });
-		rootDelta.setAffectedChildren(new IJavaElementDelta[] { delta });
-		return modelDelta;
-	}
-
-	public static IJavaElementDelta createCUDelta(ICompilationUnit[] cu, IPackageFragment parent, int action) {
-		TestDelta fragmentDelta= new TestDelta(IJavaElementDelta.CHANGED, parent);
-
-		TestDelta[] deltas= new TestDelta[cu.length];
-		for (int i= 0; i < cu.length; i++) {
-			deltas[i]= new TestDelta(action, cu[i]);
-		}
-
-		fragmentDelta.setAffectedChildren(deltas);
-		return createParentDeltas(parent, fragmentDelta);
-	}
-
-	public static IJavaElementDelta createDelta(IPackageFragment frag, int action) {
-		TestDelta delta= new TestDelta(action, frag);
-		return createParentDeltas(frag, delta);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest.java
deleted file mode 100644
index 1da940f..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest.java
+++ /dev/null
@@ -1,2337 +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
- *     Sebastian Davids <sdavids@gmx.de> - testInvertEquals1-23
- *******************************************************************************/
-package org.eclipse.jdt.ui.tests.quickfix;
-
-import java.util.Hashtable;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.core.runtime.Preferences;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.text.correction.AssignToVariableAssistProposal;
-import org.eclipse.jdt.internal.ui.text.correction.AssistContext;
-import org.eclipse.jdt.internal.ui.text.correction.CUCorrectionProposal;
-import org.eclipse.jdt.internal.ui.text.correction.LinkedNamesAssistProposal;
-
-public class AssistQuickFixTest extends QuickFixTest {
-	
-	private static final Class THIS= AssistQuickFixTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-
-	public AssistQuickFixTest(String name) {
-		super(name);
-	}
-	
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new AssistQuickFixTest("testUnwrapMethodInvocation"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		store.setValue(PreferenceConstants.CODEGEN_KEYWORD_THIS, false);
-		
-		Preferences corePrefs= JavaCore.getPlugin().getPluginPreferences();
-		corePrefs.setValue(JavaCore.CODEASSIST_FIELD_PREFIXES, "");
-		corePrefs.setValue(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, "");
-		corePrefs.setValue(JavaCore.CODEASSIST_FIELD_SUFFIXES, "");
-		corePrefs.setValue(JavaCore.CODEASSIST_STATIC_FIELD_SUFFIXES, "");		
-		
-		fJProject1= ProjectTestSetup.getProject();
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	public void testAssignToLocal() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("getClass()");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private Class class1;\n");
-		buf.append("\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        class1 = getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        Class class1 = getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-		
-	}
-	
-	public void testAssignToLocal2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public Vector goo() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        goo().iterator();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("goo().iterator()");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Iterator;\n");
-		buf.append("import java.util.Vector;\n");				
-		buf.append("public class E {\n");
-		buf.append("    private Iterator iterator;\n");
-		buf.append("    public Vector goo() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        iterator = goo().iterator();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Iterator;\n");
-		buf.append("import java.util.Vector;\n");				
-		buf.append("public class E {\n");
-		buf.append("    public Vector goo() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        Iterator iterator = goo().iterator();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-	
-	public void testAssignToLocal3() throws Exception {
-		// test prefixes and this qualification
-		
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_KEYWORD_THIS, true);
-		Preferences corePrefs= JavaCore.getPlugin().getPluginPreferences();
-		corePrefs.setValue(JavaCore.CODEASSIST_FIELD_PREFIXES, "f");
-		corePrefs.setValue(JavaCore.CODEASSIST_LOCAL_PREFIXES, "_");
-			
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int fCount;\n");
-		buf.append("\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        System.getSecurityManager();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("System");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int fCount;\n");
-		buf.append("    private SecurityManager fManager;\n");
-		buf.append("\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        this.fManager = System.getSecurityManager();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int fCount;\n");
-		buf.append("\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        SecurityManager _manager = System.getSecurityManager();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-	
-	public void testAssignToLocal4() throws Exception {
-		// test name conflict
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int f;\n");
-		buf.append("\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        Math.min(1.0f, 2.0f);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("Math");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int f;\n");
-		buf.append("    private float g;\n");
-		buf.append("\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        g = Math.min(1.0f, 2.0f);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int f;\n");
-		buf.append("\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        float g = Math.min(1.0f, 2.0f);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-
-	public void testAssignToLocal5() throws Exception {
-		// test prefixes and this qualification on static method
-		
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_KEYWORD_THIS, true);
-		Preferences corePrefs= JavaCore.getPlugin().getPluginPreferences();
-		corePrefs.setValue(JavaCore.CODEASSIST_FIELD_PREFIXES, "f");
-		corePrefs.setValue(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, "fg");
-		corePrefs.setValue(JavaCore.CODEASSIST_LOCAL_PREFIXES, "_");
-			
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int fCount;\n");
-		buf.append("\n");
-		buf.append("    public static void foo() {\n");
-		buf.append("        System.getSecurityManager();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("System");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int fCount;\n");
-		buf.append("    private static SecurityManager fgManager;\n");
-		buf.append("\n");				
-		buf.append("    public static void foo() {\n");
-		buf.append("        E.fgManager = System.getSecurityManager();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    private int fCount;\n");
-		buf.append("\n");
-		buf.append("    public static void foo() {\n");
-		buf.append("        SecurityManager _manager = System.getSecurityManager();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-
-	public void testAssignToLocal6() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    static {\n");
-		buf.append("        getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		int offset= buf.toString().indexOf("getClass()");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static Class class1;\n");
-		buf.append("\n");
-		buf.append("    static {\n");
-		buf.append("        class1 = getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    static {\n");
-		buf.append("        Class class1 = getClass();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-
-	
-	public void testAssignParamToField() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public  E(int count) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("count");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int count;\n");
-		buf.append("\n");
-		buf.append("    public  E(int count) {\n");
-		buf.append("        this.count = count;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testAssignParamToField2() throws Exception {
-		Preferences corePrefs= JavaCore.getPlugin().getPluginPreferences();
-		corePrefs.setValue(JavaCore.CODEASSIST_FIELD_PREFIXES, "f");
-
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public  E(int count, Vector vec[]) {\n");
-		buf.append("        super();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("vec");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    private Vector[] fVec;\n");
-		buf.append("\n");
-		buf.append("    public  E(int count, Vector vec[]) {\n");
-		buf.append("        super();\n");
-		buf.append("        fVec = vec;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-
-	public void testAssignParamToField3() throws Exception {
-		Preferences corePrefs= JavaCore.getPlugin().getPluginPreferences();
-		corePrefs.setValue(JavaCore.CODEASSIST_STATIC_FIELD_PREFIXES, "fg");
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_KEYWORD_THIS, true);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fgVec;\n");
-		buf.append("\n");
-		buf.append("    public static void foo(int count, Vector vec[]) {\n");
-		buf.append("        count++;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("vec[]");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fgVec;\n");
-		buf.append("    private static Vector[] fgVec2;\n");
-		buf.append("\n");
-		buf.append("    public static void foo(int count, Vector vec[]) {\n");
-		buf.append("        E.fgVec2 = vec;\n");
-		buf.append("        count++;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testAssignParamToField4() throws Exception {
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_KEYWORD_THIS, true);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private long count;\n");
-		buf.append("\n");
-		buf.append("    public void foo(int count) {\n");
-		buf.append("        count++;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-				
-		int offset= buf.toString().indexOf("int count");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private long count;\n");
-		buf.append("    private int count2;\n");
-		buf.append("\n");
-		buf.append("    public void foo(int count) {\n");
-		buf.append("        this.count2 = count;\n");
-		buf.append("        count++;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testAssignParamToField5() throws Exception {
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_KEYWORD_THIS, true);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int p1;\n");
-		buf.append("\n");
-		buf.append("    public void foo(int p1, int p2) {\n");
-		buf.append("        this.p1 = p1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		int offset= buf.toString().indexOf("int p2");
-		AssistContext context= getCorrectionContext(cu, offset, 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int p1;\n");
-		buf.append("    private int p2;\n");
-		buf.append("\n");
-		buf.append("    public void foo(int p1, int p2) {\n");
-		buf.append("        this.p1 = p1;\n");
-		buf.append("        this.p2 = p2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}		
-	
-	
-	
-	public void testAssignToLocal2CursorAtEnd() throws Exception {	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public Vector goo() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        goo().toArray();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "goo().toArray();";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");				
-		buf.append("public class E {\n");
-		buf.append("    private Object[] objects;\n");
-		buf.append("    public Vector goo() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        objects = goo().toArray();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");				
-		buf.append("public class E {\n");
-		buf.append("    public Vector goo() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        Object[] objects = goo().toArray();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-	
-	public void testReplaceCatchClauseWithThrowsWithFinally() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");	
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "(IOException e)";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void foo() throws IOException {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-				
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-
-	}
-	
-	public void testReplaceSingleCatchClauseWithThrows() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");	
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "(IOException e)";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void foo() throws IOException {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");	
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-				
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });	
-
-	}
-	
-	public void testUnwrapForLoop() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for (int i= 0; i < 3; i++) {\n");		
-		buf.append("            goo();\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "for";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testUnwrapDoStatement() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        do {\n");		
-		buf.append("            goo();\n");
-		buf.append("            goo();\n");
-		buf.append("            goo();\n");
-		buf.append("        } while (true);\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "do";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo();\n");
-		buf.append("        goo();\n");
-		buf.append("        goo();\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}	
-	
-	public void testUnwrapWhileLoop2Statements() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        while (true) {\n");		
-		buf.append("            goo();\n");
-		buf.append("            System.out.println();\n");		
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "while";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        goo();\n");
-		buf.append("        System.out.println();\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testUnwrapIfStatement() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (1+ 3 == 6) {\n");		
-		buf.append("            StringBuffer buf= new StringBuffer();\n");
-		buf.append("            buf.append(1);\n");
-		buf.append("            buf.append(2);\n");
-		buf.append("            buf.append(3);\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "if";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        StringBuffer buf= new StringBuffer();\n");
-		buf.append("        buf.append(1);\n");
-		buf.append("        buf.append(2);\n");
-		buf.append("        buf.append(3);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        if (1+ 3 == 6) {\n");		
-		buf.append("            StringBuffer buf= new StringBuffer();\n");
-		buf.append("            buf.append(1);\n");
-		buf.append("            buf.append(2);\n");
-		buf.append("            buf.append(3);\n");
-		buf.append("        } else {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-				
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-	
-	public void testUnwrapTryStatement() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            StringBuffer buf= new StringBuffer();\n");
-		buf.append("            buf.append(1);\n");
-		buf.append("            buf.append(2);\n");
-		buf.append("            buf.append(3);\n");
-		buf.append("        } finally {\n");
-		buf.append("            return;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "try";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        StringBuffer buf= new StringBuffer();\n");
-		buf.append("        buf.append(1);\n");
-		buf.append("        buf.append(2);\n");
-		buf.append("        buf.append(3);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testUnwrapAnonymous() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            public void run() { \n");
-		buf.append("                throw new NullPointerException();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "};";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        throw new NullPointerException();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testUnwrapBlock() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        {\n");
-		buf.append("            { \n");
-		buf.append("                throw new NullPointerException();\n");
-		buf.append("            }//comment\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "}//comment";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        {\n");
-		buf.append("            throw new NullPointerException();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testUnwrapParanthesis() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return (9+ 8);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "(9+ 8)";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return 9+ 8;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testUnwrapMethodInvocation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return Math.abs(9+ 8);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "Math.abs(9+ 8)";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str) + str.length(), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return 9+ 8;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testSplitDeclaration1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int i = 9;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "9";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int i;\n");
-		buf.append("        i = 9;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testSplitDeclaration2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for (int i = 0; i < 9; i++) {\n");
-		buf.append("       }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "0";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int i;\n");
-		buf.append("        for (i = 0; i < 9; i++) {\n");
-		buf.append("       }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testSplitDeclaration3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        final int i[] = null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "i[]";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        final int i[];\n");
-		buf.append("        i = null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}	
-	
-	public void testJoinDeclaration1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int var[];\n");
-		buf.append("        var = null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "var";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int var[] = null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-
-
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	
-	public void testJoinDeclaration2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int var;\n");
-		buf.append("        for (var = 0; var < 9; var++) {\n");
-		buf.append("       }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "var";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		List proposals= collectAssists(context, false);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int var = 0;\n");
-		buf.append("        for (; var < 9; var++) {\n");
-		buf.append("       }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	private static final Class[] FILTER_EQ= { LinkedNamesAssistProposal.class, AssignToVariableAssistProposal.class };
-	
-    public void testInvertEquals() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(\"b\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"b\".equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(\"b\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-    
-    public void testInvertEquals2() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        String s= \"a\";\n");
-        buf.append("        s.equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        String s= \"a\";\n");
-        buf.append("        \"a\".equals(s);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        String s= \"a\";\n");
-        buf.append("        s.equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-    
-    public void testInvertEquals3() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    private String a= \"a\";\n");
-        buf.append("    private String b= \"b\";\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        a.equals(b);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    private String a= \"a\";\n");
-        buf.append("    private String b= \"b\";\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        b.equals(a);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    private String a= \"a\";\n");
-        buf.append("    private String b= \"b\";\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        a.equals(b);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-    
-    public void testInvertEquals4() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class S {\n");
-        buf.append("    protected String sup= \"a\";\n");
-        buf.append("}\n");
-        buf.append("public class E extends S {\n");
-        buf.append("    private String a= \"a\";\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        sup.equals(this.a);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class S {\n");
-        buf.append("    protected String sup= \"a\";\n");
-        buf.append("}\n");
-        buf.append("public class E extends S {\n");
-        buf.append("    private String a= \"a\";\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        this.a.equals(sup);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class S {\n");
-        buf.append("    protected String sup= \"a\";\n");
-        buf.append("}\n");
-        buf.append("public class E extends S {\n");
-        buf.append("    private String a= \"a\";\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        sup.equals(this.a);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-
-    public void testInvertEquals5() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class A {\n");
-        buf.append("    static String A= \"a\";\n");
-        buf.append("}\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(A.A);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class A {\n");
-        buf.append("    static String A= \"a\";\n");
-        buf.append("}\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        A.A.equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class A {\n");
-        buf.append("    static String A= \"a\";\n");
-        buf.append("}\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(A.A);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-
-    public void testInvertEquals6() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class A {\n");
-        buf.append("    static String get() {\n");
-        buf.append("        return \"a\";\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(A.get());\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class A {\n");
-        buf.append("    static String get() {\n");
-        buf.append("        return \"a\";\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        A.get().equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class A {\n");
-        buf.append("    static String get() {\n");
-        buf.append("        return \"a\";\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(A.get());\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-
-    public void testInvertEquals7() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".getClass().equals(String.class);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        String.class.equals(\"a\".getClass());\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".getClass().equals(String.class);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-
-    public void testInvertEquals8() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        boolean x = false && \"a\".equals(get());\n");
-        buf.append("    }\n");
-        buf.append("    String get() {\n");
-        buf.append("        return \"a\";\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        boolean x = false && get().equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("    String get() {\n");
-        buf.append("        return \"a\";\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        boolean x = false && \"a\".equals(get());\n");
-        buf.append("    }\n");
-        buf.append("    String get() {\n");
-        buf.append("        return \"a\";\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-
-    public void testInvertEquals9() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        equals(new E());\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        new E().equals(this);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        equals(new E());\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-    
-    public void testInvertEquals10() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(null);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals11() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    boolean equals(Object o, boolean a) {\n");
-        buf.append("        return false;\n");
-        buf.append("    }\n");  
-        buf.append("    public void foo() {\n");        
-        buf.append("        new E().equals(\"a\", false);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-        
-        context= getCorrectionContext(cu, buf.toString().lastIndexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals12() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    boolean equals(boolean b) {\n");
-        buf.append("        return false;\n");
-        buf.append("    }\n");  
-        buf.append("    public void foo() {\n");        
-        buf.append("        new E().equals(false);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-        
-        context= getCorrectionContext(cu, buf.toString().lastIndexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals13() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    boolean equals(boolean b) {\n");
-        buf.append("        return false;\n");
-        buf.append("    }\n");  
-        buf.append("    public void foo() {\n");        
-        buf.append("        new E().equals(true ? true : false);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-        
-        context= getCorrectionContext(cu, buf.toString().lastIndexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals14() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("class Super {\n");
-        buf.append("    protected boolean sBool= false;\n");
-        buf.append("}\n");
-        buf.append("public class E extends Super {\n");
-        buf.append("    boolean equals(boolean b) {\n");
-        buf.append("        return false;\n");
-        buf.append("    }\n");  
-        buf.append("    public void foo() {\n");        
-        buf.append("        new E().equals(sBool);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-        
-        context= getCorrectionContext(cu, buf.toString().lastIndexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals15() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    boolean equals(int i) {\n");
-        buf.append("        return false;\n");
-        buf.append("    }\n");  
-        buf.append("    public void foo() {\n");        
-        buf.append("        new E().equals(1 + 1);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-        
-        context= getCorrectionContext(cu, buf.toString().lastIndexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals16() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    boolean equals(int i) {\n");
-        buf.append("        return false;\n");
-        buf.append("    }\n");  
-        buf.append("    public void foo() {\n");
-        buf.append("        int i= 1;\n");
-        buf.append("        new E().equals(i + i);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-        
-        context= getCorrectionContext(cu, buf.toString().lastIndexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals17() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("       \"a\".equals(null);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals18() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public boolean equals(Object o) {\n");
-        buf.append("       return super.equals(o);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-        
-        context= getCorrectionContext(cu, buf.toString().lastIndexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 0);
-        assertCorrectLabels(proposals);
-    }
-    
-    public void testInvertEquals19() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    private String a= \"a\";\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        a.equals((Object) \"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    private String a= \"a\";\n");        
-        buf.append("    public void foo() {\n");
-        buf.append("        ((Object) \"a\").equals(a);\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    private String a= \"a\";\n");        
-        buf.append("    public void foo() {\n");
-        buf.append("        a.equals((Object) \"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-    
-    public void testInvertEquals20() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        String s= null;\n");
-        buf.append("        \"a\".equals(s = \"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        String s= null;\n");
-        buf.append("        (s = \"a\").equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        String s= null;\n");
-        buf.append("        \"a\".equals(s = \"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-    
-    public void testInvertEquals21() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"aaa\".equals(\"a\" + \"a\" + \"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        (\"a\" + \"a\" + \"a\").equals(\"aaa\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"aaa\".equals(\"a\" + \"a\" + \"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-    
-    public void testInvertEquals22() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(true ? \"a\" : \"b\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        (true ? \"a\" : \"b\").equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(true ? \"a\" : \"b\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-    
-    public void testInvertEquals23() throws Exception {
-        IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-        StringBuffer buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals((\"a\"));\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-        
-        String str= "equals";
-        AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        List proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-        String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        (\"a\").equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-        
-        cu= pack1.createCompilationUnit("E.java", buf.toString(), true, null);
-        context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-        proposals= collectAssists(context, FILTER_EQ);
-        
-        assertNumberOf("proposals", proposals.size(), 1);
-        assertCorrectLabels(proposals);
-        
-        proposal= (CUCorrectionProposal) proposals.get(0);
-        preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-        buf= new StringBuffer();
-        buf.append("package test1;\n");
-        buf.append("public class E {\n");
-        buf.append("    public void foo() {\n");
-        buf.append("        \"a\".equals(\"a\");\n");
-        buf.append("    }\n");
-        buf.append("}\n");
-        assertEqualString(preview, buf.toString());
-    }
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/JavadocQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/JavadocQuickFixTest.java
deleted file mode 100644
index 210024d..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/JavadocQuickFixTest.java
+++ /dev/null
@@ -1,478 +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.jdt.ui.tests.quickfix;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.text.correction.CUCorrectionProposal;
-
-public class JavadocQuickFixTest extends QuickFixTest {
-	
-	private static final Class THIS= JavadocQuickFixTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public JavadocQuickFixTest(String name) {
-		super(name);
-	}
-
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new JavadocQuickFixTest("testInsertAllMissing2"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		options.put(JavaCore.COMPILER_PB_INVALID_JAVADOC, JavaCore.ERROR);
-		options.put(JavaCore.COMPILER_PB_MISSING_JAVADOC_TAGS, JavaCore.ERROR);
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	
-	public void testMissingParam1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param b\n");
-		buf.append("     *      comment on second line.\n");
-		buf.append("     * @param c\n");
-		buf.append("     */\n");
-		buf.append("    public void foo(int a, int b, int c) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		ArrayList proposals= collectCorrections2(cu, 1);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param b\n");
-		buf.append("     *      comment on second line.\n");
-		buf.append("     * @param c\n");
-		buf.append("     */\n");
-		buf.append("    public void foo(int a, int b, int c) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-		assertEqualString(preview1, expected);
-		assertEqualString(preview2, expected);
-	}
-	
-	public void testMissingParam2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param a\n");
-		buf.append("     *      comment on second line.\n");
-		buf.append("     * @param c\n");
-		buf.append("     */\n");
-		buf.append("    public void foo(int a, int b, int c) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		ArrayList proposals= collectCorrections2(cu, 1);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param a\n");
-		buf.append("     *      comment on second line.\n");
-		buf.append("     * @param b\n");
-		buf.append("     * @param c\n");
-		buf.append("     */\n");
-		buf.append("    public void foo(int a, int b, int c) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-		assertEqualString(preview1, expected);
-		assertEqualString(preview2, expected);
-	}
-	public void testMissingParam3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param a\n");
-		buf.append("     *      comment on second line.\n");
-		buf.append("     * @param b\n");
-		buf.append("     */\n");
-		buf.append("    public void foo(int a, int b, int c) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		ArrayList proposals= collectCorrections2(cu, 1);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param a\n");
-		buf.append("     *      comment on second line.\n");
-		buf.append("     * @param b\n");
-		buf.append("     * @param c\n");
-		buf.append("     */\n");
-		buf.append("    public void foo(int a, int b, int c) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-		assertEqualString(preview1, expected);
-		assertEqualString(preview2, expected);
-	}
-	
-	public void testMissingReturn1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param b\n");
-		buf.append("     *      comment on second line.\n");
-		buf.append("     * @param c\n");
-		buf.append("     */\n");
-		buf.append("    public int foo(int b, int c) {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		ArrayList proposals= collectCorrections2(cu, 1);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param b\n");
-		buf.append("     *      comment on second line.\n");
-		buf.append("     * @param c\n");
-		buf.append("     * @return\n");
-		buf.append("     */\n");
-		buf.append("    public int foo(int b, int c) {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-		assertEqualString(preview1, expected);
-		assertEqualString(preview2, expected);
-	}
-	
-	public void testMissingReturn2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     */\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		ArrayList proposals= collectCorrections2(cu, 1);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @return\n");
-		buf.append("     */\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-		assertEqualString(preview1, expected);
-		assertEqualString(preview2, expected);
-	}
-	
-	public void testMissingReturn3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @throws Exception\n");
-		buf.append("     */\n");
-		buf.append("    public int foo() throws Exception {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		ArrayList proposals= collectCorrections2(cu, 1);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @return\n");
-		buf.append("     * @throws Exception\n");
-		buf.append("     */\n");
-		buf.append("    public int foo() throws Exception {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-		assertEqualString(preview1, expected);
-		assertEqualString(preview2, expected);
-	}
-	
-	public void testInsertAllMissing1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @throws Exception\n");
-		buf.append("     */\n");
-		buf.append("    public int foo(int a, int b) throws NullPointerException, Exception {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		ArrayList proposals= collectCorrections2(cu, 4);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param b\n");
-		buf.append("     * @return\n");
-		buf.append("     * @throws NullPointerException\n");
-		buf.append("     * @throws Exception\n");
-		buf.append("     */\n");
-		buf.append("    public int foo(int a, int b) throws NullPointerException, Exception {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @return\n");
-		buf.append("     * @throws Exception\n");
-		buf.append("     */\n");
-		buf.append("    public int foo(int a, int b) throws NullPointerException, Exception {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-		
-	}
-	
-	public void testInsertAllMissing2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param b\n");
-		buf.append("     * @return\n");
-		buf.append("     */\n");
-		buf.append("    public int foo(int a, int b, int c) throws NullPointerException, Exception {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		ArrayList proposals= collectCorrections2(cu, 4);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param b\n");
-		buf.append("     * @param c\n");
-		buf.append("     * @return\n");
-		buf.append("     * @throws NullPointerException\n");
-		buf.append("     * @throws Exception\n");
-		buf.append("     */\n");
-		buf.append("    public int foo(int a, int b, int c) throws NullPointerException, Exception {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("/**\n");
-		buf.append(" */\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * @param a\n");
-		buf.append("     * @param b\n");
-		buf.append("     * @return\n");
-		buf.append("     */\n");
-		buf.append("    public int foo(int a, int b, int c) throws NullPointerException, Exception {\n");
-		buf.append("        return 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-		
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/LocalCorrectionsQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/LocalCorrectionsQuickFixTest.java
deleted file mode 100644
index 00a739c..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/LocalCorrectionsQuickFixTest.java
+++ /dev/null
@@ -1,2842 +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.jdt.ui.tests.quickfix;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.template.CodeTemplates;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.text.correction.CUCorrectionProposal;
-
-public class LocalCorrectionsQuickFixTest extends QuickFixTest {
-	
-	private static final Class THIS= LocalCorrectionsQuickFixTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-
-	public LocalCorrectionsQuickFixTest(String name) {
-		super(name);
-	}
-	
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new LocalCorrectionsQuickFixTest("testIndirectStaticAccess_bug32022"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		options.put(JavaCore.COMPILER_PB_STATIC_ACCESS_RECEIVER, JavaCore.ERROR);
-		
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		CodeTemplates.getCodeTemplate(CodeTemplates.CATCHBLOCK).setPattern("");
-		CodeTemplates.getCodeTemplate(CodeTemplates.CONSTRUCTORSTUB).setPattern("");
-		CodeTemplates.getCodeTemplate(CodeTemplates.METHODSTUB).setPattern("");
-
-		fJProject1= ProjectTestSetup.getProject();
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	
-	public void testFieldAccessToStatic() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.File;\n");
-		buf.append("public class E {\n");
-		buf.append("    public char foo() {\n");
-		buf.append("        return (new File(\"x.txt\")).separatorChar;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.File;\n");
-		buf.append("public class E {\n");
-		buf.append("    public char foo() {\n");
-		buf.append("        return File.separatorChar;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testInheritedAccessOnStatic() throws Exception {
-		IPackageFragment pack0= fSourceFolder.createPackageFragment("pack", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class A {\n");
-		buf.append("    public static void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack0.createCompilationUnit("A.java", buf.toString(), false, null);		
-		
-		buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class B extends A {\n");
-		buf.append("}\n");
-		pack0.createCompilationUnit("B.java", buf.toString(), false, null);		
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import pack.B;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(B b) {\n");
-		buf.append("        b.foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import pack.B;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(B b) {\n");
-		buf.append("        B.foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import pack.A;\n");		
-		buf.append("import pack.B;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(B b) {\n");
-		buf.append("        A.foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class A {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();		
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });
-	}	
-	
-	
-	public void testQualifiedAccessToStatic() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Thread t) {\n");
-		buf.append("        t.sleep(10);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Thread t) {\n");
-		buf.append("        Thread.sleep(10);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-	
-	public void testThisAccessToStatic() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void goo() {\n");
-		buf.append("    }\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        this.goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void goo() {\n");
-		buf.append("    }\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        E.goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void goo() {\n");
-		buf.append("    }\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        this.goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testThisAccessToStaticField() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static int fCount;\n");
-		buf.append("\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        this.fCount= 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static int fCount;\n");
-		buf.append("\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        E.fCount= 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int fCount;\n");
-		buf.append("\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        this.fCount= 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-		
-	}	
-	
-	public void testCastMissingInVarDecl() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        Thread th= o;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        Thread th= (Thread) o;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        Object th= o;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testCastMissingInVarDecl2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.List;\n");		
-		buf.append("public class Container {\n");
-		buf.append("    public List[] getLists() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("Container.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.ArrayList;\n");				
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Container c) {\n");
-		buf.append("         ArrayList[] lists= c.getLists();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.ArrayList;\n");				
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Container c) {\n");
-		buf.append("         ArrayList[] lists= (ArrayList[]) c.getLists();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");					
-		buf.append("import java.util.ArrayList;\n");
-		buf.append("import java.util.List;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Container c) {\n");
-		buf.append("         List[] lists= c.getLists();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-
-	}
-	
-	public void testCastMissingInVarDecl3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        Thread th= foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 0);
-	}	
-	
-	
-	public void testCastMissingInFieldDecl() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    int time= System.currentTimeMillis();\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    int time= (int) System.currentTimeMillis();\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    long time= System.currentTimeMillis();\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}	
-	
-	public void testCastMissingInAssignment() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Iterator;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Iterator iter) {\n");
-		buf.append("        String str;\n");
-		buf.append("        str= iter.next();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Iterator;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Iterator iter) {\n");
-		buf.append("        String str;\n");
-		buf.append("        str= (String) iter.next();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testCastMissingInExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.List;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public String[] foo(List list) {\n");
-		buf.append("        return list.toArray(new List[list.size()]);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.List;\n");
-		buf.append("public class E {\n");
-		buf.append("    public String[] foo(List list) {\n");
-		buf.append("        return (String[]) list.toArray(new List[list.size()]);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.List;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Object[] foo(List list) {\n");
-		buf.append("        return list.toArray(new List[list.size()]);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-	
-	public void testCastOnCastExpression() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.ArrayList;\n");
-		buf.append("import java.util.List;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(List list) {\n");
-		buf.append("        ArrayList a= (Cloneable) list;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.ArrayList;\n");
-		buf.append("import java.util.List;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(List list) {\n");
-		buf.append("        ArrayList a= (ArrayList) list;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.ArrayList;\n");
-		buf.append("import java.util.List;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(List list) {\n");
-		buf.append("        Cloneable a= (Cloneable) list;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-	
-
-	public void testUncaughtException() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");			
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("    }\n");				
-		buf.append("    public void foo() throws IOException {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		 
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");			
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");						
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testUncaughtException2() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public String goo() throws IOException {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        goo().substring(2);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");			
-		buf.append("public class E {\n");
-		buf.append("    public String goo() throws IOException {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");				
-		buf.append("    public void foo() throws IOException {\n");
-		buf.append("        goo().substring(2);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		 
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");			
-		buf.append("public class E {\n");
-		buf.append("    public String goo() throws IOException {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo().substring(2);\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");						
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testUncaughtExceptionRemoveMoreSpecific() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.net.SocketException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() throws SocketException {\n");
-		buf.append("        this.goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.net.SocketException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() throws IOException {\n");
-		buf.append("        this.goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		 
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.net.SocketException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() throws SocketException {\n");
-		buf.append("        try {\n");		
-		buf.append("            this.goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");			
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testUncaughtExceptionToSurroundingTry() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void goo() throws IOException, ParseException {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");
-		buf.append("            E.goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void goo() throws IOException, ParseException {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() throws ParseException {\n");
-		buf.append("        try {\n");
-		buf.append("            E.goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		 
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void goo() throws IOException, ParseException {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");
-		buf.append("            try {\n");
-		buf.append("                E.goo();\n");
-		buf.append("            } catch (ParseException e1) {\n");
-		buf.append("            }\n");		
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-		 
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void goo() throws IOException, ParseException {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");		
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");
-		buf.append("            E.goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } catch (ParseException e) {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}	
-	
-	public void testUncaughtExceptionOnSuper1() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.FileInputStream;\n");		
-		buf.append("public class E extends FileInputStream {\n");
-		buf.append("    public E() {\n");
-		buf.append("        super(\"x\");\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.FileInputStream;\n");		
-		buf.append("import java.io.FileNotFoundException;\n");	
-		buf.append("public class E extends FileInputStream {\n");
-		buf.append("    public E() throws FileNotFoundException {\n");
-		buf.append("        super(\"x\");\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUncaughtExceptionOnSuper2() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public A() throws Exception {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		pack1.createCompilationUnit("A.java", buf.toString(), false, null);		
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends A {\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends A {\n");
-		buf.append("    public E() throws Exception {\n");
-		buf.append("        super();\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		
-		assertEqualString(preview, buf.toString());
-	}	
-	
-	public void testUncaughtExceptionOnThis() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("        this(null);\n");		
-		buf.append("    }\n");
-		buf.append("    public E(Object x) throws IOException {\n");
-		buf.append("    }\n");				
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public E() throws IOException {\n");
-		buf.append("        this(null);\n");		
-		buf.append("    }\n");
-		buf.append("    public E(Object x) throws IOException {\n");
-		buf.append("    }\n");				
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-	
-	
-	boolean BUG_25417= true;
-	
-	public void testUncaughtExceptionDuplicate() throws Exception {
-		if (BUG_25417) {
-			return;
-		}
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class MyException extends Exception {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("MyException.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void m1() throws IOException {\n");
-		buf.append("        m2();\n");
-		buf.append("    }\n");		
-		buf.append("    public void m2() throws IOException, ParseException, MyException {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 2); // 2 uncaught exceptions
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void m1() throws IOException, ParseException, MyException {\n");
-		buf.append("        m2();\n");
-		buf.append("    }\n");		
-		buf.append("    public void m2() throws IOException, ParseException, MyException {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		 
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void m1() throws IOException {\n");
-		buf.append("        try {\n");
-		buf.append("            m2();\n");
-		buf.append("        } catch (ParseException e) {\n");
-		buf.append("        } catch (MyException e) {\n");		
-		buf.append("        }\n");
-		buf.append("    }\n");		
-		buf.append("    public void m2() throws IOException, ParseException, MyException {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}	
-	
-	public void testMultipleUncaughtExceptions() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");						
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException, ParseException {\n");
-		buf.append("    }\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 2); // 2 uncaught exceptions
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");						
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException, ParseException {\n");
-		buf.append("    }\n");				
-		buf.append("    public void foo() throws IOException, ParseException {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		 
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException, ParseException {\n");
-		buf.append("    }\n");				
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } catch (ParseException e) {\n");		
-		buf.append("        }\n");						
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}	
-	
-	public void testUnneededCatchBlock() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");				
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } catch (ParseException e) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");				
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");				
-		buf.append("public class E {\n");
-		buf.append("    public void goo() throws IOException {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() throws ParseException {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-	
-	public void testUnneededCatchBlockSingle() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void goo() {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void goo() {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void goo() {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() throws IOException {\n");
-		buf.append("        goo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-
-	public void testUnneededCatchBlockBug47221() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Object foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            Object o= null;\n");
-		buf.append("            return o;\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        }\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Object foo() {\n");
-		buf.append("        Object o= null;\n");
-		buf.append("        return o;\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Object foo() throws IOException {\n");
-		buf.append("        Object o= null;\n");
-		buf.append("        return o;\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-
-	
-	public void testUnneededCatchBlockWithFinally() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void goo() {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } catch (IOException e) {\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-	
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void goo() {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void goo() {\n");
-		buf.append("    }\n");			
-		buf.append("    public void foo() throws IOException {\n");
-		buf.append("        try {\n");		
-		buf.append("            goo();\n");
-		buf.append("        } finally {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-
-	}
-	
-	public void testUnimplementedMethods() throws Exception {
-		IPackageFragment pack2= fSourceFolder.createPackageFragment("test2", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public interface Inter {\n");
-		buf.append("    int getCount(Object[] o) throws IOException;\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("Inter.java", buf.toString(), false, null);
-
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import test2.Inter;\n");		
-		buf.append("public class E implements Inter{\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import test2.Inter;\n");		
-		buf.append("public abstract class E implements Inter{\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("\n");		
-		buf.append("import test2.Inter;\n");
-		buf.append("public class E implements Inter{\n");
-		buf.append("\n");
-		buf.append("    public int getCount(Object[] o) throws IOException {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-		
-	}
-	
-	public void testUnimplementedMethods2() throws Exception {
-		IPackageFragment pack2= fSourceFolder.createPackageFragment("test2", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public interface Inter {\n");
-		buf.append("    int getCount(Object[] o) throws IOException;\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("Inter.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public abstract class InterImpl implements Inter {\n");
-		buf.append("    protected abstract int[] getMusic() throws IOException;\n");		
-		buf.append("}\n");
-		pack2.createCompilationUnit("InterImpl.java", buf.toString(), false, null);		
-
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import test2.InterImpl;\n");		
-		buf.append("public class E extends InterImpl {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 2);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import test2.InterImpl;\n");		
-		buf.append("public abstract class E extends InterImpl {\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("\n");		
-		buf.append("import test2.InterImpl;\n");
-		buf.append("public class E extends InterImpl {\n");
-		buf.append("\n");
-		buf.append("    protected int[] getMusic() throws IOException {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public int getCount(Object[] o) throws IOException {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}		
-	
-	public void testUnitializedVariable() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int s;\n");
-		buf.append("        try {\n");
-		buf.append("            s= 1;\n");
-		buf.append("        } catch (Exception e) {\n");
-		buf.append("            System.out.println(s);\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int s = 0;\n");
-		buf.append("        try {\n");
-		buf.append("            s= 1;\n");
-		buf.append("        } catch (Exception e) {\n");
-		buf.append("            System.out.println(s);\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-
-	public void testUndefinedConstructorInDefaultConstructor1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public F(Runnable runnable) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends F {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends F {\n");
-		buf.append("\n");
-		buf.append("    public E(Runnable runnable) {\n");
-		buf.append("        super(runnable);\n");		
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUndefinedConstructorInDefaultConstructor2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class F {\n");
-		buf.append("    public F(Runnable runnable) throws IOException {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public F(int i, Runnable runnable) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends F {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends F {\n");
-		buf.append("\n");
-		buf.append("    public E(int i, Runnable runnable) {\n");
-		buf.append("        super(i, runnable);\n");		
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("\n");
-		buf.append("public class E extends F {\n");
-		buf.append("\n");
-		buf.append("    public E(Runnable runnable) throws IOException {\n");
-		buf.append("        super(runnable);\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-	
-	
-	public void testUndefinedConstructorWithEnclosing1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public class SubF {\n");
-		buf.append("        public SubF(int i) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public class SubE extends F.SubF {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public class SubE extends F.SubF {\n");
-		buf.append("\n");
-		buf.append("        public SubE(F f, int i) {\n");
-		buf.append("            f.super(i);\n");		
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUndefinedConstructorWithEnclosing2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public static class SubF {\n");
-		buf.append("        public SubF(int i) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public class SubE extends F.SubF {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public class SubE extends F.SubF {\n");
-		buf.append("\n");
-		buf.append("        public SubE(int i) {\n");
-		buf.append("            super(i);\n");		
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	
-	public void testUndefinedConstructorWithEnclosing3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public static class SubF {\n");
-		buf.append("        public SubF(int i) {\n");
-		buf.append("        }\n");
-		buf.append("        public class SubF2 extends SubF {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public static class SubF {\n");
-		buf.append("        public SubF(int i) {\n");
-		buf.append("        }\n");
-		buf.append("        public class SubF2 extends SubF {\n");
-		buf.append("\n");
-		buf.append("            public SubF2(int i) {\n");
-		buf.append("                super(i);\n");		
-		buf.append("            }\n");	
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testNotVisibleConstructorInDefaultConstructor() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    private F() {\n");
-		buf.append("    }\n");
-		buf.append("    public F(Runnable runnable) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends F {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends F {\n");
-		buf.append("\n");
-		buf.append("    public E(Runnable runnable) {\n");
-		buf.append("        super(runnable);\n");		
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnhandledExceptionInDefaultConstructor() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class F {\n");
-		buf.append("    public F() throws IOException{\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends F {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("\n");
-		buf.append("public class E extends F {\n");
-		buf.append("\n");
-		buf.append("    public E() throws IOException {\n");
-		buf.append("        super();\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedPrivateField() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fCount;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-
-	public void testUnusedPrivateField1() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fCount, fColor= fCount;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fCount;\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedPrivateField2() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fCount= 0;\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        fCount= 1 + 2;\n");		
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedVariable() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_LOCAL, JavaCore.ERROR);
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PARAMETER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        boolean res= process();\n");
-		buf.append("        res= (super.hashCode() == 1);\n");
-		buf.append("    }\n");
-		buf.append("    public boolean process() {\n");
-		buf.append("        return true;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        res= (super.hashCode() == 1);\n");
-		buf.append("    }\n");
-		buf.append("    public boolean process() {\n");
-		buf.append("        return true;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedVariable1() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_LOCAL, JavaCore.ERROR);
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PARAMETER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private Object[] foo() {\n");
-		buf.append("        Object[] i, j= new Object[0];\n");
-		buf.append("        i= j = null;\n");
-		buf.append("        i= (new Object[] { null, null });\n");
-		buf.append("        return j;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private Object[] foo() {\n");
-		buf.append("        Object[] j= new Object[0];\n");
-		buf.append("        j = null;\n");
-		buf.append("        return j;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-
-	public void testUnusedVariable2() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_LOCAL, JavaCore.ERROR);
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PARAMETER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private void foo() {\n");
-		buf.append("        for (int j= 0, i= 0; i < 3; i++) {\n");
-		buf.append("             j= i;\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private void foo() {\n");
-		buf.append("        for (int i= 0; i < 3; i++) {\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedParam() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_LOCAL, JavaCore.ERROR);
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PARAMETER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private void foo(Object str) {\n");
-		buf.append("        {\n");
-		buf.append("            str= toString();\n");
-		buf.append("            str= new String[] { toString(), toString() };\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private void foo() {\n");
-		buf.append("        {\n");
-		buf.append("            str= toString();\n");
-		buf.append("            str= new String[] { toString(), toString() };\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	
-	public void testUnusedPrivateMethod() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int fCount;\n");
-		buf.append(" \n");
-		buf.append("    private void foo() {\n");
-		buf.append("        fCount= 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int fCount;\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedPrivateConstructor() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append(" \n");
-		buf.append("    private E(int i) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedPrivateType() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_PRIVATE_MEMBER, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private class F {\n");
-		buf.append("    }\n");
-		buf.append(" \n");
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}		
-	
-	public void testUnnecessaryCast1() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNNECESSARY_TYPE_CHECK, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        int s = (int) i;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        int s = i;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnnecessaryCast2() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNNECESSARY_TYPE_CHECK, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s) {\n");
-		buf.append("        String r = ((String) s);\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s) {\n");
-		buf.append("        String r = s;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnnecessaryCast3() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNNECESSARY_TYPE_CHECK, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        int s = ((int) 1 + 2) * 3;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        int s = (1 + 2) * 3;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testSuperfluousSemicolon() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_SUPERFLUOUS_SEMICOLON, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        int s= 1;;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        int s= 1;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testIndirectStaticAccess1() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_INDIRECT_STATIC_ACCESS, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment other= fSourceFolder.createPackageFragment("other", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package other;\n");
-		buf.append("public class A {\n");
-		buf.append("    public static final int CONST=1;\n");
-		buf.append("}\n");
-		other.createCompilationUnit("A.java", buf.toString(), false, null);		
-
-		IPackageFragment pack0= fSourceFolder.createPackageFragment("pack", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class B extends other.A {\n");
-		buf.append("}\n");
-		pack0.createCompilationUnit("B.java", buf.toString(), false, null);		
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import pack.B;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo(B b) {\n");
-		buf.append("        return B.CONST;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import other.A;\n");
-		buf.append("import pack.B;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo(B b) {\n");
-		buf.append("        return A.CONST;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testIndirectStaticAccess2() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_INDIRECT_STATIC_ACCESS, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment other= fSourceFolder.createPackageFragment("other", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package other;\n");
-		buf.append("public class A {\n");
-		buf.append("    public static int foo() {\n");
-		buf.append("        return 1;\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		other.createCompilationUnit("A.java", buf.toString(), false, null);		
-
-		IPackageFragment pack0= fSourceFolder.createPackageFragment("pack", false, null);
-		buf= new StringBuffer();
-		buf.append("package pack;\n");
-		buf.append("public class B extends other.A {\n");
-		buf.append("}\n");
-		pack0.createCompilationUnit("B.java", buf.toString(), false, null);		
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return pack.B.foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import other.A;\n");
-		buf.append("\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return A.foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testIndirectStaticAccess_bug40880() throws Exception {
-		
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_INDIRECT_STATIC_ACCESS, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("class FileType {\n");
-		buf.append("    public String extension;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("FileType.java", buf.toString(), false, null);		
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("interface ToolConfigurationSettingsConstants {\n");
-		buf.append("     FileType FILE_TYPE = null;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("ToolConfigurationSettingsConstants.java", buf.toString(), false, null);		
-
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("interface ToolUserSettingsConstants extends ToolConfigurationSettingsConstants {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("ToolUserSettingsConstants.java", buf.toString(), false, null);		
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        ToolUserSettingsConstants.FILE_TYPE.extension.toLowerCase();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-			
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        ToolConfigurationSettingsConstants.FILE_TYPE.extension.toLowerCase();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testIndirectStaticAccess_bug32022() throws Exception {
-		
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_INDIRECT_STATIC_ACCESS, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class StaticField {\n");
-		buf.append("    public boolean flag;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("StaticField.java", buf.toString(), false, null);		
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class ConstClass {\n");
-		buf.append("     public static StaticField staticField = new StaticField();\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("ConstClass.java", buf.toString(), false, null);		
-
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(ConstClass constclass) {\n");
-		buf.append("        constclass.staticField.flag= true;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(ConstClass constclass) {\n");
-		buf.append("        ConstClass.staticField.flag= true;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class ConstClass {\n");
-		buf.append("     public StaticField staticField = new StaticField();\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-	
-	
-	public void testUnnecessaryInstanceof1() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNNECESSARY_TYPE_CHECK, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public boolean foo(String b) {\n");
-		buf.append("        return (b instanceof String);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public boolean foo(String b) {\n");
-		buf.append("        return (b != null);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnnecessaryInstanceof2() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNNECESSARY_TYPE_CHECK, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String b) {\n");
-		buf.append("        if  (b instanceof String && b.getClass() != null) {\n");
-		buf.append("            System.out.println();\n");		
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String b) {\n");
-		buf.append("        if  (b != null && b.getClass() != null) {\n");
-		buf.append("            System.out.println();\n");		
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-
-	public void testUnnecessaryThrownException1() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String b) throws IOException {\n");
-		buf.append("        if  (b != null) {\n");
-		buf.append("            System.out.println();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String b) {\n");
-		buf.append("        if  (b != null) {\n");
-		buf.append("            System.out.println();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnnecessaryThrownException2() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNUSED_DECLARED_THROWN_EXCEPTION, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(int i) throws IOException, ParseException {\n");
-		buf.append("        if  (i == 0) {\n");
-		buf.append("            throw new IOException();\n");	
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.IOException;\n");
-		buf.append("import java.text.ParseException;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(int i) throws IOException {\n");
-		buf.append("        if  (i == 0) {\n");
-		buf.append("            throw new IOException();\n");	
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnqualifiedFieldAccess1() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNQUALIFIED_FIELD_ACCESS, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int count;\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        count= i;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int count;\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        this.count= i;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnqualifiedFieldAccess2() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNQUALIFIED_FIELD_ACCESS, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public int count;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private F f= new F();\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        f.count= i;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private F f= new F();\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        this.f.count= i;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnqualifiedFieldAccess3() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNQUALIFIED_FIELD_ACCESS, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public void setCount(int i) {}\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("F.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private F f= new F();\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        f.setCount(i);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private F f= new F();\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        this.f.setCount(i);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnqualifiedFieldAccess4() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_UNQUALIFIED_FIELD_ACCESS, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int count;\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        class Inner {\n");
-		buf.append("            public void foo() {\n");
-		buf.append("               count= 1;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int count;\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        class Inner {\n");
-		buf.append("            public void foo() {\n");
-		buf.append("               E.this.count= 1;\n");
-		buf.append("            }\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/MarkerResolutionGenerator.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/MarkerResolutionGenerator.java
deleted file mode 100644
index efea7dd..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/MarkerResolutionGenerator.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/MarkerResolutionTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/MarkerResolutionTest.java
deleted file mode 100644
index 42b4566..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/MarkerResolutionTest.java
+++ /dev/null
@@ -1,202 +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.jdt.ui.tests.quickfix;
-
-import java.util.Arrays;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-
-import org.eclipse.ui.IEditorPart;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
-import org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionAssistant;
-import org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor;
-
-public class MarkerResolutionTest extends QuickFixTest {
-	
-	private static final Class THIS= MarkerResolutionTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	private boolean BUG_46227= true;
-
-	public MarkerResolutionTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new MarkerResolutionTest("testQuickFixAfterModification"));
-			return suite;
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-
-	private IMarker createMarker(ICompilationUnit cu, int line, int offset, int len) throws CoreException {
-		IFile file= (IFile) cu.getResource();
-		IMarker marker= file.createMarker("org.eclipse.jdt.ui.tests.testmarker");
-		marker.setAttribute(IMarker.LOCATION, cu.getElementName());
-		marker.setAttribute(IMarker.MESSAGE, "Test marker");
-		marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
-		marker.setAttribute(IMarker.LINE_NUMBER, line);
-		marker.setAttribute(IMarker.CHAR_START, offset);
-		marker.setAttribute(IMarker.CHAR_END, offset + len);
-		return marker;
-	}
-
-	
-	public void testQuickFix() throws Exception {
-		if (BUG_46227)
-			return;
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        goo(true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		createMarker(cu, 0, 0, 7);
-		
-		IEditorPart part= EditorUtility.openInEditor(cu);
-		ITextViewer viewer= ((JavaEditor) part).getViewer();
-		
-		try {
-			JavaCorrectionAssistant assistant= new JavaCorrectionAssistant(part);
-			JavaCorrectionProcessor processor= new JavaCorrectionProcessor(assistant);
-			ICompletionProposal[] proposals= processor.computeCompletionProposals(viewer, 0);
-			
-			assertNumberOf("proposals", proposals.length, 1);
-			assertCorrectLabels(Arrays.asList(proposals));
-			
-			IDocument doc= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			
-			proposals[0].apply(doc);
-			
-			buf= new StringBuffer();
-			buf.append("PACKAGE test1;\n");
-			buf.append("import java.util.Vector;\n");
-			buf.append("public class E {\n");
-			buf.append("    void foo(Vector vec) {\n");
-			buf.append("        goo(true);\n");
-			buf.append("    }\n");
-			buf.append("}\n");
-			assertEqualString(doc.get(), buf.toString());
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-	}
-	
-	public void testQuickFixAfterModification() throws Exception {
-		if (BUG_46227)
-			return;
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        goo(true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		int markerPos= 8;
-		createMarker(cu, 0, markerPos, 5);
-		
-		IEditorPart part= EditorUtility.openInEditor(cu);
-		try {
-			IDocument doc= JavaUI.getDocumentProvider().getDocument(part.getEditorInput());
-			doc.replace(0, 0, "\n"); // insert new line
-			
-			JavaCorrectionAssistant assistant= new JavaCorrectionAssistant(part);
-			JavaCorrectionProcessor processor= new JavaCorrectionProcessor(assistant);
-			ICompletionProposal[] proposals= processor.computeCompletionProposals(null, markerPos + 1);
-			
-			assertNumberOf("proposals", proposals.length, 1);
-			assertCorrectLabels(Arrays.asList(proposals));	
-			
-			proposals[0].apply(doc);
-			
-			buf= new StringBuffer();
-			buf.append("\n");		
-			buf.append("package TEST1;\n");
-			buf.append("import java.util.Vector;\n");
-			buf.append("public class E {\n");
-			buf.append("    void foo(Vector vec) {\n");
-			buf.append("        goo(true);\n");
-			buf.append("    }\n");
-			buf.append("}\n");
-			assertEqualString(doc.get(), buf.toString());
-		} finally {
-			JavaPlugin.getActivePage().closeAllEditors(false);
-		}
-	}	
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ModifierCorrectionsQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ModifierCorrectionsQuickFixTest.java
deleted file mode 100644
index 5952dfa..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ModifierCorrectionsQuickFixTest.java
+++ /dev/null
@@ -1,1091 +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.jdt.ui.tests.quickfix;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.text.correction.CUCorrectionProposal;
-
-public class ModifierCorrectionsQuickFixTest extends QuickFixTest {
-	
-	private static final Class THIS= ModifierCorrectionsQuickFixTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ModifierCorrectionsQuickFixTest(String name) {
-		super(name);
-	}
-
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ModifierCorrectionsQuickFixTest("testOuterLocalMustBeFinal"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		options.put(JavaCore.COMPILER_PB_STATIC_ACCESS_RECEIVER, JavaCore.ERROR);
-		
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	public void testStaticMethodRequestedInSameType1() throws Exception {
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void xoo() {\n");
-		buf.append("    }\n");		
-		buf.append("    public static void foo() {\n");
-		buf.append("        xoo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void xoo() {\n");
-		buf.append("    }\n");		
-		buf.append("    public static void foo() {\n");
-		buf.append("        xoo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-	
-	public void testStaticMethodRequestedInSameType2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void xoo() {\n");
-		buf.append("    }\n");		
-		buf.append("    public static void foo() {\n");
-		buf.append("        E.xoo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void xoo() {\n");
-		buf.append("    }\n");		
-		buf.append("    public static void foo() {\n");
-		buf.append("        E.xoo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testStaticMethodRequestedInOtherType() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public void xoo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("         X.xoo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public static void xoo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testInvisibleMethodRequestedInSuperType() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");	
-		buf.append("public class C {\n");
-		buf.append("    private void xoo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends C {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("         xoo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    protected void xoo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testInvisibleSuperMethodRequestedInSuperType() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    private void xoo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends C {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("         super.xoo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    protected void xoo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-		
-	public void testInvisibleMethodRequestedInOtherPackage() throws Exception {
-		IPackageFragment pack2= fSourceFolder.createPackageFragment("test2", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("import java.util.List;\n");		
-		buf.append("public class C {\n");
-		buf.append("    private void xoo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import test2.C;\n");				
-		buf.append("public class E {\n");
-		buf.append("    public void foo(C c) {\n");
-		buf.append("         c.xoo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("import java.util.List;\n");		
-		buf.append("public class C {\n");
-		buf.append("    public void xoo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testInvisibleConstructorRequestedInOtherType() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");	
-		buf.append("public class C {\n");
-		buf.append("    private C() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("         C c= new C();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");	
-		buf.append("public class C {\n");
-		buf.append("    C() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testInvisibleConstructorRequestedInSuperType() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");	
-		buf.append("public class C {\n");
-		buf.append("    private C() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends C {\n");
-		buf.append("    public E() {\n");
-		buf.append("         super();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");	
-		buf.append("public class C {\n");
-		buf.append("    protected C() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-	
-	public void testInvisibleFieldRequestedInSamePackage1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    private int fXoo;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");	
-		buf.append("public class E {\n");
-		buf.append("    public void foo(C c) {\n");
-		buf.append("         c.fXoo= 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    int fXoo;\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testInvisibleFieldRequestedInSamePackage2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    private int fXoo;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");	
-		buf.append("public class E extends C {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("         fXoo= 1;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    protected int fXoo;\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-	
-	
-	public void testNonStaticMethodRequestedInConstructor() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int xoo() { return 1; };\n");
-		buf.append("    public E(int val) {\n");		
-		buf.append("    }\n");			
-		buf.append("    public E() {\n");
-		buf.append("         this(xoo());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static int xoo() { return 1; };\n");
-		buf.append("    public E(int val) {\n");		
-		buf.append("    }\n");			
-		buf.append("    public E() {\n");
-		buf.append("         this(xoo());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}		
-	
-	public void testNonStaticFieldRequestedInConstructor() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int fXoo= 1;\n");
-		buf.append("    public E(int val) {\n");		
-		buf.append("    }\n");			
-		buf.append("    public E() {\n");
-		buf.append("         this(fXoo);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static int fXoo= 1;\n");
-		buf.append("    public E(int val) {\n");		
-		buf.append("    }\n");			
-		buf.append("    public E() {\n");
-		buf.append("         this(fXoo);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testInvisibleTypeRequestedInDifferentPackage() throws Exception {
-		if (false) {
-			System.out.println("testInvisibleTypeRequestedInDifferentPackage: Waiting for release fo bug fix 24406");	
-			return;
-		}
-		
-		IPackageFragment pack2= fSourceFolder.createPackageFragment("test2", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("class C {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("         test2.C c= null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testInvisibleTypeRequestedFromSuperClass() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    private class CInner {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		pack1.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends C {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("         CInner c= null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class C {\n");
-		buf.append("    class CInner {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	
-	public void testInvisibleImport() throws Exception {
-		IPackageFragment pack2= fSourceFolder.createPackageFragment("test2", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("class C {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("C.java", buf.toString(), false, null);
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("         test2.C c= null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("public class C {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testAbstractMethodWithBody() throws Exception {	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public abstract void foo() {\n");
-		buf.append("    }\n");				
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");				
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public abstract class E {\n");
-		buf.append("    public abstract void foo();\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-
-	}
-	
-	public void testAbstractMethodInNonAbstractClass() throws Exception {	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public abstract int foo();\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return 0;\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");		
-		buf.append("public abstract class E {\n");
-		buf.append("    public abstract int foo();\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testNativeMethodWithBody() throws Exception {	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public native void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");		
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public native void foo();\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testOuterLocalMustBeFinal() throws Exception {
-	
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        int i= 9;\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                int x= i;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        final int i= 9;\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                int x= i;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testOuterParameterMustBeFinal() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                int x= i;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(final int i) {\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                int x= i;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testOuterForParamMustBeFinal() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for (int i= 1; true;) {\n");		
-		buf.append("            Runnable run= new Runnable() {\n");
-		buf.append("                public void run() {\n");
-		buf.append("                    int x= i;\n");
-		buf.append("                }\n");
-		buf.append("            };\n");			
-		buf.append("        }\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        for (final int i= 1; true;) {\n");		
-		buf.append("            Runnable run= new Runnable() {\n");
-		buf.append("                public void run() {\n");
-		buf.append("                    int x= i;\n");
-		buf.append("                }\n");
-		buf.append("            };\n");			
-		buf.append("        }\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testMethodRequiresBody() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo();\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testMethodRequiresBody2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo();\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-	
-	public void testNeedToEmulateMethodAccess() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_SYNTHETIC_ACCESS_EMULATION, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void x() {\n");
-		buf.append("        Runnable r= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                foo();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("    private void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void x() {\n");
-		buf.append("        Runnable r= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                foo();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("    void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testNeedToEmulateConstructorAccess() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_SYNTHETIC_ACCESS_EMULATION, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void x() {\n");
-		buf.append("        Runnable r= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("               E e= new E();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("    private E() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void x() {\n");
-		buf.append("        Runnable r= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("               E e= new E();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("    E() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}		
-	
-	public void testNeedToEmulateFieldRead() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_SYNTHETIC_ACCESS_EMULATION, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void x() {\n");
-		buf.append("        Runnable r= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("               int x= fCount;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("    private int fCount; {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void x() {\n");
-		buf.append("        Runnable r= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("               int x= fCount;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("    int fCount; {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testNeedToEmulateFieldWrite() throws Exception {
-		Hashtable hashtable= JavaCore.getOptions();
-		hashtable.put(JavaCore.COMPILER_PB_SYNTHETIC_ACCESS_EMULATION, JavaCore.ERROR);
-		JavaCore.setOptions(hashtable);
-				
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void x() {\n");
-		buf.append("        Runnable r= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("               fCount= 2;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("    private int fCount; {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void x() {\n");
-		buf.append("        Runnable r= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("               fCount= 2;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("    int fCount; {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}		
-
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java
deleted file mode 100644
index 7431284..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java
+++ /dev/null
@@ -1,327 +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.jdt.ui.tests.quickfix;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IProblemRequestor;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.WorkingCopyOwner;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.FieldDeclaration;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.TypeDeclaration;
-import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
-
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-import org.eclipse.jdt.ui.text.java.IInvocationContext;
-
-import org.eclipse.jdt.internal.ui.text.correction.AssistContext;
-import org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor;
-import org.eclipse.jdt.internal.ui.text.correction.LinkedNamesAssistProposal;
-import org.eclipse.jdt.internal.ui.text.correction.ProblemLocation;
-
-/**
-  */
-public class QuickFixTest extends TestCase {
-
-	public static Test suite() {
-		TestSuite suite= new TestSuite();
-		suite.addTest(UnresolvedTypesQuickFixTest.allTests());
-		suite.addTest(UnresolvedVariablesQuickFixTest.allTests());
-		suite.addTest(UnresolvedMethodsQuickFixTest.allTests());
-		suite.addTest(ReturnTypeQuickFixTest.allTests());
-		suite.addTest(LocalCorrectionsQuickFixTest.allTests());
-		suite.addTest(ReorgQuickFixTest.allTests());
-		suite.addTest(ModifierCorrectionsQuickFixTest.allTests());
-		suite.addTest(AssistQuickFixTest.allTests());
-		suite.addTest(MarkerResolutionTest.allTests());
-		suite.addTest(JavadocQuickFixTest.allTests());
-		return new ProjectTestSetup(suite);
-	}
-
-	
-	public QuickFixTest(String name) {
-		super(name);
-	}
-	
-	public static void assertCorrectLabels(List proposals) {
-		for (int i= 0; i < proposals.size(); i++) {
-			ICompletionProposal proposal= (ICompletionProposal) proposals.get(i);
-			String name= proposal.getDisplayString();
-			if (name == null || name.length() == 0 || name.charAt(0) == '!' || name.indexOf("{0}") != -1 || name.indexOf("{1}") != -1) {
-				assertTrue("wrong proposal label: " + name, false);
-			}
-			if (proposal.getImage() == null) {
-				assertTrue("wrong proposal image", false);
-			}			
-		}
-	}
-	
-	public static void assertCorrectContext(IInvocationContext context, ProblemLocation problem) {
-		if (problem.getProblemId() != 0) {
-			if (!JavaCorrectionProcessor.hasCorrections(context.getCompilationUnit(), problem.getProblemId())) {
-				assertTrue("Problem type not marked with lightbulb: " + problem, false);
-			}
-		}
-	}	
-	
-	
-	public static void assertNumberOf(String name, int nProblems, int nProblemsExpected) {
-		assertTrue("Wrong number of " + name + ", is: " + nProblems + ", expected: " + nProblemsExpected, nProblems == nProblemsExpected);
-	}
-	
-	
-	public static void assertEqualStringsIgnoreOrder(String[] str1, String[] str2) {
-		ArrayList list1= new ArrayList(Arrays.asList(str1));
-		ArrayList list2= new ArrayList(Arrays.asList(str2));
-		
-		for (int i= list1.size() - 1; i >= 0; i--) {
-			if (list2.remove(list1.get(i))) {
-				list1.remove(i);
-			}
-		}
-		
-		int n1= list1.size();
-		int n2= list2.size();
-		
-		if (n1 + n2 > 0) {
-			if (n1 == 1 && n2 == 1) {
-				assertEqualString((String) list1.get(0), (String) list2.get(0));
-			}
-			
-			StringBuffer buf= new StringBuffer();
-			buf.append("Content not as expected: Content is: \n");
-			for (int i= 0; i < n1; i++) {
-				String s1= (String) list1.get(i);
-				if (s1 != null) {
-					buf.append(s1);
-					buf.append("\n");
-				}
-			}
-			buf.append("Expected contents: \n");
-			for (int i= 0; i < n2; i++) {
-				String s2= (String) list2.get(i);
-				if (s2 != null) {
-					buf.append(s2);
-					buf.append("\n");
-				}
-			}
-			assertTrue(buf.toString(), false);
-		}				
-	}
-		
-	private static int getDiffPos(String str1, String str2) {
-		int len1= Math.min(str1.length(), str2.length());
-		
-		int diffPos= -1;
-		for (int i= 0; i < len1; i++) {
-			if (str1.charAt(i) != str2.charAt(i)) {
-				diffPos= i;
-				break;
-			}
-		}
-		if (diffPos == -1 && str1.length() != str2.length()) {
-			diffPos= len1;
-		}
-		return diffPos;
-	}
-	
-	private static final int printRange= 6;
-	
-	public static void assertEqualString(String str1, String str2) {	
-		int diffPos= getDiffPos(str1, str2);
-		if (diffPos != -1) {
-			int diffAhead= Math.max(0, diffPos - printRange);
-			int diffAfter= Math.min(str1.length(), diffPos + printRange);
-			
-			String diffStr= str1.substring(diffAhead, diffPos) + '^' + str1.substring(diffPos, diffAfter);
-			assertTrue("Content not as expected: is\n" + str1 + "\nDiffers at pos " + diffPos + ": " + diffStr + "\nexpected:\n" + str2, false);
-		}
-	}
-	
-	public static void assertEqualStringIgnoreDelim(String str1, String str2) throws IOException {
-		BufferedReader read1= new BufferedReader(new StringReader(str1));
-		BufferedReader read2= new BufferedReader(new StringReader(str2));
-		
-		int line= 1;
-		do {
-			String s1= read1.readLine();
-			String s2= read2.readLine();
-			
-			if (s1 == null || !s1.equals(s2)) {
-				if (s1 == null && s2 == null) {
-					return;
-				}
-				String diffStr= (s1 == null) ? s2 : s1;
-				assertTrue("Content not as expected: is\n" + str1 + "\nDiffers at line " + line + ": " + diffStr + "\nexpected:\n" + str2, false);
-			}
-			line++;
-		} while (true);
-	}	
-	
-	public static TypeDeclaration findTypeDeclaration(CompilationUnit astRoot, String simpleTypeName) {
-		List types= astRoot.types();
-		for (int i= 0; i < types.size(); i++) {
-			TypeDeclaration elem= (TypeDeclaration) types.get(i);
-			if (simpleTypeName.equals(elem.getName().getIdentifier())) {
-				return elem;
-			}
-		}
-		return null;
-	}
-	
-	public static MethodDeclaration findMethodDeclaration(TypeDeclaration typeDecl, String methodName) {
-		MethodDeclaration[] methods= typeDecl.getMethods();
-		for (int i= 0; i < methods.length; i++) {
-			if (methodName.equals(methods[i].getName().getIdentifier())) {
-				return methods[i];
-			}
-		}
-		return null;
-	}
-	
-	public static VariableDeclarationFragment findFieldDeclaration(TypeDeclaration typeDecl, String fieldName) {
-		FieldDeclaration[] fields= typeDecl.getFields();
-		for (int i= 0; i < fields.length; i++) {
-			List list= fields[i].fragments();
-			for (int k= 0; k < list.size(); k++) {
-				VariableDeclarationFragment fragment= (VariableDeclarationFragment) list.get(k);
-				if (fieldName.equals(fragment.getName().getIdentifier())) {
-					return fragment;
-				}				
-			}
-		}
-		return null;
-	}	
-		
-	public static AssistContext getCorrectionContext(ICompilationUnit cu, int offset, int length) {
-		AssistContext context= new AssistContext(cu, offset, length);
-		return context;
-	}
-
-
-	protected final ArrayList collectCorrections(ICompilationUnit cu, CompilationUnit astRoot) {
-		return collectCorrections(cu, astRoot, 1);
-	}
-
-
-	protected final ArrayList collectCorrections(ICompilationUnit cu, CompilationUnit astRoot, int nProblems) {
-		IProblem[] problems= astRoot.getProblems();
-		if (problems.length != nProblems) {
-			StringBuffer buf= new StringBuffer("Wrong number of problems, is: ");
-			buf.append(problems.length).append(", expected: ").append(nProblems).append('\n');
-			for (int i= 0; i < problems.length; i++) {
-				buf.append(problems[i]);
-				buf.append('[').append(problems[i].getSourceStart()).append(" ,").append(problems[i].getSourceEnd()).append(']');
-				buf.append('\n');
-			}
-			assertTrue(buf.toString(), false);
-
-		}
-		return collectCorrections(cu, problems[0]);
-	}
-	
-	protected final ArrayList collectCorrections2(ICompilationUnit cu, int nProblems) throws JavaModelException {
-		
-		final ArrayList problemsList= new ArrayList();
-		IProblemRequestor requestor= new IProblemRequestor() {
-			public void acceptProblem(IProblem problem) {
-				problemsList.add(problem);
-			}
-			public void beginReporting() {
-				problemsList.clear();
-			}
-			public void endReporting() {}
-			public boolean isActive() {	return true;}
-		};
-		
-		ICompilationUnit wc= cu.getWorkingCopy(new WorkingCopyOwner() {}, requestor, null);
-		try {
-			wc.reconcile(true, null);
-		} finally {
-			wc.discardWorkingCopy();
-		}
-		
-		IProblem[] problems= (IProblem[]) problemsList.toArray(new IProblem[problemsList.size()]);
-		if (problems.length != nProblems) {
-			StringBuffer buf= new StringBuffer("Wrong number of problems, is: ");
-			buf.append(problems.length).append(", expected: ").append(nProblems).append('\n');
-			for (int i= 0; i < problems.length; i++) {
-				buf.append(problems[i]);
-				buf.append('[').append(problems[i].getSourceStart()).append(" ,").append(problems[i].getSourceEnd()).append(']');
-				buf.append('\n');
-			}
-			assertTrue(buf.toString(), false);
-
-		}
-		return collectCorrections(cu, problems[0]);
-	}
-		
-	protected final ArrayList collectCorrections(ICompilationUnit cu, IProblem curr) {
-			
-		int offset= curr.getSourceStart();
-		int length= curr.getSourceEnd() + 1 - offset;
-		
-		ProblemLocation problem= new ProblemLocation(offset, length, curr.getID(), curr.getArguments());
-		AssistContext context= new AssistContext(cu, offset, length);
-		assertCorrectContext(context, problem);
-		ArrayList proposals= new ArrayList();
-		
-		JavaCorrectionProcessor.collectCorrections(context,  new ProblemLocation[] { problem }, proposals);
-		return proposals;
-	}
-
-
-	protected final ArrayList collectAssists(IInvocationContext context, Class[] filteredTypes) {
-		ArrayList proposals= new ArrayList();
-		JavaCorrectionProcessor.collectAssists(context, null, proposals);
-		
-		if (filteredTypes != null && filteredTypes.length > 0) {
-			for (Iterator iter= proposals.iterator(); iter.hasNext(); ) {
-				if (isFiltered(iter.next(), filteredTypes)) {
-					iter.remove();
-				}
-			}
-		}
-		return proposals;
-	}
-	
-	private boolean isFiltered(Object curr, Class[] filteredTypes) {
-		for (int k = 0; k < filteredTypes.length; k++) {
-			if (filteredTypes[k].isInstance(curr)) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	protected final ArrayList collectAssists(IInvocationContext context, boolean includeLinkedRename) {
-		Class[] filteredTypes= includeLinkedRename ? null : new Class[] { LinkedNamesAssistProposal.class };
-		return collectAssists(context, filteredTypes);
-	}	
-	
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ReorgQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ReorgQuickFixTest.java
deleted file mode 100644
index 63e153c..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ReorgQuickFixTest.java
+++ /dev/null
@@ -1,754 +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.jdt.ui.tests.quickfix;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-import org.eclipse.jdt.ui.text.java.IProblemLocation;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.text.correction.AssistContext;
-import org.eclipse.jdt.internal.ui.text.correction.CUCorrectionProposal;
-import org.eclipse.jdt.internal.ui.text.correction.ChangeCorrectionProposal;
-import org.eclipse.jdt.internal.ui.text.correction.CorrectMainTypeNameProposal;
-import org.eclipse.jdt.internal.ui.text.correction.CorrectPackageDeclarationProposal;
-import org.eclipse.jdt.internal.ui.text.correction.JavaCorrectionProcessor;
-import org.eclipse.jdt.internal.ui.text.correction.ProblemLocation;
-
-public class ReorgQuickFixTest extends QuickFixTest {
-	
-	private static final Class THIS= ReorgQuickFixTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ReorgQuickFixTest(String name) {
-		super(name);
-	}
-
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ReorgQuickFixTest("testMethodWithConstructorName"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		options.put(JavaCore.COMPILER_PB_UNUSED_IMPORT, JavaCore.ERROR);
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	
-	public void testUnusedImports() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		Object p1= proposals.get(0);
-		if (!(p1 instanceof CUCorrectionProposal)) {
-			p1= proposals.get(1);
-		}
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) p1;
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedImportsInDefaultPackage() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		Object p1= proposals.get(0);
-		if (!(p1 instanceof CUCorrectionProposal)) {
-			p1= proposals.get(1);
-		}
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) p1;
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testUnusedImportOnDemand() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");				
-		buf.append("import java.util.Vector;\n");
-		buf.append("import java.net.*;\n");
-		buf.append("\n");				
-		buf.append("public class E {\n");
-		buf.append("    Vector v;\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		Object p1= proposals.get(0);
-		if (!(p1 instanceof CUCorrectionProposal)) {
-			p1= proposals.get(1);
-		}
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) p1;
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");				
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class E {\n");
-		buf.append("    Vector v;\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testCollidingImports() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");				
-		buf.append("import java.security.Permission;\n");
-		buf.append("import java.security.acl.Permission;\n");
-		buf.append("import java.util.Vector;\n");		
-		buf.append("\n");				
-		buf.append("public class E {\n");
-		buf.append("    Permission p;\n");
-		buf.append("    Vector v;\n");		
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		Object p1= proposals.get(0);
-		if (!(p1 instanceof CUCorrectionProposal)) {
-			p1= proposals.get(1);
-		}
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) p1;
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");				
-		buf.append("import java.security.Permission;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");				
-		buf.append("public class E {\n");
-		buf.append("    Permission p;\n");
-		buf.append("    Vector v;\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testWrongPackageStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("\n");				
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean hasRename= true, hasMove= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			ChangeCorrectionProposal curr= (ChangeCorrectionProposal) proposals.get(i);
-			if (curr instanceof CorrectPackageDeclarationProposal) {
-				assertTrue("Duplicated proposal", hasRename);
-				hasRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) curr;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();				
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("\n");				
-				buf.append("public class E {\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());			
-			} else {
-				assertTrue("Duplicated proposal", hasMove);
-				hasMove= false;				
-				curr.apply(null);
-				
-				IPackageFragment pack2= fSourceFolder.getPackageFragment("test2");
-				ICompilationUnit cu2= pack2.getCompilationUnit("E.java");
-				assertTrue("CU does not exist", cu2.exists());
-				buf= new StringBuffer();
-				buf.append("package test2;\n");
-				buf.append("\n");				
-				buf.append("public class E {\n");
-				buf.append("}\n");
-				assertEqualStringIgnoreDelim(cu2.getSource(), buf.toString());					
-			}
-		}
-	}
-	
-	public void testWrongPackageStatementFromDefault() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("\n");				
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean hasRename= true, hasMove= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			ChangeCorrectionProposal curr= (ChangeCorrectionProposal) proposals.get(i);
-			if (curr instanceof CorrectPackageDeclarationProposal) {
-				assertTrue("Duplicated proposal", hasRename);
-				hasRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) curr;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();				
-				buf= new StringBuffer();
-				buf.append("\n");
-				buf.append("\n");
-				buf.append("public class E {\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());			
-			} else {
-				assertTrue("Duplicated proposal", hasMove);
-				hasMove= false;				
-				curr.apply(null);
-				
-				IPackageFragment pack2= fSourceFolder.getPackageFragment("test2");
-				ICompilationUnit cu2= pack2.getCompilationUnit("E.java");
-				assertTrue("CU does not exist", cu2.exists());
-				buf= new StringBuffer();
-				buf.append("package test2;\n");
-				buf.append("\n");				
-				buf.append("public class E {\n");
-				buf.append("}\n");
-				assertEqualStringIgnoreDelim(cu2.getSource(), buf.toString());					
-			}
-		}
-	}		
-	
-	public void testWrongDefaultPackageStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test2", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean hasRename= true, hasMove= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			ChangeCorrectionProposal curr= (ChangeCorrectionProposal) proposals.get(i);
-			if (curr instanceof CorrectPackageDeclarationProposal) {
-				assertTrue("Duplicated proposal", hasRename);
-				hasRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) curr;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();				
-				buf= new StringBuffer();
-				buf.append("package test2;\n");
-				buf.append("\n");
-				buf.append("public class E {\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());			
-			} else {
-				assertTrue("Duplicated proposal", hasMove);
-				hasMove= false;				
-				curr.apply(null);
-				
-				IPackageFragment pack2= fSourceFolder.getPackageFragment("");
-				ICompilationUnit cu2= pack2.getCompilationUnit("E.java");
-				assertTrue("CU does not exist", cu2.exists());
-				buf= new StringBuffer();			
-				buf.append("public class E {\n");
-				buf.append("}\n");
-				assertEqualStringIgnoreDelim(cu2.getSource(), buf.toString());					
-			}
-		}
-	}
-	
-	public void testWrongPackageStatementButColliding() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("\n");		
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		IPackageFragment pack2= fSourceFolder.createPackageFragment("test2", false, null);
-		buf.append("package test2;\n");
-		buf.append("\n");		
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-			
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());			
-	}
-	
-	public void testWrongTypeName() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");				
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("X.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean hasRename= true, hasMove= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			ChangeCorrectionProposal curr= (ChangeCorrectionProposal) proposals.get(i);
-			if (curr instanceof CorrectMainTypeNameProposal) {
-				assertTrue("Duplicated proposal", hasRename);
-				hasRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) curr;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();				
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("\n");				
-				buf.append("public class X {\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());					
-			} else {						
-				assertTrue("Duplicated proposal", hasMove);
-				hasMove= false;				
-				curr.apply(null);
-				
-				ICompilationUnit cu2= pack1.getCompilationUnit("E.java");
-				assertTrue("CU does not exist", cu2.exists());
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("\n");				
-				buf.append("public class E {\n");
-				buf.append("}\n");
-				assertEqualStringIgnoreDelim(cu2.getSource(), buf.toString());
-			}
-		}
-	}
-	
-	public void testWrongTypeNameButColliding() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");		
-		buf.append("public class X {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		buf.append("package test1;\n");
-		buf.append("\n");		
-		buf.append("public class X {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());			
-	}
-	
-	public void testWrongTypeNameWithConstructor() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");		
-		buf.append("public class X {\n");
-		buf.append("    public X() {\n");
-		buf.append("        X other;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		buf.append("package test1;\n");
-		buf.append("\n");		
-		buf.append("public class X {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");		
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("        E other;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());			
-	}		
-	
-	public void testTodoTasks1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        // TODO: XXX\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "TODO: XXX";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		ProblemLocation problem= new ProblemLocation(buf.toString().indexOf(str), str.length(), IProblem.Task, new String[0]);
-		ArrayList proposals= new ArrayList();
-		
-		JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem } , proposals);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testTodoTasks2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        // Some other text TODO: XXX\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "TODO: XXX";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		ProblemLocation problem= new ProblemLocation(buf.toString().indexOf(str), str.length(), IProblem.Task, new String[0]);
-		ArrayList proposals= new ArrayList();
-		
-		JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem } , proposals);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        // Some other text \n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testTodoTasks3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        /* TODO: XXX */\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "TODO: XXX";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		ProblemLocation problem= new ProblemLocation(buf.toString().indexOf(str), str.length(), IProblem.Task, new String[0]);
-		ArrayList proposals= new ArrayList();
-		
-		JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem } , proposals);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testTodoTasks4() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        /**\n");
-		buf.append("        TODO: XXX\n");
-		buf.append("        */\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "TODO: XXX";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		ProblemLocation problem= new ProblemLocation(buf.toString().indexOf(str), str.length(), IProblem.Task, new String[0]);
-		ArrayList proposals= new ArrayList();
-		
-		JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem } , proposals);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}		
-	
-	public void testTodoTasks5() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        /**\n");
-		buf.append("        Some other text: TODO: XXX\n");
-		buf.append("        */\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "TODO: XXX";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		ProblemLocation problem= new ProblemLocation(buf.toString().indexOf(str), str.length(), IProblem.Task, new String[0]);
-		ArrayList proposals= new ArrayList();
-		
-		JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem } , proposals);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        /**\n");
-		buf.append("        Some other text: \n");
-		buf.append("        */\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testTodoTasks6() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        ;// TODO: XXX\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "TODO: XXX";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		ProblemLocation problem= new ProblemLocation(buf.toString().indexOf(str), str.length(), IProblem.Task, new String[0]);
-		ArrayList proposals= new ArrayList();
-		
-		JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem } , proposals);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        ;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-	
-	public void testTodoTasks7() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        /* TODO: XXX*/;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		String str= "TODO: XXX";
-		AssistContext context= getCorrectionContext(cu, buf.toString().indexOf(str), 0);
-		ProblemLocation problem= new ProblemLocation(buf.toString().indexOf(str), str.length(), IProblem.Task, new String[0]);
-		ArrayList proposals= new ArrayList();
-		
-		JavaCorrectionProcessor.collectCorrections(context, new IProblemLocation[] { problem } , proposals);
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        ;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());	
-	}
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ReturnTypeQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ReturnTypeQuickFixTest.java
deleted file mode 100644
index 9d489b1..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/ReturnTypeQuickFixTest.java
+++ /dev/null
@@ -1,874 +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.jdt.ui.tests.quickfix;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.text.correction.ASTRewriteCorrectionProposal;
-import org.eclipse.jdt.internal.ui.text.correction.CUCorrectionProposal;
-
-public class ReturnTypeQuickFixTest extends QuickFixTest {
-	
-	private static final Class THIS= ReturnTypeQuickFixTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public ReturnTypeQuickFixTest(String name) {
-		super(name);
-	}
-
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new ReturnTypeQuickFixTest("testMethodWithConstructorName"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	
-	public void testSimpleTypeReturnDeclMissing() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public foo() {\n");
-		buf.append("        return (new Vector()).elements();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean addReturnType= true, doRename= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			Object elem= proposals.get(i);
-			if (elem instanceof ASTRewriteCorrectionProposal) {
-				ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) elem;
-				assertTrue("duplicated entries", addReturnType);
-				addReturnType= false;		
-		
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-		
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("import java.util.Enumeration;\n");		
-				buf.append("import java.util.Vector;\n");
-				buf.append("public class E {\n");
-				buf.append("    public Enumeration foo() {\n");
-				buf.append("        return (new Vector()).elements();\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			} else {
-				assertTrue("duplicated entries", doRename);
-				doRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) elem;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("import java.util.Vector;\n");				
-				buf.append("public class E {\n");
-				buf.append("    public E() {\n");
-				buf.append("        return (new Vector()).elements();\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			}
-		}
-				
-				
-	}
-	
-	public void testVoidTypeReturnDeclMissing() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public foo() {\n");
-		buf.append("        //do nothing\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean addReturnType= true, doRename= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			Object elem= proposals.get(i);
-			if (elem instanceof ASTRewriteCorrectionProposal) {
-				ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) elem;
-				assertTrue("duplicated entries", addReturnType);
-				addReturnType= false;		
-		
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-		
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    public void foo() {\n");
-				buf.append("        //do nothing\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			} else {
-				assertTrue("duplicated entries", doRename);
-				doRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) elem;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    public E() {\n");
-				buf.append("        //do nothing\n");	
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			}
-		}	
-		
-	}
-	
-	public void testVoidTypeReturnDeclMissing2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public foo() {\n");
-		buf.append("        if (true) {\n");
-		buf.append("           return;\n");
-		buf.append("        }\n");
-		buf.append("        return;\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean addReturnType= true, doRename= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			Object elem= proposals.get(i);
-			if (elem instanceof ASTRewriteCorrectionProposal) {
-				ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) elem;
-				assertTrue("duplicated entries", addReturnType);
-				addReturnType= false;		
-		
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-		
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    public void foo() {\n");
-				buf.append("        if (true) {\n");
-				buf.append("           return;\n");
-				buf.append("        }\n");
-				buf.append("        return;\n");				
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			} else {
-				assertTrue("duplicated entries", doRename);
-				doRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) elem;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    public E() {\n");
-				buf.append("        if (true) {\n");
-				buf.append("           return;\n");
-				buf.append("        }\n");
-				buf.append("        return;\n");				
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			}
-		}	
-	}
-	
-	public void testVoidMissingInAnonymousType() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("            }\n");
-		buf.append("            public foo() {\n");
-		buf.append("            }\n");		
-		buf.append("        };\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        Runnable run= new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("            }\n");
-		buf.append("            public void foo() {\n");
-		buf.append("            }\n");		
-		buf.append("        };\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	
-	public void testNullTypeReturnDeclMissing() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public foo() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean addReturnType= true, doRename= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			Object elem= proposals.get(i);
-			if (elem instanceof ASTRewriteCorrectionProposal) {
-				ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) elem;
-				assertTrue("duplicated entries", addReturnType);
-				addReturnType= false;		
-		
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-		
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    public Object foo() {\n");
-				buf.append("        return null;\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			} else {
-				assertTrue("duplicated entries", doRename);
-				doRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) elem;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    public E() {\n");
-				buf.append("        return null;\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			}	
-		}		
-	}
-	
-	public void testArrayTypeReturnDeclMissing() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public foo() {\n");
-		buf.append("        return new int[][] { { 1, 2 }, { 2, 3 } };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		boolean addReturnType= true, doRename= true;
-		
-		for (int i= 0; i < proposals.size(); i++) {
-			Object elem= proposals.get(i);
-			if (elem instanceof ASTRewriteCorrectionProposal) {
-				ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) elem;
-				assertTrue("duplicated entries", addReturnType);
-				addReturnType= false;
-
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-		
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    public int[][] foo() {\n");
-				buf.append("        return new int[][] { { 1, 2 }, { 2, 3 } };\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			} else {
-				assertTrue("duplicated entries", doRename);
-				doRename= false;
-				
-				CUCorrectionProposal proposal= (CUCorrectionProposal) elem;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    public E() {\n");
-				buf.append("        return new int[][] { { 1, 2 }, { 2, 3 } };\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			}
-		}	
-	}
-	
-	public void testVoidMethodReturnsStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    Vector fList= new Vector();\n");
-		buf.append("    public void elements() {\n");
-		buf.append("        return fList.toArray();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-			
-		{	
-			ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-			String preview= proposal.getCompilationUnitChange().getPreviewContent();
-		
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("import java.util.Vector;\n");
-			buf.append("public class E {\n");
-			buf.append("    Vector fList= new Vector();\n");
-			buf.append("    public Object[] elements() {\n");
-			buf.append("        return fList.toArray();\n");
-			buf.append("    }\n");
-			buf.append("}\n");
-			assertEqualString(preview, buf.toString());
-		}
-		{	
-			ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(1);
-			String preview= proposal.getCompilationUnitChange().getPreviewContent();
-		
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("import java.util.Vector;\n");
-			buf.append("public class E {\n");
-			buf.append("    Vector fList= new Vector();\n");
-			buf.append("    public void elements() {\n");
-			buf.append("    }\n");
-			buf.append("}\n");
-			assertEqualString(preview, buf.toString());
-		}		
-	}
-	
-	public void testVoidMethodReturnsAnonymClass() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void getOperation() {\n");
-		buf.append("        return new Runnable() {\n");
-		buf.append("            public void run() {}\n");
-		buf.append("        };\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-			
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Runnable getOperation() {\n");
-		buf.append("        return new Runnable() {\n");
-		buf.append("            public void run() {}\n");
-		buf.append("        };\n");				
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (ASTRewriteCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-			
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void getOperation() {\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-	
-	public void testConstructorReturnsValue() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Arrays;\n");		
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("        return Arrays.asList(null);\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		{
-			ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-			String preview= proposal.getCompilationUnitChange().getPreviewContent();
-	
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("import java.util.Arrays;\n");
-			buf.append("import java.util.List;\n");					
-			buf.append("public class E {\n");
-			buf.append("    public List E() {\n");
-			buf.append("        return Arrays.asList(null);\n");		
-			buf.append("    }\n");
-			buf.append("}\n");
-			assertEqualString(preview, buf.toString());
-		}
-		{
-			ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(1);
-			String preview= proposal.getCompilationUnitChange().getPreviewContent();
-	
-			buf= new StringBuffer();
-			buf.append("package test1;\n");
-			buf.append("import java.util.Arrays;\n");		
-			buf.append("public class E {\n");
-			buf.append("    public E() {\n");
-			buf.append("    }\n");
-			buf.append("}\n");
-			assertEqualString(preview, buf.toString());
-		}		
-	}
-	
-	
-	public void testCorrectReturnStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Runnable getOperation() {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public Runnable getOperation() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (ASTRewriteCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void getOperation() {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-	
-	public void testCorrectReturnStatementForArray() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int[][] getArray() {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int[][] getArray() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (ASTRewriteCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void getArray() {\n");
-		buf.append("        return;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}	
-	
-	public void testMethodWithConstructorName() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int[][] E() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}	
-	
-	public void testMissingReturnStatement() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int[][] getArray() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public int[][] getArray() {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (ASTRewriteCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void getArray() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-
-	public void testMissingReturnStatementWithCode() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int[] fArray;\n");		
-		buf.append("    public int getArray()[] {\n");
-		buf.append("        if (true) {\n");		
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int[] fArray;\n");	
-		buf.append("    public int getArray()[] {\n");
-		buf.append("        if (true) {\n");		
-		buf.append("        }\n");
-		buf.append("        return fArray;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (ASTRewriteCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int[] fArray;\n");		
-		buf.append("    public void getArray()[] {\n");
-		buf.append("        if (true) {\n");		
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-
-	public void testMissingReturnStatementWithCode2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public boolean isVisible() {\n");
-		buf.append("        boolean res= false;\n");			
-		buf.append("        if (true) {\n");
-		buf.append("            res= false;\n");			
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public boolean isVisible() {\n");
-		buf.append("        boolean res= false;\n");			
-		buf.append("        if (true) {\n");
-		buf.append("            res= false;\n");			
-		buf.append("        }\n");
-		buf.append("        return res;\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (ASTRewriteCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void isVisible() {\n");
-		buf.append("        boolean res= false;\n");			
-		buf.append("        if (true) {\n");
-		buf.append("            res= false;\n");			
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-	
-	public void testMissingReturnStatementWithCode3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public String getDebugInfo() {\n");
-		buf.append("        getClass().getName();\n");			
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public String getDebugInfo() {\n");
-		buf.append("        return getClass().getName();\n");			
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1 }, new String[] { expected1 });
-	}
-	
-	public void testMissingReturnStatementWithCode4() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public String getDebugInfo() {\n");
-		buf.append("        getClass().notify();\n");			
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		ASTRewriteCorrectionProposal proposal= (ASTRewriteCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public String getDebugInfo() {\n");
-		buf.append("        getClass().notify();\n");			
-		buf.append("        return null;\n");			
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1 }, new String[] { expected1 });
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedMethodsQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedMethodsQuickFixTest.java
deleted file mode 100644
index d6cc391..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedMethodsQuickFixTest.java
+++ /dev/null
@@ -1,2493 +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.jdt.ui.tests.quickfix;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.template.CodeTemplates;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.text.correction.CUCorrectionProposal;
-import org.eclipse.jdt.internal.ui.text.correction.NewMethodCompletionProposal;
-
-public class UnresolvedMethodsQuickFixTest extends QuickFixTest {
-	private static final Class THIS= UnresolvedMethodsQuickFixTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public UnresolvedMethodsQuickFixTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new UnresolvedMethodsQuickFixTest("testParameterMismatchMoreArguments4"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		options.put(JavaCore.COMPILER_PB_NO_EFFECT_ASSIGNMENT, JavaCore.IGNORE);
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		CodeTemplates.getCodeTemplate(CodeTemplates.CATCHBLOCK).setPattern("");
-		CodeTemplates.getCodeTemplate(CodeTemplates.CONSTRUCTORSTUB).setPattern("");
-		CodeTemplates.getCodeTemplate(CodeTemplates.METHODSTUB).setPattern("");		
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-
-	
-	public void testMethodInSameType() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private int goo(Vector vec, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-		
-	public void testMethodInForInit() throws Exception {		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (int i= 0, j= goo(3); i < 0; i++) {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (int i= 0, j= goo(3); i < 0; i++) {\n");
-		buf.append("        }\n");	
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private int goo(int i) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testMethodInInfixExpression1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private boolean foo() {\n");
-		buf.append("        return f(1) || f(2);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 2);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private boolean foo() {\n");
-		buf.append("        return f(1) || f(2);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private boolean f(int i) {\n");
-		buf.append("        return false;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testMethodInInfixExpression2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private boolean foo() {\n");
-		buf.append("        return f(1) == f(2);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 2);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private boolean foo() {\n");
-		buf.append("        return f(1) == f(2);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private Object f(int i) {\n");
-		buf.append("        return null;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}		
-
-	public void testMethodSpacing0EmptyLines() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("    private int goo(Vector vec, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-
-	public void testMethodSpacing1EmptyLine() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private int goo(Vector vec, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-
-	public void testMethodSpacing2EmptyLines() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("    \n");
-		buf.append("    \n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("    \n");
-		buf.append("    \n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("\n");
-		buf.append("    private int goo(Vector vec, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-
-	public void testMethodSpacingComment() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("//comment\n");
-		buf.append("\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("//comment\n");
-		buf.append("\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private int goo(Vector vec, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-
-	public void testMethodSpacingJavadoc() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    /**\n");
-		buf.append("     * javadoc\n");
-		buf.append("     */\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    /**\n");
-		buf.append("     * javadoc\n");
-		buf.append("     */\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private int goo(Vector vec, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-
-	public void testMethodSpacingNonJavadoc() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    /*\n");
-		buf.append("     * non javadoc\n");
-		buf.append("     */\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("\n");
-		buf.append("    void fred() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    /*\n");
-		buf.append("     * non javadoc\n");
-		buf.append("     */\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private int goo(Vector vec, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testMethodInSameTypeUsingThis() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= this.goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        int i= this.goo(vec, true);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private int goo(Vector vec, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testMethodInDifferentClass() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(X x) {\n");
-		buf.append("        boolean i= x.goo(1, 2.1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("\n");
-		buf.append("    public boolean goo(int i, double d) {\n");
-		buf.append("        return false;\n");
-		buf.append("    }\n");				
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testMethodInAnonymous1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                xoo();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                xoo();\n");
-		buf.append("            }\n");
-		buf.append("\n");
-		buf.append("            private void xoo() {\n");
-		buf.append("            }\n");		
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                xoo();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    protected void xoo() {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                foo();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-				
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testMethodInAnonymous2() throws Exception {
-		IPackageFragment pack0= fSourceFolder.createPackageFragment("other", false, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf= new StringBuffer();
-		buf.append("package other;\n");
-		buf.append("public class A {\n");
-		buf.append("}\n");
-		pack0.createCompilationUnit("A.java", buf.toString(), false, null);
-
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import other.A;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                A.xoo();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package other;\n");
-		buf.append("public class A {\n");
-		buf.append("\n");
-		buf.append("    public static void xoo() {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		assertEqualString(preview1, expected1);			
-	}
-	
-	public void testMethodInAnonymousCovering1() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                run(1);\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 4);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                E.this.run(1);\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                run();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run(int i) {\n");
-		buf.append("                run(1);\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(3);
-		String preview4= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                run(1);\n");
-		buf.append("            }\n");
-		buf.append("\n");
-		buf.append("            private void run(int i) {\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected4= buf.toString();		
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3, preview4 }, new String[] { expected1, expected2, expected3, expected4 });
-	}
-	
-	public void testMethodInAnonymousCovering2() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                run(1);\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 4);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                E.run(1);\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                run();\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run(int i) {\n");
-		buf.append("                run(1);\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(3);
-		String preview4= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public static void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                run(1);\n");
-		buf.append("            }\n");
-		buf.append("\n");
-		buf.append("            private void run(int i) {\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected4= buf.toString();		
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3, preview4 }, new String[] { expected1, expected2, expected3, expected4 });
-	}
-	
-	public void testMethodInAnonymousCovering3() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public class Inner {\n");
-		buf.append("        public void run() {\n");
-		buf.append("            run(1);\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 4);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public class Inner {\n");
-		buf.append("        public void run() {\n");
-		buf.append("            E.this.run(1);\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public class Inner {\n");
-		buf.append("        public void run() {\n");
-		buf.append("            run();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public class Inner {\n");
-		buf.append("        public void run(int i) {\n");
-		buf.append("            run(1);\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(3);
-		String preview4= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public class Inner {\n");
-		buf.append("        public void run() {\n");
-		buf.append("            run(1);\n");
-		buf.append("        }\n");
-		buf.append("\n");
-		buf.append("        private void run(int i) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected4= buf.toString();		
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3, preview4 }, new String[] { expected1, expected2, expected3, expected4 });
-	}
-	
-	public void testMethodInAnonymousCovering4() throws Exception {
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public static class Inner {\n");
-		buf.append("        public void run() {\n");
-		buf.append("            run(1);\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public static class Inner {\n");
-		buf.append("        public void run() {\n");
-		buf.append("            run(1);\n");
-		buf.append("        }\n");
-		buf.append("\n");
-		buf.append("        private void run(int i) {\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public static class Inner {\n");
-		buf.append("        public void run() {\n");
-		buf.append("            run();\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void run(int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public static class Inner {\n");
-		buf.append("        public void run(int i) {\n");
-		buf.append("            run(1);\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });
-	}	
-	
-		
-	
-	
-	public void testMethodInDifferentInterface() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(X x) {\n");
-		buf.append("        boolean i= x.goo(getClass());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public interface X {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public interface X {\n");
-		buf.append("\n");
-		buf.append("    boolean goo(Class class1);\n");				
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-	}
-	
-	public void testParameterMismatchCast() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        long x= 0;\n");
-		buf.append("        foo(x + 1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        long x= 0;\n");
-		buf.append("        foo((int) (x + 1));\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        long x= 0;\n");
-		buf.append("        foo(x + 1);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo(long l) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(long l) {\n");
-		buf.append("        long x= 0;\n");
-		buf.append("        foo(x + 1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testParameterMismatchCast2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        double x= 0.0;\n");
-		buf.append("        X.xoo((float) x, this);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public static void xoo(int i, Object o) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);				
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        double x= 0.0;\n");
-		buf.append("        X.xoo((int) x, this);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public static void xoo(int i, Object o) {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public static void xoo(float f, E e) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");		
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public static void xoo(float f, Object o) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	
-	public void testParameterMismatchLessArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s, int i, Object o) {\n");
-		buf.append("        int x= 0;\n");
-		buf.append("        foo(x);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s, int i, Object o) {\n");
-		buf.append("        int x= 0;\n");
-		buf.append("        foo(s, x, o);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s, int i, Object o) {\n");
-		buf.append("        int x= 0;\n");
-		buf.append("        foo(x);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo(int x) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        int x= 0;\n");
-		buf.append("        foo(x);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testParameterMismatchLessArguments2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        X.xoo(null);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public static void xoo(int i, Object o) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);		
-		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        X.xoo(0, null);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public static void xoo(int i, Object o) {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public static void xoo(Object object) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public static void xoo(Object o) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testSuperConstructorLessArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public X(Object o, int i) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);		
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E extends X {\n");
-		buf.append("    public E() {\n");
-		buf.append("        super(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E extends X {\n");
-		buf.append("    public E() {\n");
-		buf.append("        super(new Vector(), 0);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class X {\n");
-		buf.append("    public X(Object o, int i) {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public X(Vector vector) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public X(Object o) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testConstructorInvocationLessArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(Object o, int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public E() {\n");
-		buf.append("        this(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(Object o, int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public E() {\n");
-		buf.append("        this(new Vector(), 0);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(Object o) {\n");
-		buf.append("    }\n");
-		buf.append("    public E() {\n");
-		buf.append("        this(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(Object o, int i) {\n");
-		buf.append("    }\n");
-		buf.append("    public E() {\n");
-		buf.append("        this(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("    public E(Vector vector) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}	
-	
-	
-	public void testParameterMismatchMoreArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(X x) {\n");
-		buf.append("        x.xoo(1, 1, x);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public void xoo(int i, Object o) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(X x) {\n");
-		buf.append("        x.xoo(1, x);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public void xoo(int i, int j, Object o) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public void xoo(int i, Object o) {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public void xoo(int i, int j, X x) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testParameterMismatchMoreArguments2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s) {\n");
-		buf.append("        int x= 0;\n");
-		buf.append("        foo(s, x);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s) {\n");
-		buf.append("        int x= 0;\n");
-		buf.append("        foo(s);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s) {\n");
-		buf.append("        int x= 0;\n");
-		buf.append("        foo(s, x);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo(String s, int x) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(String s, int x2) {\n");
-		buf.append("        int x= 0;\n");
-		buf.append("        foo(s, x);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testParameterMismatchMoreArguments3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Collections;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(X x) {\n");
-		buf.append("        x.xoo(Collections.EMPTY_SET, 1, 2);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public void xoo(int i) {\n");
-		buf.append("       int j= 0;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Collections;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(X x) {\n");
-		buf.append("        x.xoo(1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");	
-		buf.append("import java.util.Set;\n");
-		buf.append("\n");	
-		buf.append("public class X {\n");
-		buf.append("    public void xoo(Set set, int i, int k) {\n");
-		buf.append("       int j= 0;\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");	
-		buf.append("import java.util.Set;\n");
-		buf.append("\n");	
-		buf.append("public class X {\n");
-		buf.append("    public void xoo(int i) {\n");
-		buf.append("       int j= 0;\n");		
-		buf.append("    }\n");
-		buf.append("\n");		
-		buf.append("    public void xoo(Set set, int i, int j) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testSuperConstructorMoreArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public X() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);		
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E extends X {\n");
-		buf.append("    public E() {\n");
-		buf.append("        super(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E extends X {\n");
-		buf.append("    public E() {\n");
-		buf.append("        super();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class X {\n");
-		buf.append("    public X() {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public X(Vector vector) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class X {\n");
-		buf.append("    public X(Vector vector) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testConstructorInvocationMoreArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    public E(Object o, int i) {\n");
-		buf.append("        this(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    public E(Object o, int i) {\n");
-		buf.append("        this();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(Vector vector) {\n");
-		buf.append("    }\n");
-		buf.append("    public E(Object o, int i) {\n");
-		buf.append("        this(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E() {\n");
-		buf.append("    }\n");
-		buf.append("    public E(Object o, int i) {\n");
-		buf.append("        this(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("    public E(Vector vector) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}	
-		
-	
-	
-	
-	public void testParameterMismatchSwap() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i, Object o) {\n");
-		buf.append("        foo(new Object[] { o }, i - 1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i, Object o) {\n");
-		buf.append("        foo(i - 1, new Object[] { o });\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i, Object o) {\n");
-		buf.append("        foo(new Object[] { o }, i - 1);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    private void foo(Object[] objects, int i) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o, int i) {\n");
-		buf.append("        foo(new Object[] { o }, i - 1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}		
-	
-	
-	
-	public void testSuperConstructor() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends A {\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        super(i);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1=pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("A.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("\n");
-		buf.append("    public A(int i) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected1= buf.toString();	
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends A {\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        super();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-
-	}
-	
-	
-	public void testClassInstanceCreation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        A a= new A(i);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1=pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("A.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("\n");
-		buf.append("    public A(int i) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected1= buf.toString();	
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        A a= new A();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();		
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testClassInstanceCreationMoreArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        A a= new A(i, String.valueOf(i), true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1=pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public A(int i) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		pack1.createCompilationUnit("A.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public A(int i, String string, boolean b) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected1= buf.toString();	
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        A a= new A(i);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public A(int i) {\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public A(int i, String string, boolean b) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();			
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}	
-
-	public void testClassInstanceCreationLessArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        A a= new A();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1=pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public A(int i, String s) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		pack1.createCompilationUnit("A.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public A() {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected1= buf.toString();	
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        A a= new A(i, null);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("    public A(int i, String s) {\n");
-		buf.append("    }\n");	
-		buf.append("\n");
-		buf.append("    public A() {\n");
-		buf.append("    }\n");	
-		buf.append("}\n");
-		String expected3= buf.toString();			
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}		
-	
-	
-	public void testConstructorInvocation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        this(i, true);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1=pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public E(int i) {\n");
-		buf.append("        this(i, true);\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public E(int i, boolean b) {\n");
-		buf.append("    }\n");		
-		buf.append("}\n");
-		String expected1= buf.toString();
-				
-		assertEqualString(preview1, expected1);
-	}
-		
-	public void testSuperMethodInvocation() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E extends A {\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("        super.foo(i);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1=pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("A.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		NewMethodCompletionProposal proposal= (NewMethodCompletionProposal) proposals.get(0);
-		String preview= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class A {\n");
-		buf.append("\n");
-		buf.append("    public void foo(int i) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		assertEqualString(preview, buf.toString());
-
-	}
-	
-	public void testSuperMethodMoreArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);		
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E extends X {\n");
-		buf.append("    public void xoo() {\n");
-		buf.append("        super.foo(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E extends X {\n");
-		buf.append("    public void xoo() {\n");
-		buf.append("        super.foo();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class X {\n");
-		buf.append("    public int foo(Vector vector) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class X {\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public void foo(Vector vector) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	public void testSuperMethodLessArguments() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public int foo(Object o, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("X.java", buf.toString(), false, null);		
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E extends X {\n");
-		buf.append("    public void xoo() {\n");
-		buf.append("        super.foo(new Vector());\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E extends X {\n");
-		buf.append("    public void xoo() {\n");
-		buf.append("        super.foo(new Vector(), false);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class X {\n");
-		buf.append("    public int foo(Object o) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("\n");
-		buf.append("public class X {\n");
-		buf.append("    public int foo(Object o, boolean b) {\n");
-		buf.append("        return 0;\n");
-		buf.append("    }\n");
-		buf.append("\n");
-		buf.append("    public void foo(Vector vector) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });		
-	}
-	
-	
-	public void testMissingCastParents1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        String x= (String) o.substring(1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        String x= ((String) o).substring(1);\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();		
-
-		assertEqualString(preview1, expected1);
-	}
-	
-	public void testMissingCastParents2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        String x= (String) o.substring(1).toLowerCase();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(Object o) {\n");
-		buf.append("        String x= ((String) o).substring(1).toLowerCase();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();		
-
-		assertEqualString(preview1, expected1);
-	}
-	
-	public void testMissingCastParents3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static Object obj;\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        String x= (String) E.obj.substring(1).toLowerCase();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static Object obj;\n");
-		buf.append("    public void foo() {\n");
-		buf.append("        String x= ((String) E.obj).substring(1).toLowerCase();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();		
-
-		assertEqualString(preview1, expected1);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedTypesQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedTypesQuickFixTest.java
deleted file mode 100644
index c5d9da4..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedTypesQuickFixTest.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedVariablesQuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedVariablesQuickFixTest.java
deleted file mode 100644
index 6d53d94..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UnresolvedVariablesQuickFixTest.java
+++ /dev/null
@@ -1,1081 +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.jdt.ui.tests.quickfix;
-
-import java.util.ArrayList;
-import java.util.Hashtable;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
-import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.template.CodeTemplates;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.text.correction.CUCorrectionProposal;
-import org.eclipse.jdt.internal.ui.text.correction.NewCUCompletionUsingWizardProposal;
-import org.eclipse.jdt.internal.ui.text.correction.NewVariableCompletionProposal;
-import org.eclipse.jdt.internal.ui.text.correction.RenameNodeCompletionProposal;
-
-public class UnresolvedVariablesQuickFixTest extends QuickFixTest {
-	
-	private static final Class THIS= UnresolvedVariablesQuickFixTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public UnresolvedVariablesQuickFixTest(String name) {
-		super(name);
-	}
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new UnresolvedVariablesQuickFixTest("testVarInAnonymous"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		Hashtable options= JavaCore.getDefaultOptions();
-		options.put(JavaCore.FORMATTER_TAB_CHAR, JavaCore.SPACE);
-		options.put(DefaultCodeFormatterConstants.FORMATTER_NUMBER_OF_EMPTY_LINES_TO_PRESERVE, "1");
-		options.put(JavaCore.FORMATTER_TAB_SIZE, "4");
-		options.put(JavaCore.COMPILER_PB_UNUSED_IMPORT, JavaCore.IGNORE);		
-		JavaCore.setOptions(options);			
-
-		IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
-		store.setValue(PreferenceConstants.CODEGEN_ADD_COMMENTS, false);
-		
-		fJProject1= ProjectTestSetup.getProject();
-		
-		CodeTemplates.getCodeTemplate(CodeTemplates.NEWTYPE).setPattern("");
-		CodeTemplates.getCodeTemplate(CodeTemplates.TYPECOMMENT).setPattern("");
-		
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	public void testVarInAssignment() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        iter= vec.iterator();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 4);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Iterator;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    private Iterator iter;\n");
-		buf.append("\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        iter= vec.iterator();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Iterator;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("        Iterator iter = vec.iterator();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Iterator;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec, Iterator iter) {\n");
-		buf.append("        iter= vec.iterator();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(3);
-		String preview4= proposal.getCompilationUnitChange().getPreviewContent();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.util.Vector;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(Vector vec) {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected4= buf.toString();
-	
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3, preview4 }, new String[] { expected1, expected2, expected3, expected4 });	
-	}
-	
-	public void testVarInForInitializer() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (i= 0;;) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int i;\n");
-		buf.append("\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (i= 0;;) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();	
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (int i = 0;;) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo(int i) {\n");
-		buf.append("        for (i= 0;;) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });	
-	}	
-	
-	
-	public void testVarInInitializer() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int i= k;\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int k;\n");
-		buf.append("    private int i= k;\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static final int k = 0;\n");
-		buf.append("    private int i= k;\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });	
-	}
-	
-	public void testVarInOtherType() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    void foo(E e) {\n");
-		buf.append("         e.var2= 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("F.java", buf.toString(), false, null);		
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int var1;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		boolean doNew= true, doChange= true;
-		for (int i= 0; i < proposals.size(); i++) {
-			Object curr= proposals.get(i);
-			if (curr instanceof NewVariableCompletionProposal) {
-				assertTrue("2 new proposals", doNew);
-				doNew= false;
-				NewVariableCompletionProposal proposal= (NewVariableCompletionProposal) curr;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-	
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class E {\n");
-				buf.append("    private int var1;\n");
-				buf.append("    public int var2;\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			} else if (curr instanceof CUCorrectionProposal) {
-				assertTrue("2 replace proposals", doChange);
-				doChange= false;
-				CUCorrectionProposal proposal= (CUCorrectionProposal) curr;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-	
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("public class F {\n");
-				buf.append("    void foo(E e) {\n");
-				buf.append("         e.var1= 2;\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			}
-		}
-	}
-	
-	public void testVarInSuperFieldAccess() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F extends E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("         super.var2= 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("F.java", buf.toString(), false, null);		
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    protected int var1;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-	
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F extends E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("         super.var1= 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-	
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    protected int var1;\n");
-		buf.append("    public int var2;\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testVarInSuper() throws Exception {
-		StringBuffer buf= new StringBuffer();
-
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import test3.E;\n");
-		buf.append("public class F extends E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("         this.color= baz();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("F.java", buf.toString(), false, null);		
-
-		IPackageFragment pack2= fSourceFolder.createPackageFragment("test2", false, null);
-		buf= new StringBuffer();
-		buf.append("package test2;\n");
-		buf.append("public class E {\n");
-		buf.append("}\n");
-		pack2.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		IPackageFragment pack3= fSourceFolder.createPackageFragment("test3", false, null);
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    protected Object olor;\n");
-		buf.append("    public test2.E baz() {\n");
-		buf.append("        return null;\n");		
-		buf.append("    }\n");				
-		buf.append("}\n");
-		pack3.createCompilationUnit("E.java", buf.toString(), false, null);		
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-	
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import test3.E;\n");
-		buf.append("public class F extends E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("         this.olor= baz();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-	
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import test3.E;\n");
-		buf.append("public class F extends E {\n");
-		buf.append("    private test2.E color;\n");
-		buf.append("\n");
-		buf.append("    void foo() {\n");
-		buf.append("         this.color= baz();\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}	
-	
-	
-	public void testVarInAnonymous() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-				
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int fcount) {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                fCount= 7;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 6);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int fcount) {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            private int fCount;\n");
-		buf.append("\n");
-		buf.append("            public void run() {\n");
-		buf.append("                fCount= 7;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    protected int fCount;\n");
-		buf.append("\n");
-		buf.append("    public void foo(int fcount) {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                fCount= 7;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(2);
-		String preview3= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int fcount) {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                int fCount = 7;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected3= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(3);
-		String preview4= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int fcount) {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run(int fCount) {\n");
-		buf.append("                fCount= 7;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected4= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(4);
-		String preview5= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int fcount) {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("                fcount= 7;\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected5= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(5);
-		String preview6= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public void foo(int fcount) {\n");
-		buf.append("        new Runnable() {\n");
-		buf.append("            public void run() {\n");
-		buf.append("            }\n");
-		buf.append("        };\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected6= buf.toString();			
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3, preview4, preview5, preview6 }, new String[] { expected1, expected2, expected3, expected4, expected5, expected6 });		
-	}
-	
-	public void testLongVarRef() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public int mash;\n");
-		buf.append("    void foo(E e) {\n");
-		buf.append("         e.var.hash= 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("F.java", buf.toString(), false, null);		
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    public F var;\n");
-		buf.append("}\n");
-		pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public int mash;\n");
-		buf.append("    private int hash;\n");
-		buf.append("    void foo(E e) {\n");
-		buf.append("         e.var.hash= 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected1= buf.toString();
-		
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class F {\n");
-		buf.append("    public int mash;\n");
-		buf.append("    void foo(E e) {\n");
-		buf.append("         e.var.mash= 2;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected2= buf.toString();			
-		
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2}, new String[] { expected1, expected2});		
-	}	
-
-	public void testVarAndTypeRef() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		
-		buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("import java.io.File;\n");
-		buf.append("public class F {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        char ch= Fixe.pathSeparatorChar;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu1= pack1.createCompilationUnit("F.java", buf.toString(), false, null);		
-
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu1, true);
-		ArrayList proposals= collectCorrections(cu1, astRoot);
-		assertNumberOf("proposals", proposals.size(), 7);
-		assertCorrectLabels(proposals);
-
-		boolean doField= true, doParam= true, doLocal= true, doConst= true, doInterface= true, doClass= true, doChange= true;
-		for (int i= 0; i < proposals.size(); i++) {
-			Object curr= proposals.get(i);
-			if (curr instanceof NewVariableCompletionProposal) {
-				NewVariableCompletionProposal proposal= (NewVariableCompletionProposal) proposals.get(i);
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-	
-				if (proposal.getVariableKind() == NewVariableCompletionProposal.FIELD) {
-					assertTrue("2 field proposals", doField);
-					doField= false;
-					
-					buf= new StringBuffer();
-					buf.append("package test1;\n");
-					buf.append("import java.io.File;\n");
-					buf.append("public class F {\n");
-					buf.append("    private Object Fixe;\n");
-					buf.append("\n");
-					buf.append("    void foo() {\n");
-					buf.append("        char ch= Fixe.pathSeparatorChar;\n");
-					buf.append("    }\n");
-					buf.append("}\n");
-					assertEqualString(preview, buf.toString());
-				} else if (proposal.getVariableKind() == NewVariableCompletionProposal.LOCAL) {
-					assertTrue("2 local proposals", doLocal);
-					doLocal= false;
-					
-					buf= new StringBuffer();
-					buf.append("package test1;\n");
-					buf.append("import java.io.File;\n");
-					buf.append("public class F {\n");
-					buf.append("    void foo() {\n");
-					buf.append("        Object Fixe;\n");					
-					buf.append("        char ch= Fixe.pathSeparatorChar;\n");
-					buf.append("    }\n");
-					buf.append("}\n");
-					assertEqualString(preview, buf.toString());
-				} else if (proposal.getVariableKind() == NewVariableCompletionProposal.PARAM) {
-					assertTrue("2 param proposals", doParam);
-					doParam= false;
-					
-					buf= new StringBuffer();
-					buf.append("package test1;\n");
-					buf.append("import java.io.File;\n");
-					buf.append("public class F {\n");
-					buf.append("    void foo(Object Fixe) {\n");
-					buf.append("        char ch= Fixe.pathSeparatorChar;\n");
-					buf.append("    }\n");
-					buf.append("}\n");
-					assertEqualString(preview, buf.toString());
-				} else if (proposal.getVariableKind() == NewVariableCompletionProposal.CONST_FIELD) {
-					assertTrue("2 const proposals", doConst);
-					doConst= false;
-					
-					buf= new StringBuffer();
-					buf.append("package test1;\n");
-					buf.append("import java.io.File;\n");
-					buf.append("public class F {\n");
-					buf.append("    private static final String Fixe = null;\n");
-					buf.append("\n");
-					buf.append("    void foo() {\n");
-					buf.append("        char ch= Fixe.pathSeparatorChar;\n");
-					buf.append("    }\n");
-					buf.append("}\n");
-					assertEqualString(preview, buf.toString());
-					
-				} else {
-					assertTrue("unknown type", false);
-				}
-			} else if (curr instanceof NewCUCompletionUsingWizardProposal) {
-				NewCUCompletionUsingWizardProposal proposal= (NewCUCompletionUsingWizardProposal) curr;
-				proposal.setShowDialog(false);
-				proposal.apply(null);
-				
-				ICompilationUnit newCU= pack1.getCompilationUnit("Fixe.java");
-				assertTrue("Nothing created", newCU.exists());
-
-				if (proposal.isClass()) {
-					assertTrue("2 class proposals", doClass);
-					doClass= false;
-
-					buf= new StringBuffer();
-					buf.append("package test1;\n");
-					buf.append("\n");
-					buf.append("public class Fixe {\n");
-					buf.append("\n");
-					buf.append("}\n");
-					assertEqualStringIgnoreDelim(newCU.getSource(), buf.toString());
-					JavaProjectHelper.performDummySearch();
-					newCU.delete(true, null);
-				} else {
-					assertTrue("2 interface proposals", doInterface);
-					doInterface= false;					
-					
-					buf= new StringBuffer();
-					buf.append("package test1;\n");
-					buf.append("\n");
-					buf.append("public interface Fixe {\n");
-					buf.append("\n");
-					buf.append("}\n");
-					assertEqualStringIgnoreDelim(newCU.getSource(), buf.toString());
-					JavaProjectHelper.performDummySearch();
-					newCU.delete(true, null);
-				}
-			} else {
-				assertTrue("2 replace proposals", doChange);
-				doChange= false;
-				CUCorrectionProposal proposal= (CUCorrectionProposal) curr;
-				String preview= proposal.getCompilationUnitChange().getPreviewContent();
-	
-				buf= new StringBuffer();
-				buf.append("package test1;\n");
-				buf.append("import java.io.File;\n");
-				buf.append("public class F {\n");
-				buf.append("    void foo() {\n");
-				buf.append("        char ch= File.pathSeparatorChar;\n");
-				buf.append("    }\n");
-				buf.append("}\n");
-				assertEqualString(preview, buf.toString());
-			}
-		}		
-	
-	}
-	
-	public void testSimilarVariableNames1() throws Exception {
-		StringBuffer buf= new StringBuffer();
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test3", false, null);
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static final short CON1= 1;\n");
-		buf.append("    private static final float CON2= 1.0f;\n");
-		buf.append("    private String bla;\n");
-		buf.append("    private String cout;\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return count;\n");		
-		buf.append("    }\n");				
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		for (int i= proposals.size() - 1; i >= 0; i--) {
-			Object curr= proposals.get(i);
-			if (!(curr instanceof RenameNodeCompletionProposal)) {
-				proposals.remove(i);
-			}
-		}
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static final short CON1= 1;\n");
-		buf.append("    private static final float CON2= 1.0f;\n");
-		buf.append("    private String bla;\n");
-		buf.append("    private String cout;\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return CON1;\n");		
-		buf.append("    }\n");				
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static final short CON1= 1;\n");
-		buf.append("    private static final float CON2= 1.0f;\n");
-		buf.append("    private String bla;\n");
-		buf.append("    private String cout;\n");
-		buf.append("    public int foo() {\n");
-		buf.append("        return cout;\n");		
-		buf.append("    }\n");				
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testSimilarVariableNames2() throws Exception {
-		StringBuffer buf= new StringBuffer();
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test3", false, null);
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static final short CON1= 1;\n");
-		buf.append("    private static final float CON2= 1.0f;\n");
-		buf.append("    private static short var1= 1;\n");
-		buf.append("    private static float var2= 1.0f;\n");
-		buf.append("    private String bla;\n");
-		buf.append("    private String cout;\n");
-		buf.append("    public void foo(int x) {\n");
-		buf.append("        count= x;\n");		
-		buf.append("    }\n");				
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot);
-		for (int i= proposals.size() - 1; i >= 0; i--) {
-			Object curr= proposals.get(i);
-			if (!(curr instanceof RenameNodeCompletionProposal)) {
-				proposals.remove(i);
-			}
-		}
-		
-		assertNumberOf("proposals", proposals.size(), 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static final short CON1= 1;\n");
-		buf.append("    private static final float CON2= 1.0f;\n");
-		buf.append("    private static short var1= 1;\n");
-		buf.append("    private static float var2= 1.0f;\n");
-		buf.append("    private String bla;\n");
-		buf.append("    private String cout;\n");
-		buf.append("    public void foo(int x) {\n");
-		buf.append("        var2= x;\n");		
-		buf.append("    }\n");				
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    private static final short CON1= 1;\n");
-		buf.append("    private static final float CON2= 1.0f;\n");
-		buf.append("    private static short var1= 1;\n");
-		buf.append("    private static float var2= 1.0f;\n");
-		buf.append("    private String bla;\n");
-		buf.append("    private String cout;\n");
-		buf.append("    public void foo(int x) {\n");
-		buf.append("        cout= x;\n");		
-		buf.append("    }\n");				
-		buf.append("}\n");
-		String expected2= buf.toString();
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });		
-	}
-	
-	public void testSimilarVariableNamesMultipleOcc() throws Exception {
-		StringBuffer buf= new StringBuffer();
-		
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test3", false, null);
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int cout;\n");
-		buf.append("    public void setCount(int x) {\n");
-		buf.append("        count= x;\n");
-		buf.append("        count++;\n");	
-		buf.append("    }\n");
-		buf.append("    public int getCount() {\n");
-		buf.append("        return count;\n");	
-		buf.append("    }\n");			
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 3);
-		for (int i= proposals.size() - 1; i >= 0; i--) {
-			Object curr= proposals.get(i);
-			if (!(curr instanceof RenameNodeCompletionProposal)) {
-				proposals.remove(i);
-			}
-		}
-		
-		assertNumberOf("proposals", proposals.size(), 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= proposal.getCompilationUnitChange().getPreviewContent();
-		
-		buf= new StringBuffer();
-		buf.append("package test3;\n");
-		buf.append("public class E {\n");
-		buf.append("    private int cout;\n");
-		buf.append("    public void setCount(int x) {\n");
-		buf.append("        cout= x;\n");
-		buf.append("        cout++;\n");	
-		buf.append("    }\n");
-		buf.append("    public int getCount() {\n");
-		buf.append("        return cout;\n");	
-		buf.append("    }\n");			
-		buf.append("}\n");
-		String expected1= buf.toString();
-
-		assertEqualString( preview1, expected1);
-	}
-	
-	public void testVarMultipleOccurances1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (i= 0; i > 9; i++) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 3);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal localProposal= null;
-		for (int i = 0; i < proposals.size(); i++) {
-			Object curr= proposals.get(i);
-			if (curr instanceof NewVariableCompletionProposal && ((NewVariableCompletionProposal) curr).getVariableKind() == NewVariableCompletionProposal.LOCAL) {
-				localProposal= (CUCorrectionProposal) curr;
-			}
-		}
-		assertNotNull(localProposal);
-		
-		String preview= localProposal.getCompilationUnitChange().getPreviewContent();
-		buf= new StringBuffer();	
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (int i = 0; i > 9; i++) {\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-
-		assertEqualString(preview, expected);	
-	}	
-	
-	public void testVarMultipleOccurances2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (i= 0; i > 9;) {\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");		
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 3);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal localProposal= null;
-		for (int i = 0; i < proposals.size(); i++) {
-			Object curr= proposals.get(i);
-			if (curr instanceof NewVariableCompletionProposal && ((NewVariableCompletionProposal) curr).getVariableKind() == NewVariableCompletionProposal.LOCAL) {
-				localProposal= (CUCorrectionProposal) curr;
-			}
-		}
-		assertNotNull(localProposal);
-		
-		String preview= localProposal.getCompilationUnitChange().getPreviewContent();
-		buf= new StringBuffer();	
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (int i = 0; i > 9;) {\n");
-		buf.append("            i++;\n");
-		buf.append("        }\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-
-		assertEqualString(preview, expected);	
-	}
-	
-	public void testVarMultipleOccurances3() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        for (i = 0; i > 9;) {\n");
-		buf.append("        }\n");
-		buf.append("        i= 9;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		CompilationUnit astRoot= AST.parseCompilationUnit(cu, true);
-		ArrayList proposals= collectCorrections(cu, astRoot, 3);
-		assertNumberOf("proposals", proposals.size(), 3);
-		assertCorrectLabels(proposals);
-		
-		CUCorrectionProposal localProposal= null;
-		for (int i = 0; i < proposals.size(); i++) {
-			Object curr= proposals.get(i);
-			if (curr instanceof NewVariableCompletionProposal && ((NewVariableCompletionProposal) curr).getVariableKind() == NewVariableCompletionProposal.LOCAL) {
-				localProposal= (CUCorrectionProposal) curr;
-			}
-		}
-		assertNotNull(localProposal);
-		
-		String preview= localProposal.getCompilationUnitChange().getPreviewContent();
-		buf= new StringBuffer();	
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    void foo() {\n");
-		buf.append("        int i;\n");
-		buf.append("        for (i = 0; i > 9;) {\n");
-		buf.append("        }\n");
-		buf.append("        i= 9;\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		String expected= buf.toString();
-
-		assertEqualString(preview, expected);	
-	}	
-
-	
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/ExclusivePositionUpdaterTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/ExclusivePositionUpdaterTest.java
deleted file mode 100644
index e91f5e2..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/ExclusivePositionUpdaterTest.java
+++ /dev/null
@@ -1,135 +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.jdt.ui.tests.text;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.Position;
-
-import org.eclipse.jdt.internal.ui.text.link.ExclusivePositionUpdater;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-/**
- * @author tei
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class ExclusivePositionUpdaterTest extends TestCase {
-	
-	private ExclusivePositionUpdater fUpdater;
-	private static final String CATEGORY= "testcategory";
-	private Position fPos;
-	private IDocument fDoc;
-	/*
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		fUpdater= new ExclusivePositionUpdater(CATEGORY);
-		fDoc= new Document("ccccccccccccccccccccccccccccccccccccccccccccc");
-		fPos= new Position(5, 5);
-		fDoc.addPositionUpdater(fUpdater);
-		fDoc.addPositionCategory(CATEGORY);
-		fDoc.addPosition(CATEGORY, fPos);
-	}
-
-	public void testDeleteAfter() throws BadLocationException {
-		fDoc.replace(20, 2, null);
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-	
-	public void testAddAfter() throws BadLocationException {
-		fDoc.replace(20, 0, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-	
-	public void testDeleteBefore() throws BadLocationException {
-		fDoc.replace(2, 2, null);
-		Assert.assertEquals(3, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testAddBefore() throws BadLocationException {
-		fDoc.replace(2, 0, "yy");
-		Assert.assertEquals(7, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testAddRightBefore() throws BadLocationException {
-		fDoc.replace(5, 0, "yy");
-		Assert.assertEquals(7, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testDeleteRightBefore() throws BadLocationException {
-		fDoc.replace(5, 2, "");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(3, fPos.length);
-	}
-
-	public void testAddRightAfter() throws BadLocationException {
-		fDoc.replace(10, 0, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testDeleteRightAfter() throws BadLocationException {
-		fDoc.replace(10, 2, "");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testAddWithin() throws BadLocationException {
-		fDoc.replace(6, 0, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(7, fPos.length);
-	}
-
-	public void testDeleteWithin() throws BadLocationException {
-		fDoc.replace(6, 2, "");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(3, fPos.length);
-	}
-
-	public void testReplaceLeftBorder() throws BadLocationException {
-		fDoc.replace(4, 2, "yy");
-		Assert.assertEquals(6, fPos.offset);
-		Assert.assertEquals(4, fPos.length);
-	}
-
-	public void testReplaceRightBorder() throws BadLocationException {
-		fDoc.replace(9, 2, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(4, fPos.length);
-	}
-
-	public void testDeleteOverRightBorder() throws BadLocationException {
-		fDoc.replace(9, 2, "");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(4, fPos.length);
-	}
-	
-	public void testDeleted() throws BadLocationException {
-		fDoc.replace(4, 7, null);
-		Assert.assertTrue(fPos.isDeleted);
-	}
-
-	public void testReplaced() throws BadLocationException {
-		fDoc.replace(4, 7, "yyyyyyy");
-		Assert.assertTrue(fPos.isDeleted);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/HTML2TextReaderTester.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/HTML2TextReaderTester.java
deleted file mode 100644
index ba114f6..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/HTML2TextReaderTester.java
+++ /dev/null
@@ -1,89 +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.jdt.ui.tests.text;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-
-import org.eclipse.jdt.internal.ui.text.HTML2TextReader;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class HTML2TextReaderTester extends TestCase {
-
-	private boolean isVerbose= false;
-	private static final String LD= System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	public HTML2TextReaderTester(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new TestSuite(HTML2TextReaderTester.class);
-	}
-
-	private void verify(String input, String expectedOutput) throws IOException{
-		Reader reader= new StringReader(input);
-		HTML2TextReader htmlReader= new HTML2TextReader(reader, null);
-		String result= htmlReader.getString();
-		if (isVerbose)
-			System.out.println("<"+ result +"/>");
-		assertEquals(expectedOutput, result);		
-	}
-	
-	public void test0() throws IOException{
-		String string= "<code>3<5<code>";
-		String expected= "3<5";
-		verify(string, expected);
-	}
-	
-	public void test1() throws IOException{
-		String string= "<dl><dt>@author</dt><dd>Foo Bar</dd></dl>";
-		String expected= LD+ "@author"+LD+"\tFoo Bar"+LD;
-		verify(string, expected);
-	}
-
-	public void test2() throws IOException{
-		String string= "<code>3>5<code>";
-		String expected= "3>5";
-		verify(string, expected);
-	}
-
-	public void test3() throws IOException{
-		String string= "<a href= \"<p>this is only a string - not a tag<p>\">text</a>";
-		String expected= "text";
-		verify(string, expected);
-	}
-	
-	public void test4() throws IOException{
-		String string= 	"<html><body text=\"#000000\" bgcolor=\"#FFFF88\"><font size=-1><h5>void p.Bb.fes()</h5><p><dl><dt>Parameters:</dt><dd><b>i</b> fred or <code>null</code></dd></dl></font></body></html>";
-		String expected= "void p.Bb.fes()"+ LD + LD + LD+ "Parameters:"+ LD + "\ti fred or null"+LD;
-		verify(string, expected);
-	}
-
-	public void test5() throws IOException{
-		String string= "<code>1<2<3<4</code>";
-		String expected= "1<2<3<4";
-		verify(string, expected);
-	}
-
-	public void test6() throws IOException{
-		//test for bug 19070
-		String string= "<p>Something.<p>Something more.";
-		String expected= LD + "Something." + LD + "Something more.";
-		verify(string, expected);
-	}
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/InclusivePositionUpdaterTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/InclusivePositionUpdaterTest.java
deleted file mode 100644
index 3567522..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/InclusivePositionUpdaterTest.java
+++ /dev/null
@@ -1,143 +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.jdt.ui.tests.text;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.Position;
-
-import org.eclipse.jdt.internal.ui.text.link.InclusivePositionUpdater;
-
-/**
- * @author tei
- *
- * To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Generation - Code and Comments
- */
-public class InclusivePositionUpdaterTest extends TestCase {
-	
-	private InclusivePositionUpdater fUpdater;
-	private static final String CATEGORY= "testcategory";
-	private Position fPos;
-	private IDocument fDoc;
-	/*
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		fUpdater= new InclusivePositionUpdater(CATEGORY);
-		fDoc= new Document("ccccccccccccccccccccccccccccccccccccccccccccc");
-		fPos= new Position(5, 5);
-		fDoc.addPositionUpdater(fUpdater);
-		fDoc.addPositionCategory(CATEGORY);
-		fDoc.addPosition(CATEGORY, fPos);
-	}
-	
-	/*
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		fDoc.removePositionUpdater(fUpdater);
-		fDoc.removePositionCategory(CATEGORY);
-	}
-
-	public void testDeleteAfter() throws BadLocationException {
-		fDoc.replace(20, 2, null);
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-	
-	public void testAddAfter() throws BadLocationException {
-		fDoc.replace(20, 0, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-	
-	public void testDeleteBefore() throws BadLocationException {
-		fDoc.replace(2, 2, null);
-		Assert.assertEquals(3, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testAddBefore() throws BadLocationException {
-		fDoc.replace(2, 0, "yy");
-		Assert.assertEquals(7, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testAddRightBefore() throws BadLocationException {
-		fDoc.replace(5, 0, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(7, fPos.length);
-	}
-
-	public void testDeleteRightBefore() throws BadLocationException {
-		fDoc.replace(5, 2, "");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(3, fPos.length);
-	}
-
-	public void testAddRightAfter() throws BadLocationException {
-		fDoc.replace(10, 0, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(7, fPos.length);
-	}
-
-	public void testDeleteRightAfter() throws BadLocationException {
-		fDoc.replace(10, 2, "");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testAddWithin() throws BadLocationException {
-		fDoc.replace(6, 0, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(7, fPos.length);
-	}
-
-	public void testDeleteWithin() throws BadLocationException {
-		fDoc.replace(6, 2, "");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(3, fPos.length);
-	}
-
-	public void testReplaceLeftBorder() throws BadLocationException {
-		fDoc.replace(4, 2, "yy");
-		Assert.assertEquals(6, fPos.offset);
-		Assert.assertEquals(5, fPos.length);
-	}
-
-	public void testReplaceRightBorder() throws BadLocationException {
-		fDoc.replace(9, 2, "yy");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(6, fPos.length);
-	}
-
-	public void testDeleteOverRightBorder() throws BadLocationException {
-		fDoc.replace(9, 2, "");
-		Assert.assertEquals(5, fPos.offset);
-		Assert.assertEquals(4, fPos.length);
-	}
-	
-	public void testDeleted() throws BadLocationException {
-		fDoc.replace(4, 7, null);
-		Assert.assertTrue(fPos.isDeleted);
-	}
-
-	public void testReplaced() throws BadLocationException {
-		fDoc.replace(4, 7, "yyyyyyy");
-		Assert.assertTrue(fPos.isDeleted);
-	}
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaDoc2HTMLTextReaderTester.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaDoc2HTMLTextReaderTester.java
deleted file mode 100644
index 45e97d0..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaDoc2HTMLTextReaderTester.java
+++ /dev/null
@@ -1,246 +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.jdt.ui.tests.text;
-
-import java.io.Reader;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IBuffer;
-import org.eclipse.jdt.core.IBufferChangedListener;
-import org.eclipse.jdt.core.IOpenable;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.corext.javadoc.JavaDocCommentReader;
-import org.eclipse.jdt.internal.ui.text.HTMLPrinter;
-import org.eclipse.jdt.internal.ui.text.javadoc.JavaDoc2HTMLTextReader;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-public class JavaDoc2HTMLTextReaderTester extends TestCase {
-
-	private boolean isVerbose= false;
-	
-	public JavaDoc2HTMLTextReaderTester(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new TestSuite(JavaDoc2HTMLTextReaderTester.class);
-	}
-
-	private String getTransformedJavaDoc(String string) {
-		Reader reader= new JavaDocCommentReader(new MockBuffer(string), 0, string.length());
-		return HTMLPrinter.read(new JavaDoc2HTMLTextReader(reader));
-	}
-	
-	private void verify(String string, String expected){
-		String result = getTransformedJavaDoc(string);
-		if (isVerbose)
-			System.out.println("result:" + result); //$NON-NLS-1$
-		assertEquals(expected, result);
-	}
-
-	public void test0(){
-		String string= "/**@deprecated*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@deprecated</dt><dd></dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test1(){
-		String string= "/**@author Foo Bar*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@author</dt><dd>Foo Bar</dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test2(){
-		//test for bug 14658
-		String string= "/**@author Foo Bar<a href=\"mailto:foobar@eclipse.org\">foobar@eclipse.org</a>*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@author</dt><dd>Foo Bar<a href=\"mailto:foobar@eclipse.org\">foobar@eclipse.org</a></dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-	
-	public void test3(){
-		//test for bug 14658
-		String string= "/**@author Foo Bar<a href=\"mailto:foobar@eclipse.org\">foobar@eclipse.org</a>\n *@deprecated*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@author</dt><dd>Foo Bar<a href=\"mailto:foobar@eclipse.org\">foobar@eclipse.org</a></dd><dt>@deprecated</dt><dd></dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test4(){
-		String string= "/**@author Foo Bar\n * @deprecated*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@author</dt><dd>Foo Bar</dd><dt>@deprecated</dt><dd></dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-	
-	public void test5(){
-		String string= "/**@author Foo Bar\n * @author Baz Fred*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@author</dt><dd>Foo Bar</dd><dt>@author</dt><dd>Baz Fred</dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test6(){
-		String string= "/**@author Foo Bar\n * @since 2.0*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@author</dt><dd>Foo Bar</dd><dt>@since</dt><dd>2.0</dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	
-	public void test7(){
-		if (true){
-			System.out.println(getClass().getName()+"::" + getName() +" disabled(corner case - @see tag inside <a> tag)"); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		String string= "/**@author Foo Bar<a href=\"mailto:foobar@see.org\">foobar@see.org</a>*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@author</dt><dd>Foo Bar<a href=\"mailto:foobar@see.org\">foobar@see.org</a></dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test8(){
-		if (true){
-			System.out.println(getClass().getName()+"::" + getName() +" disabled(corner case - @see tag inside <a> tag)"); //$NON-NLS-1$ //$NON-NLS-2$
-			return;
-		}
-		String string= "/**@author Foo Bar<a href=\"mailto:foobar@see.org\">foobar@eclipse.org</a>*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>@author</dt><dd>Foo Bar<a href=\"mailto:foobar@see.org\">foobar@eclipse.org</a></dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test9(){
-		String string= "/**@throws NullPointerException*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>Throws:</dt><dd>NullPointerException</dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test10(){
-		//test for bug 8131
-		String string= "/**@exception NullPointerException*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>Throws:</dt><dd>NullPointerException</dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test11(){
-		//test for bug 8132
-		String string= "/**@exception NullPointerException \n * @throws java.lang.Exception*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>Throws:</dt><dd>NullPointerException</dd><dd>java.lang.Exception</dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-	public void test12(){
-		String string= "/** \n *@param i fred or <code>null</code> \n*/"; //$NON-NLS-1$
-		String expected= "<dl><dt>Parameters:</dt><dd><b>i</b> fred or <code>null</code></dd></dl>"; //$NON-NLS-1$
-		verify(string, expected);
-	}
-
-}
-
-class MockBuffer implements IBuffer{
-	
-	private StringBuffer fStringBuffer;
-	MockBuffer(String string){
-		fStringBuffer= new StringBuffer(string);
-	}
-	
-	public void addBufferChangedListener(IBufferChangedListener listener) {
-	}
-
-
-	public void append(char[] text) {
-		fStringBuffer.append(text);
-	}
-
-
-	public void append(String text) {
-		fStringBuffer.append(text);
-	}
-
-
-	public void close() {
-	}
-
-
-	public char getChar(int position) {
-		return fStringBuffer.charAt(position);
-	}
-
-
-	public char[] getCharacters() {
-		return fStringBuffer.toString().toCharArray();
-	}
-
-
-	public String getContents() {
-		return fStringBuffer.toString();
-	}
-
-
-	public int getLength() {
-		return fStringBuffer.length();
-	}
-
-
-	public IOpenable getOwner() {
-		return null;
-	}
-
-
-	public String getText(int offset, int length) {
-		return fStringBuffer.toString().substring(offset, offset + length);
-	}
-
-
-	public IResource getUnderlyingResource() {
-		return null;
-	}
-
-
-	public boolean hasUnsavedChanges() {
-		return false;
-	}
-
-
-	public boolean isClosed() {
-		return false;
-	}
-
-
-	public boolean isReadOnly() {
-		return false;
-	}
-
-
-	public void removeBufferChangedListener(IBufferChangedListener listener) {
-	}
-
-
-	public void replace(int position, int length, char[] text) {
-	}
-
-
-	public void replace(int position, int length, String text) {
-	}
-
-
-	public void save(IProgressMonitor progress, boolean force)
-		throws JavaModelException {
-	}
-
-
-	public void setContents(char[] contents) {
-	}
-
-
-	public void setContents(String contents) {
-		fStringBuffer= new StringBuffer(contents);
-	}
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaDocTagsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaDocTagsTest.java
deleted file mode 100644
index a7801a4..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaDocTagsTest.java
+++ /dev/null
@@ -1,148 +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.jdt.ui.tests.text;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.testplugin.JavaProjectHelper;
-
-import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IPackageFragmentRoot;
-import org.eclipse.jdt.core.IType;
-
-import org.eclipse.jdt.ui.tests.core.CoreTests;
-import org.eclipse.jdt.ui.tests.core.ProjectTestSetup;
-
-import org.eclipse.jdt.internal.corext.javadoc.JavaDocAccess;
-import org.eclipse.jdt.internal.corext.javadoc.JavaDocCommentReader;
-import org.eclipse.jdt.internal.corext.javadoc.JavaDocTag;
-
-/**
- *
- */
-public class JavaDocTagsTest extends CoreTests {
-
-	private static final Class THIS= JavaDocTagsTest.class;
-	
-	private IJavaProject fJProject1;
-	private IPackageFragmentRoot fSourceFolder;
-
-	public JavaDocTagsTest(String name) {
-		super(name);
-	}
-
-
-	public static Test allTests() {
-		return new ProjectTestSetup(new TestSuite(THIS));
-	}
-	
-	public static Test suite() {
-		if (true) {
-			return allTests();
-		} else {
-			TestSuite suite= new TestSuite();
-			suite.addTest(new JavaDocTagsTest("testMethodWithConstructorName"));
-			return new ProjectTestSetup(suite);
-		}
-	}
-
-
-	protected void setUp() throws Exception {
-		fJProject1= ProjectTestSetup.getProject();
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-	}
-
-
-	protected void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, ProjectTestSetup.getDefaultClasspath());
-	}
-	
-	
-	public void testJavadocTags1() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * First sentence.\n");
-		buf.append("     * @version 1.1\n");
-		buf.append("     * @deprecated Use something else.\n");
-		buf.append("     * @throws An exception {@link A} and more.\n");
-		buf.append("     */\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		IType type= cu.getType("E");
-		IMethod method= type.getMethod("foo", new String[0]);
-		
-		JavaDocCommentReader reader= JavaDocAccess.getJavaDoc(method, false);
-		JavaDocTag[] tags= JavaDocTag.createFromComment(reader);
-		
-		String cuSource= cu.getSource();
-		assertNumberOf("proposals", tags.length, 4);
-		assertTag(tags[0], null, "First sentence.", "First sentence.\n     * ", "First sentence.", cuSource);
-		assertTag(tags[1], "version", "1.1", "@version 1.1\n     * ", "1.1", cuSource);
-		assertTag(tags[2], "deprecated", "Use something else.", "@deprecated Use something else.\n     * ", "Use something else.", cuSource);
-		assertTag(tags[3], "throws", "An exception {@link A} and more.", "@throws An exception {@link A} and more.\n     ", "An exception {@link A} and more.", cuSource);		
-	}
-	
-	public void testJavadocTags2() throws Exception {
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
-		StringBuffer buf= new StringBuffer();
-		buf.append("package test1;\n");
-		buf.append("public class E {\n");
-		buf.append("    /**\n");
-		buf.append("     * {@link A}\n");
-		buf.append("     * @version{@link A}\n");
-		buf.append("     */\n");
-		buf.append("    public void foo() {\n");
-		buf.append("    }\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack1.createCompilationUnit("E.java", buf.toString(), false, null);
-		
-		IType type= cu.getType("E");
-		IMethod method= type.getMethod("foo", new String[0]);
-		
-		JavaDocCommentReader reader= JavaDocAccess.getJavaDoc(method, false);
-		JavaDocTag[] tags= JavaDocTag.createFromComment(reader);
-		
-		String cuSource= cu.getSource();
-		assertNumberOf("proposals", tags.length, 2);
-		assertTag(tags[0], null, "{@link A}", "{@link A}\n     * ", "{@link A}", cuSource);
-		assertTag(tags[1], "version", "{@link A}", "@version{@link A}\n     ", "@link A}", cuSource);
-	}
-	
-	
-	private static void assertTag(JavaDocTag tag, String expName, String expContent, String tagRangeContent, String contentRangeContent, String cuContent) {
-		
-		assertEqualString(tag.getName(), expName);
-		assertEqualString(tag.getContent(), expContent);
-		
-		int start= tag.getOffset();
-		if (expName != null) {
-			String fullTag= '@' + expName;
-			
-			assertEqualString(cuContent.substring(start, start + fullTag.length()), fullTag);
-		}
-		
-		assertEqualString(cuContent.substring(start, start + tag.getLength()), tagRangeContent);
-		
-		assertEqualString(cuContent.substring(tag.getContentOffset(), tag.getContentOffset() + tag.getContentLength()), contentRangeContent);
-		
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaHeuristicScannerTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaHeuristicScannerTest.java
deleted file mode 100644
index 021258f..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/JavaHeuristicScannerTest.java
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/PartitionTokenScannerTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/PartitionTokenScannerTest.java
deleted file mode 100644
index 07fd7a1..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/PartitionTokenScannerTest.java
+++ /dev/null
@@ -1,252 +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.jdt.ui.tests.text;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-import org.eclipse.jdt.internal.ui.text.FastJavaPartitionScanner;
-import org.eclipse.jdt.internal.ui.text.JavaPartitionScanner;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.rules.IPartitionTokenScanner;
-import org.eclipse.jface.text.rules.IToken;
-
-/**
- * Compares two <code>IParitionTokenScanner</code>s for conformance and performance.
- */
-public class PartitionTokenScannerTest extends TestCase {
-
-	private IPartitionTokenScanner fReference;
-	private IPartitionTokenScanner fTestee;
-
-	public PartitionTokenScannerTest(String name) {
-		super(name);	
-	}
-
-	protected void setUp() {
-		fReference= new JavaPartitionScanner();
-		fTestee= new FastJavaPartitionScanner();
-	}
-
-	// read sample java file
-	private IDocument getDocument(String name, String lineDelimiter) {
-		try {
-			InputStream stream= getClass().getResourceAsStream(name);
-			BufferedReader reader= new BufferedReader(new InputStreamReader(stream));
-			
-			StringBuffer buffer= new StringBuffer();
-			String line= reader.readLine();
-			while (line != null) {
-				buffer.append(line);
-				buffer.append(lineDelimiter);
-				line= reader.readLine();
-			}
-
-			return new Document(buffer.toString());
-
-		} catch (IOException e) {			
-		}
-		
-		return null;
-	}
-	
-	public static IDocument getRandomDocument(int size) {
-		final char[] characters= {'/', '*', '\'', '"', '\r', '\n', '\\'};
-		final StringBuffer buffer= new StringBuffer();
-		
-		for (int i= 0; i < size; i++) {
-			final int randomIndex= (int) (Math.random() * characters.length);
-			buffer.append(characters[randomIndex]);
-		}
-		
-		return new Document(buffer.toString());
-	}
-
-	public static Test suite() {
-		return new TestSuite(PartitionTokenScannerTest.class);
-	}
-
-	public void testTestCaseLF() {
-		testConformance(getDocument("TestCase.txt", "\n"));
-	}
-
-	public void testTestCaseCRLF() {
-		testConformance(getDocument("TestCase.txt", "\r\n"));
-	}
-
-	public void testTestCaseCR() {
-		testConformance(getDocument("TestCase.txt", "\r"));
-	}
-
-	public void testTestCase2LF() {
-		testConformance(getDocument("TestCase2.txt", "\n"));
-	}
-
-	public void testTestCase2CRLF() {
-		testConformance(getDocument("TestCase2.txt", "\r\n"));
-	}
-
-	public void testTestCase2CR() {
-		testConformance(getDocument("TestCase2.txt", "\r"));
-	}
-
-//	XXX not fully passing because of "\<LF> and '\<LF>
-//	public void testRandom() {
-//		testConformance(getRandomDocument(2048));
-//	}
-
-	/**
-	 * Tests performance of the testee against the reference IPartitionTokenScanner.
-	 */
-	public void testPerformance() {
-		final int COUNT= 5000;
-		final IDocument document= getDocument("TestCase.txt", "\n");
-
-		final long referenceTime= getTime(fReference, document, COUNT);
-		final long testeeTime= getTime(fTestee, document, COUNT);
-
-		if (false) {
-			System.out.println("reference time = " + referenceTime / 1000.0f);
-			System.out.println("testee time = " + testeeTime / 1000.0f);
-			System.out.println("factor = " + (float) referenceTime / testeeTime);
-		}
-		
-		// dangerous: assert no regression in performance
-		// assertTrue(testeeTime <= referenceTime);
-	}
-	
-	private long getTime(IPartitionTokenScanner scanner, IDocument document, int count) {
-		final long start= System.currentTimeMillis();
-
-		for (int i= 0; i < count; i++)
-			testPerformance(scanner, document);
-
-		final long end= System.currentTimeMillis();
-		
-		return end - start;
-	}
-	
-	private void testConformance(final IDocument document) {
-		
-		final StringBuffer message= new StringBuffer();
-		
-		fReference.setRange(document, 0, document.getLength());
-		fTestee.setRange(document, 0, document.getLength());
-		
-		while (true) {
-			
-			message.setLength(0);
-			
-			final IToken referenceToken= fReference.nextToken();
-			final IToken testeeToken= fTestee.nextToken();
-			assertTokenEquals(referenceToken, testeeToken);
-			
-			final int referenceOffset= fReference.getTokenOffset();
-			final int testeeOffset= fTestee.getTokenOffset();
-			message.append(", offset = " + referenceOffset);
-			message.append(", " + extractString(document, referenceOffset));
-			assertEquals(message.toString(), referenceOffset, testeeOffset);
-
-			final int referenceLength= fReference.getTokenLength();
-			final int testeeLength= fTestee.getTokenLength();
-			message.append(", length = " + referenceLength);
-			assertEquals(message.toString(), referenceLength, testeeLength);
-
-			if (referenceToken.isEOF())
-				break;
-		}
-	}
-
-	private static void testPerformance(final IPartitionTokenScanner scanner, final IDocument document) {
-		
-		scanner.setRange(document, 0, document.getLength());
-
-		IToken token;
-		do {
-			token= scanner.nextToken();			
-			scanner.getTokenOffset();
-			scanner.getTokenLength();
-
-		} while (!token.isEOF());
-	}
-	
-	private void assertTokenEquals(IToken expected, IToken actual) {
-		assertEquals(expected.isEOF(), actual.isEOF());
-		assertEquals(expected.isOther(), actual.isOther());
-		assertEquals(expected.isUndefined(), actual.isUndefined());
-		assertEquals(expected.isWhitespace(), actual.isWhitespace());
-	}
-		
-	private static String extractString(IDocument document, int offset) {
-		final StringBuffer buffer= new StringBuffer();
-
-		try {
-			IRegion region= document.getLineInformationOfOffset(offset);
-			String line= document.get(region.getOffset(), region.getLength());
-			
-			int offsetIndex= offset - region.getOffset();
-
-			// XXX kludge
-			if (offsetIndex > line.length())
-				offsetIndex= line.length();
-			
-			buffer.append("line = " + document.getLineOfOffset(offset) + ": [");
-			buffer.append(line.substring(0, offsetIndex));
-			buffer.append("<POS>");
-			buffer.append(line.substring(offsetIndex));
-			buffer.append(']');
-			
-		} catch (BadLocationException e) {
-		}	
-		
-		return buffer.toString();	
-	}
-
-	/**
-	 * Escapes CR, LF and TAB in a string.
-	 */
-	public static String escape(String string) {
-		final StringBuffer buffer= new StringBuffer();
-		
-		final int length= string.length();
-		for (int i= 0; i < length; i++) {
-			final char character= string.charAt(i);
-			switch (character) {
-			case '\t':
-				buffer.append("\\t");
-				break;
-
-			case '\r':
-				buffer.append("\\r");
-				break;
-				
-			case '\n':
-				buffer.append("\\n");
-				break;			
-			
-			default:	
-				buffer.append(character);
-				break;
-			}
-		}
-		
-		return buffer.toString();	
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/SmartSemicolonAutoEditStrategyTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/SmartSemicolonAutoEditStrategyTest.java
deleted file mode 100644
index cb93eba..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/SmartSemicolonAutoEditStrategyTest.java
+++ /dev/null
@@ -1,233 +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.jdt.ui.tests.text;
-
-import junit.framework.Assert;
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.text.rules.DefaultPartitioner;
-
-import org.eclipse.jdt.internal.ui.text.FastJavaPartitionScanner;
-import org.eclipse.jdt.internal.ui.text.IJavaPartitions;
-import org.eclipse.jdt.internal.ui.text.java.SmartSemicolonAutoEditStrategy;
-
-/**
- * SmartSemicolonAutoEditStrategyTest
- * @since 3.0
- */
-public class SmartSemicolonAutoEditStrategyTest extends TestCase {
-
-	/**
-	 * Testclass exposing the method to be tested
-	 */
-	private static class SmartSemicolon extends SmartSemicolonAutoEditStrategy {
-
-		public SmartSemicolon() {
-			super("");
-		}
-		
-		public static int computeCharacterPosition(IDocument document, ITextSelection line, int offset, char character, String partitioning) {
-			return SmartSemicolonAutoEditStrategy.computeCharacterPosition(document, line, offset, character, partitioning);
-		}
-	}
-	
-	public static Test suite() {
-		return new TestSuite(SmartSemicolonAutoEditStrategyTest.class);
-	}
-	
-	private DefaultPartitioner fPartitioner;
-
-	private static final char SEMI= ';';
-	private static final char BRACE= '{';
-
-	private Document fDocument;
-
-	public SmartSemicolonAutoEditStrategyTest() {
-		fDocument= new Document();
-		String[] types= new String[] {
-			IJavaPartitions.JAVA_DOC,
-			IJavaPartitions.JAVA_MULTI_LINE_COMMENT,
-			IJavaPartitions.JAVA_SINGLE_LINE_COMMENT,
-			IJavaPartitions.JAVA_STRING,
-			IJavaPartitions.JAVA_CHARACTER,
-			IDocument.DEFAULT_CONTENT_TYPE
-		};
-		fPartitioner= new DefaultPartitioner(new FastJavaPartitionScanner(), types);
-		fPartitioner.connect(fDocument); 
-		fDocument.setDocumentPartitioner(IJavaPartitions.JAVA_PARTITIONING, fPartitioner); 
-	}
-
-	private void verifySemicolonPosition(int caret, int expected) throws BadLocationException {
-		IRegion region= fDocument.getLineInformation(0);
-		ITextSelection selection= new TextSelection(fDocument, region.getOffset(), region.getLength());
-		int pos= SmartSemicolon.computeCharacterPosition(fDocument, selection, caret, SEMI, IJavaPartitions.JAVA_PARTITIONING);
-		Assert.assertEquals(expected, pos);
-	}
-	
-	private void verifyBracePosition(int caret, int expected) throws BadLocationException {
-		IRegion region= fDocument.getLineInformation(0);
-		ITextSelection selection= new TextSelection(fDocument, region.getOffset(), region.getLength());
-		int pos= SmartSemicolon.computeCharacterPosition(fDocument, selection, caret, BRACE, IJavaPartitions.JAVA_PARTITIONING);
-		if (pos == -1) pos= caret;
-		Assert.assertEquals(expected, pos);
-	}
-	
-	/* semicolon tests */
-	
-	public void testGoToEOL() throws BadLocationException {
-		fDocument.set("public void foobar()");
-		verifySemicolonPosition(5, 20);
-	}
-	
-	public void testGoToExisting() throws BadLocationException {
-		System.out.println("testGoToExisting disabled - unwanted functionality");
-		if (true) return;
-		fDocument.set("public void; foobar()");
-		verifySemicolonPosition(5, 11);
-	}
-	
-	public void testFor() throws BadLocationException {
-		fDocument.set("for (int i= 0)");
-		verifySemicolonPosition(13, -1);
-	}
-	
-	public void testWithExistingBefore() throws BadLocationException {
-		fDocument.set("public void; foobar()");
-		verifySemicolonPosition(12, 21);
-	}
-	
-	public void testWithExistingBeforeWithComment() throws BadLocationException {
-		fDocument.set("public void; foobar() // comment\r\n ");
-		verifySemicolonPosition(12, 21);
-	}
-	
-	public void testWithExistingAtInsertPosition() throws BadLocationException {
-		System.out.println("testWithExistingAtInsertPosition disabled - existing characters handled by framework");
-		if (true) return;
-		fDocument.set("public void foobar(); // comment\r\n");
-		verifySemicolonPosition(12, 12);
-	}
-
-	public void testEndLineComment() throws BadLocationException {
-		fDocument.set("private string foo= \"foobar\" // comment\r\n");
-		verifySemicolonPosition(12, 28);
-	}
-
-	public void testFakeEndLineComment() throws BadLocationException {
-		fDocument.set("private string foo= \"foobar\" /* comment */   \r\n");
-		verifySemicolonPosition(12, 28);
-	}
-	
-	public void testBlockComment() throws BadLocationException {
-		fDocument.set("doStuff(arg1 /* comment */, args)  ");
-		verifySemicolonPosition(5, 33);
-	}
-
-	public void testMultiLineComment() throws BadLocationException {
-		fDocument.set("private string foo= \"foobar\" /* comment1 \r\n comment2 */");
-		verifySemicolonPosition(12, 28);
-	}
-
-	public void testEndLineCommentWithFor() throws BadLocationException {
-		fDocument.set("for (int i= 0; i < 2; i++) // comment");
-		verifySemicolonPosition(13, -1);
-	}
-
-	public void testFakeEndLineCommentWithFor() throws BadLocationException {
-		fDocument.set("for (int i= 0; i < 2; i++) /* comment */  ");
-		verifySemicolonPosition(13, -1);
-	}
-
-	public void testMultiLineCommentWithFor() throws BadLocationException {
-		fDocument.set("for (int i= 0; i < 2; i++) /* comment\r\n comment2 */  ");
-		verifySemicolonPosition(13, -1);
-	}
-
-	/* brace tests */
-	
-	public void testBraceClassDef() throws BadLocationException {
-		fDocument.set("public static final class Main ");
-		verifyBracePosition(31, 31);
-	}
-
-	public void testBraceMethodDef() throws BadLocationException {
-		fDocument.set("void bla(int p1, int p2) // comment");
-		verifyBracePosition(8, 24);
-	}
-
-	public void testBraceMethodDef2() throws BadLocationException {
-		fDocument.set("void bla(int p1, int p2) // comment");
-		verifyBracePosition(12, 24);
-	}
-	
-	public void testBraceIf() throws BadLocationException {
-		fDocument.set("if (condition && condition()) // comment");
-		verifyBracePosition(12, 29);
-	}
-
-	public void testBraceIf2() throws BadLocationException {
-		fDocument.set("if (value == expected) // comment");
-		verifyBracePosition(12, 22);
-	}
-
-	public void testBraceMethodCall() throws BadLocationException {
-		fDocument.set("call(param1, param2) // comment");
-		verifyBracePosition(12, 12);
-	}
-
-	public void testBraceElse() throws BadLocationException {
-		fDocument.set(" } else somecode();");
-		verifyBracePosition(4, 7);
-	}
-
-	public void testBraceArray() throws BadLocationException {
-		fDocument.set("int[] arr= bla, bli, blu;");
-		verifyBracePosition(10, 10);
-		verifyBracePosition(11, 11);
-	}
-
-	public void testBraceArray2() throws BadLocationException {
-		fDocument.set("arr= bla, bli, blu;");
-		verifyBracePosition(4, 4);
-		verifyBracePosition(5, 5);
-	}
-	
-	public void testBraceAnonymousClassDef() throws BadLocationException {
-		fDocument.set("this.addListener(blu, new Listener(), bla)");
-		verifyBracePosition(34, 36);
-	}
-	
-	public void testBraceAnonymousClassDef2() throws BadLocationException {
-		fDocument.set("this.addListener(blu, \"new\", Listener(), bla)");
-		verifyBracePosition(41, 41);
-	}
-	
-	public void testBraceIfAnonymousClassDef() throws BadLocationException {
-		fDocument.set("  if addListener(blu, new Listener(), bla)");
-		verifyBracePosition(34, 36);
-		verifyBracePosition(37, 42);
-	}
-
-	public void testBraceIfAnonymousClassDef2() throws BadLocationException {
-		fDocument.set("  if addListener(blu, \"new\", Listener(), bla)");
-		verifyBracePosition(20, 45);
-		verifyBracePosition(39, 45);
-	}
-	
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/StringsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/StringsTest.java
deleted file mode 100644
index 1378120..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/StringsTest.java
+++ /dev/null
@@ -1,48 +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.jdt.ui.tests.text;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.jdt.internal.corext.util.Strings;
-
-public class StringsTest extends TestCase {
-
-
-	public StringsTest(String name) {
-		super(name);
-	}
-
-	public static Test suite() {
-		return new TestSuite(StringsTest.class);
-	}
-
-	
-	public void testIsIndentChar() {
-		assertTrue(Strings.isIndentChar(' '));
-		assertTrue(Strings.isIndentChar('\t'));
-		assertTrue(!Strings.isIndentChar('x'));
-		assertTrue(!Strings.isIndentChar('\n'));
-		assertTrue(!Strings.isIndentChar('\r'));
-	}
-		
-	public void testIsLineDelimiterChar() {
-		assertTrue(!Strings.isLineDelimiterChar(' '));
-		assertTrue(!Strings.isLineDelimiterChar('\t'));
-		assertTrue(!Strings.isLineDelimiterChar('x'));
-		assertTrue(Strings.isLineDelimiterChar('\n'));
-		assertTrue(Strings.isLineDelimiterChar('\r'));
-	}
-	
-}
-
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/TestCase.txt b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/TestCase.txt
deleted file mode 100644
index 09eca5f..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/TestCase.txt
+++ /dev/null
@@ -1,211 +0,0 @@
-package org.eclipse.jdt.ui.tests.text;
-
-import java.lang.reflect.*;
-
-/**
- * A test case defines the fixture to run multiple tests. To define a test case<br>
- * 1) implement a subclass of TestCase<br>
- * 2) define instance variables that store the state of the fixture<br>
- * 3) initialize the fixture state by overriding <code>setUp</code><br>
- * 4) clean-up after a test by overriding <code>tearDown</code>.<br>
- * Each test runs in its own fixture so there
- * can be no side effects among test runs.
- * Here is an example:
- * <pre>
- * public class MathTest extends TestCase {
- *     protected double fValue1;
- *     protected double fValue2;
- *
- *     public MathTest(String name) {
- *         super(name);
- *     }
- *
- *    protected void setUp() {
- *         fValue1= 2.0;
- *         fValue2= 3.0;
- *     }
- * }
- * </pre>
- *
- * For each test implement a method which interacts
- * with the fixture. Verify the expected results with assertions specified
- * by calling <code>assert</code> with a boolean.
- * <pre>
- *    protected void testAdd() {
- *        double result= fValue1 + fValue2;
- *        assert(result == 5.0);
- *    }
- * </pre>
- * Once the methods are defined you can run them. The framework supports
- * both a static type safe and more dynamic way to run a test.
- * In the static way you override the runTest method and define the method to
- * be invoked. A convenient way to do so is with an anonymous inner class.
- * <pre>
- * Test test= new MathTest("add") {
- *        public void runTest() {
- *            testAdd();
- *        }
- * };
- * test.run();
- * </pre>
- * The dynamic way uses reflection to implement <code>runTest</code>. It dynamically finds
- * and invokes a method.
- * In this case the name of the test case has to correspond to the test method
- * to be run.
- * <pre>
- * Test= new MathTest("testAdd");
- * test.run();
- * </pre>
- * The tests to be run can be collected into a TestSuite. JUnit provides
- * different <i>test runners</i> which can run a test suite and collect the results.
- * A test runner either expects a static method <code>suite</code> as the entry
- * point to get a test to run or it will extract the suite automatically.
- * <pre>
- * public static Test suite() {
- *      suite.addTest(new MathTest("testAdd"));
- *      suite.addTest(new MathTest("testDivideByZero"));
- *      return suite;
- *  }
- * </pre>
- * @see TestResult
- * @see TestSuite
- */
-
-public abstract class TestCase extends Assert implements Test {
-	/**
-	 * the name of the test case
-	 */
-	private String fName;
-	
-	/**
-	 * No-arg constructor to enable serialization. This method
-	 * is not intended to be used by mere mortals.
-	 */
-	TestCase() {
-		fName= null;
-	}
-	
-	/**
-	 * Constructs a test case with the given name.
-	 */
-	public TestCase(String name) {
-		fName= name;
-	}
-	
-	/**
-	 * Counts the number of test cases executed by run(TestResult result).
-	 */
-	public int countTestCases() {
-		return 1;
-	}
-	/**
-	 * Creates a default TestResult object
-	 *
-	 * @see TestResult
-	 */
-	protected TestResult createResult() {
-	    return new TestResult();
-	}
-	/**
-	 * Gets the name of the test case.
-	 * @deprecated use getName()
-	 */
-	public String name() {
-		return fName;
-	}
-	/**
-	 * A convenience method to run this test, collecting the results with a
-	 * default TestResult object.
-	 *
-	 * @see TestResult
-	 */
-	public TestResult run() {
-		TestResult result= createResult();
-		run(result);
-		return result;
-	}
-	/**
-	 * Runs the test case and collects the results in TestResult.
-	 */
-	public void run(TestResult result) {
-		result.run(this);
-	}
-	/**
-	 * Runs the bare test sequence.
-	 * @exception Throwable if any exception is thrown
-	 */
-	public void runBare() throws Throwable {
-		setUp();
-		try {
-			runTest();
-		}
-		finally {
-			tearDown();
-		}
-	}
-	/**
-	 * Override to run the test and assert its state.
-	 * @exception Throwable if any exception is thrown
-	 */
-	protected void runTest() throws Throwable {
-		Method runMethod= null;
-		try {
-			// use getMethod to get all public inherited
-			// methods. getDeclaredMethods returns all
-			// methods of this class but excludes the
-			// inherited ones.
-			runMethod= getClass().getMethod(fName, null);
-		} catch (NoSuchMethodException e) {
-			fail("Method \""+fName+"\" not found");
-		}
-		if (!Modifier.isPublic(runMethod.getModifiers())) {
-			fail("Method \""+fName+"\" should be public");
-		}
-
-		try {
-			runMethod.invoke(this, new Class[0]);
-		}
-		catch (InvocationTargetException e) {
-			e.fillInStackTrace();
-			throw e.getTargetException();
-		}
-		catch (IllegalAccessException e) {
-			e.fillInStackTrace();
-			throw e;
-		}
-	}
-	/**
-	 * Sets up the fixture, for example, open a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected void setUp() throws Exception {
-	}
-	/**
-	 * Tears down the fixture, for example, close a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected void tearDown() throws Exception {
-	}
-	/**
-	 * Returns a string representation of the test case
-	 */
-	public String toString() {
-	    return name()+"("+getClass().getName()+")";
-	}
-	/**
-	 * Gets the name of a TestCase
-	 * @return returns a String
-	 */
-	public String getName() {
-		return fName;
-	}
-
-	/**
-	 * Sets the name of a TestCase
-	 * @param name The name to set
-	 */
-	public void setName(String name) {
-		fName= name;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/TestCase2.txt b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/TestCase2.txt
deleted file mode 100644
index f9a86b8..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/text/TestCase2.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.eclipse.jdt.ui.tests.text;
-
-/**
- * javadoc
- */
-public class TestCase2 {
-	/*
-	 * multi line comment
-	 */
-	 private void foo() {
-	 	// single line comment
-	 	int value= 42;
-	 	
-	 	/**/
-	 	
-	 	String s= "string";
-	 	char c= 'c';
-	 	
-	 	String s2= "string2"/* ads*/;
-	 	
-	 	Nastyness: ""/**/''"";
-	 	
-	 	// open strings and characters
-	 	'open characters
-	 	"open strings
-	 	
-	 	// all state transitions
-	 	/* multi line comment */// single line comment
-	 	/* multi line comment *//* multi line comment */
-	 	/* multi line comment *//** java doc */
-	 	/* multi line comment */'character'
-	 	/* multi line comment */"string"
-	 	/* java doc */// single line comment
-	 	/* java doc *//* multi line comment */
-	 	/* java doc *//** java doc */
-	 	/* java doc */'character'
-	 	/* java doc */"string"
-	 	"string"// single line comment
-	 	"string"//* multi line comment */
-	 	"string"/** java doc */
-	 	"string"'character'
-	 	"string""string"
-	 	'character'// single line comment
-	 	'character'"//* multi line comment */
-	 	'character'/** java doc */
-	 	'character''character'
-	 	'character'"string"
-
-		// more nasty cases
-		/'asdf
-		/"asdf
-
-		/**
-		 *	// single line comment inside javadoc
-		 */
-		
-		/*
-		 *	// single line comment inside multi-line comment
-		 */
-		 
-		// would fail conformance, but it's ok
-		"<backslash>
-		'<backslash>		
-	 }
-
-}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/wizardapi/NewJavaProjectWizardTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/wizardapi/NewJavaProjectWizardTest.java
deleted file mode 100644
index 5892e9d..0000000
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/wizardapi/NewJavaProjectWizardTest.java
+++ /dev/null
@@ -1,308 +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.jdt.ui.tests.wizardapi;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-
-import org.eclipse.jface.operation.IRunnableWithProgress;
-
-import org.eclipse.ui.actions.WorkspaceModifyDelegatingOperation;
-
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-
-import org.eclipse.jdt.launching.JavaRuntime;
-
-import org.eclipse.jdt.ui.PreferenceConstants;
-import org.eclipse.jdt.ui.wizards.NewJavaProjectWizardPage;
-
-public class NewJavaProjectWizardTest extends TestCase {
-	
-	
-	public static Test suite() {
-		return new TestSuite(NewJavaProjectWizardTest.class);
-	}		
-	
-	private class TestNewJavaProjectWizardPage extends NewJavaProjectWizardPage {
-	
-		private IProject fNewProject;
-	
-		public TestNewJavaProjectWizardPage(IWorkspaceRoot root) {
-			super(root, null);
-		}
-		
-		public void setProjectHandle(IProject newProject) {
-			fNewProject= newProject;
-		}	
-	
-		/**
-		 * @see NewJavaProjectWizardPage#getLocationPath()
-		 */
-		protected IPath getLocationPath() { 
-			return null;
-		}
-
-		/**
-		 * @see NewJavaProjectWizardPage#getProjectHandle()
-		 */
-		protected IProject getProjectHandle() {
-			return fNewProject;
-		}
-		
-		public void initBuildPath() {
-			super.initBuildPaths();
-		}
-		
-	}
-	
-	
-	private static final String PROJECT_NAME = "DummyProject";
-	private static final String OTHER_PROJECT_NAME = "OtherProject";
-	
-	
-	private TestNewJavaProjectWizardPage fWizardPage;
-
-	public NewJavaProjectWizardTest(String name) {
-		super(name);
-	}	
-
-	/**
-	 * @see TestCase#setUp()
-	 */
-	protected void setUp() throws Exception {
-		super.setUp();
-		
-		IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
-		
-		IProject project= root.getProject(PROJECT_NAME);
-		
-		fWizardPage= new TestNewJavaProjectWizardPage(root);
-		fWizardPage.setProjectHandle(project);
-	}
-
-	/**
-	 * @see TestCase#tearDown()
-	 */
-	protected void tearDown() throws Exception {
-		IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
-		IProject project= root.getProject(PROJECT_NAME);
-		if (project.exists()) {
-			project.delete(true, null);
-		}
-		
-		project= root.getProject(OTHER_PROJECT_NAME);
-		if (project.exists()) {
-			project.delete(true, null);
-		}		
-	
-		super.tearDown();
-	}
-	
-	private IPath getJREEntryPath() {
-		return JavaRuntime.getDefaultJREContainerEntry().getPath();
-	}
-	
-	
-	private void assertBasicBuildPath(IProject project, IPath outputLocation, IClasspathEntry[] classpath) {
-		assertNotNull("a", outputLocation);
-		assertNotNull("b", classpath);
-		assertTrue("c", classpath.length == 2);
-		
-		if (PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.SRCBIN_FOLDERS_IN_NEWPROJ)) {
-			assertEquals("d", outputLocation, project.getFolder("bin").getFullPath());
-			assertEquals("e", classpath[0].getPath(), project.getFolder("src").getFullPath());
-		} else {
-			assertEquals("f", outputLocation, project.getFullPath());
-			assertEquals("g", classpath[0].getPath(), project.getFullPath());
-		}
-		assertEquals("h", classpath[1].getPath(), getJREEntryPath());		
-	}
-	
-	public void testBasicSet() throws Exception {
-		fWizardPage.initBuildPath();
-		IProject project= fWizardPage.getProjectHandle();
-		
-		IPath outputLocation= fWizardPage.getOutputLocation();
-		IClasspathEntry[] classpath= fWizardPage.getRawClassPath();
-		assertBasicBuildPath(project, outputLocation, classpath);
-	}
-			
-		
-	public void testBasicCreate() throws Exception {	
-		IProject project= fWizardPage.getProjectHandle();
-		
-		IRunnableWithProgress op= new WorkspaceModifyDelegatingOperation(fWizardPage.getRunnable());
-		op.run(null);
-	
-		IJavaProject jproj= fWizardPage.getNewJavaProject();
-		
-		assertEquals("a", jproj.getProject(), project);
-		
-		IPath outputLocation= jproj.getOutputLocation();
-		IClasspathEntry[] classpath= jproj.getRawClasspath();
-		assertBasicBuildPath(jproj.getProject(), outputLocation, classpath);		
-	}
-	
-	public void testProjectChange() throws Exception {	
-		fWizardPage.initBuildPath();
-		IProject project= fWizardPage.getProjectHandle();
-		
-		IPath outputLocation= fWizardPage.getOutputLocation();
-		IClasspathEntry[] classpath= fWizardPage.getRawClassPath();
-		assertBasicBuildPath(project, outputLocation, classpath);
-	
-		IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
-		IProject otherProject= root.getProject(OTHER_PROJECT_NAME);		
-		
-		// change the project before create
-		fWizardPage.setProjectHandle(otherProject);
-
-		IRunnableWithProgress op= new WorkspaceModifyDelegatingOperation(fWizardPage.getRunnable());
-		op.run(null);
-		
-		IJavaProject jproj= fWizardPage.getNewJavaProject();
-		
-		assertEquals("a", jproj.getProject(), otherProject);
-		
-		IPath outputLocation1= fWizardPage.getOutputLocation();
-		IClasspathEntry[] classpath1= fWizardPage.getRawClassPath();
-		assertBasicBuildPath(otherProject, outputLocation1, classpath1);			
-	}	
-	
-	private void assertUserBuildPath(IProject project, IPath outputLocation, IClasspathEntry[] classpath) {
-		assertNotNull("a", outputLocation);
-		assertNotNull("b", classpath);
-		assertTrue("c", classpath.length == 3);
-		
-		assertEquals("d", outputLocation, project.getFolder("dbin").getFullPath());
-		assertEquals("e", classpath[0].getPath(), project.getFolder("dsrc1").getFullPath());
-		assertEquals("f", classpath[1].getPath(), project.getFolder("dsrc2").getFullPath());
-		assertEquals("g", classpath[2].getPath(), getJREEntryPath());	
-	}
-	
-	public void testUserSet() throws Exception {	
-		IProject project= fWizardPage.getProjectHandle();
-		
-		IPath folderPath= project.getFolder("dbin").getFullPath();
-		
-		IClasspathEntry[] entries= new IClasspathEntry[] {
-			JavaCore.newSourceEntry(project.getFolder("dsrc1").getFullPath()),
-			JavaCore.newSourceEntry(project.getFolder("dsrc2").getFullPath())
-		};
-			
-		fWizardPage.setDefaultOutputFolder(folderPath);
-		fWizardPage.setDefaultClassPath(entries, true);
-		fWizardPage.initBuildPath();
-		
-		IPath outputLocation= fWizardPage.getOutputLocation();
-		IClasspathEntry[] classpath= fWizardPage.getRawClassPath();
-		assertUserBuildPath(project, outputLocation, classpath);
-		
-		fWizardPage.setDefaultOutputFolder(null);
-		fWizardPage.setDefaultClassPath(null, false);
-		fWizardPage.initBuildPath();
-		
-		IPath outputLocation1= fWizardPage.getOutputLocation();
-		IClasspathEntry[] classpath1= fWizardPage.getRawClassPath();
-		assertBasicBuildPath(project, outputLocation1, classpath1);
-	}
-	
-	public void testUserCreate() throws Exception {	
-		IProject project= fWizardPage.getProjectHandle();
-		
-		IPath folderPath= project.getFolder("dbin").getFullPath();
-		
-		IClasspathEntry[] entries= new IClasspathEntry[] {
-			JavaCore.newSourceEntry(project.getFolder("dsrc1").getFullPath()),
-			JavaCore.newSourceEntry(project.getFolder("dsrc2").getFullPath())
-		};
-			
-		fWizardPage.setDefaultOutputFolder(folderPath);
-		fWizardPage.setDefaultClassPath(entries, true);
-		
-		IRunnableWithProgress op= new WorkspaceModifyDelegatingOperation(fWizardPage.getRunnable());
-		op.run(null);
-	
-		IJavaProject jproj= fWizardPage.getNewJavaProject();
-		
-		assertEquals("a", jproj.getProject(), project);
-		
-		IPath outputLocation= jproj.getOutputLocation();
-		IClasspathEntry[] classpath= jproj.getRawClasspath();
-		assertUserBuildPath(jproj.getProject(), outputLocation, classpath);	
-	}
-	
-	public void testReadExisting() throws Exception {
-		IProject project= fWizardPage.getProjectHandle();
-		
-		IPath folderPath= project.getFolder("dbin").getFullPath();
-		IClasspathEntry[] entries= new IClasspathEntry[] {
-			JavaCore.newSourceEntry(project.getFolder("dsrc1").getFullPath()),
-			JavaCore.newSourceEntry(project.getFolder("dsrc2").getFullPath())
-		};	
-		
-		fWizardPage.setDefaultOutputFolder(folderPath);
-		fWizardPage.setDefaultClassPath(entries, true);		
-		
-		IRunnableWithProgress op= new WorkspaceModifyDelegatingOperation(fWizardPage.getRunnable());
-		op.run(null);
-	
-		IProject proj= fWizardPage.getNewJavaProject().getProject();
-	
-		fWizardPage.setDefaultClassPath(null, false);
-		fWizardPage.setDefaultOutputFolder(null);
-		fWizardPage.setProjectHandle(proj);
-		
-		// reads from existing
-		fWizardPage.initBuildPath();
-		
-		IPath outputLocation1= fWizardPage.getOutputLocation();
-		IClasspathEntry[] classpath1= fWizardPage.getRawClassPath();
-		assertUserBuildPath(project, outputLocation1, classpath1);
-	}
-	
-	public void testExistingOverwrite() throws Exception {
-		IProject project= fWizardPage.getProjectHandle();
-				
-		IRunnableWithProgress op= new WorkspaceModifyDelegatingOperation(fWizardPage.getRunnable());
-		op.run(null);
-	
-		IPath folderPath= project.getFolder("dbin").getFullPath();
-		IClasspathEntry[] entries= new IClasspathEntry[] {
-			JavaCore.newSourceEntry(project.getFolder("dsrc1").getFullPath()),
-			JavaCore.newSourceEntry(project.getFolder("dsrc2").getFullPath())
-		};	
-		
-		fWizardPage.setDefaultOutputFolder(folderPath);
-		fWizardPage.setDefaultClassPath(entries, true);
-		
-		// should overwrite existing
-		IRunnableWithProgress op1= new WorkspaceModifyDelegatingOperation(fWizardPage.getRunnable());
-		op1.run(null);
-		
-		IJavaProject jproj= fWizardPage.getNewJavaProject();
-		
-		IPath outputLocation1= jproj.getOutputLocation();
-		IClasspathEntry[] classpath1= jproj.getRawClasspath();
-		assertUserBuildPath(project, outputLocation1, classpath1);	
-	}	
-}
-
-
-
diff --git a/org.eclipse.jdt.ui.vcm/.classpath b/org.eclipse.jdt.ui.vcm/.classpath
deleted file mode 100644
index b2cd8dd..0000000
--- a/org.eclipse.jdt.ui.vcm/.classpath
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry kind="src" path="vcm"/>
-    <classpathentry kind="src" path="/org.eclipse.core.boot"/>
-    <classpathentry kind="src" path="/org.eclipse.core.runtime"/>
-    <classpathentry kind="src" path="/org.eclipse.core.resources"/>
-    <classpathentry kind="src" path="/org.eclipse.ui"/>
-    <classpathentry kind="src" path="/org.eclipse.vcm.core"/>
-    <classpathentry kind="src" path="/org.eclipse.vcm.ui"/>
-    <classpathentry kind="src" path="/org.eclipse.jdt.ui"/>
-    <classpathentry kind="src" path="/org.eclipse.jdt.core"/>
-    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
-    <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.jdt.ui.vcm/.cvsignore b/org.eclipse.jdt.ui.vcm/.cvsignore
deleted file mode 100644
index fe99505..0000000
--- a/org.eclipse.jdt.ui.vcm/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-
diff --git a/org.eclipse.jdt.ui.vcm/.project b/org.eclipse.jdt.ui.vcm/.project
deleted file mode 100644
index c59eeba..0000000
--- a/org.eclipse.jdt.ui.vcm/.project
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jdt.ui.vcm</name>
-	<comment></comment>
-	<projects>
-		<project>org.eclipse.jdt.ui</project>
-		<project>org.eclipse.ui</project>
-		<project>org.eclipse.jdt.core</project>
-		<project>org.eclipse.core.boot</project>
-		<project>org.eclipse.core.runtime</project>
-		<project>org.eclipse.core.resources</project>
-		<project>org.eclipse.swt</project>
-		<project>org.eclipse.vcm.core</project>
-		<project>org.eclipse.vcm.ui</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.team.cvs.core.cvsnature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.jdt.ui.vcm/.vcm_meta b/org.eclipse.jdt.ui.vcm/.vcm_meta
deleted file mode 100644
index 351bab6..0000000
--- a/org.eclipse.jdt.ui.vcm/.vcm_meta
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project-description>
-	<nature id="org.eclipse.jdt.core.javanature"/>
-	<reference project-name="org.eclipse.jdt.ui"/>
-	<reference project-name="org.eclipse.ui"/>
-	<reference project-name="org.eclipse.jdt.core"/>
-	<reference project-name="org.eclipse.core.boot"/>
-	<reference project-name="org.eclipse.core.runtime"/>
-	<reference project-name="org.eclipse.core.resources"/>
-	<reference project-name="org.eclipse.swt"/>
-	<reference project-name="org.eclipse.vcm.core"/>
-	<reference project-name="org.eclipse.vcm.ui"/>
-	<builder name="org.eclipse.jdt.core.javabuilder">
-	</builder>
-</project-description>
diff --git a/org.eclipse.jdt.ui.vcm/about.html b/org.eclipse.jdt.ui.vcm/about.html
deleted file mode 100644
index 768324e..0000000
--- a/org.eclipse.jdt.ui.vcm/about.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<html>
-<head>
-<title>About</title>
-<style type="text/css">
-p, table, td, th { font-family: arial, helvetica, geneva; font-size: 10pt}
-pre { font-family: "Courier New", Courier, mono; font-size: 10pt}
-h2 { font-family: arial, helvetica, geneva; font-size: 18pt; font-weight: bold ; line-height: 14px}
-code { font-family: "Courier New", Courier, mono; font-size: 10pt}
-sup { font-family: arial,helvetica,geneva; font-size: 10px}
-h3 { font-family: arial, helvetica, geneva; font-size: 14pt; font-weight: bold}
-li { font-family: arial, helvetica, geneva; font-size: 10pt}
-h1 { font-family: arial, helvetica, geneva; font-size: 28px; font-weight: bold}
-body { font-family: arial, helvetica, geneva; font-size: 10pt; clip: rect(   ); margin-top: 5mm; margin-left: 3mm}
-</style>
-</head>
-<body lang="EN-US" link="blue" vlink="purple">
-<table border="0" cellspacing="5" cellpadding="2" width="100%" >
-  <tr> 
-    <td align="LEFT" valign="TOP" colspan="2" bgcolor="#0080C0"><b><font color="#FFFFFF">About This Content</font></b></td>
-  </tr>
-  <tr> 
-    <td> 
-<p>11th December, 2001</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
-<a href="http://www.eclipse.org/legal/cpl-v05.html">Common Public License Version 0.5</a> &quot;CPL&quot;.  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>
-</td></tr></table>
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.vcm/build.properties b/org.eclipse.jdt.ui.vcm/build.properties
deleted file mode 100644
index 836c70a..0000000
--- a/org.eclipse.jdt.ui.vcm/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-bin.includes = plugin.xml,\
-               about.html,\
-               plugin.properties,\
-               *.jar
-source.jdtvcm.jar = vcm/
diff --git a/org.eclipse.jdt.ui.vcm/plugin.properties b/org.eclipse.jdt.ui.vcm/plugin.properties
deleted file mode 100644
index 6bab83a..0000000
--- a/org.eclipse.jdt.ui.vcm/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-#########################################
-# (c) Copyright IBM Corp. 2000, 2001.
-# All Rights Reserved.
-#########################################
-
-pluginName=Java Development Tools VCM UI
-
-TogglePackagesViewVersionLabels.label = Show &Version Info
-TogglePackagesViewVersionLabels.tooltip = Show Version Info in the Packages View
-Managing = Team
-ManageGroupMenu.label = &Team
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.vcm/plugin.xml.off b/org.eclipse.jdt.ui.vcm/plugin.xml.off
deleted file mode 100644
index 09d244e..0000000
--- a/org.eclipse.jdt.ui.vcm/plugin.xml.off
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- ======================================================================= -->
-<!-- This plugin provides basic VCM functionality to the Eclipse Java UI     -->
-<!-- ======================================================================= -->
-<plugin
-	name="%pluginName"
-	id = "org.eclipse.jdt.ui.vcm"
-	version = "1.0"
-	provider-name = "Object Technology International, Inc.">
-
-	<requires>
-		<import plugin="org.eclipse.core.resources"/>
-		<import plugin="org.eclipse.ui"/>
-		<import plugin="org.eclipse.vcm.core"/>
-		<import plugin="org.eclipse.vcm.ui"/>
-		<import plugin="org.eclipse.vcm.ui.cvs"/>
-		<import plugin="org.eclipse.jdt.ui"/>
-		<import plugin="org.eclipse.jdt.core"/>
-	</requires> 
-
-<runtime>
-  <library name="jdtvcm.jar">  
-     <export name = "*"/>
-  </library> 
-</runtime>
-
-<extension point="org.eclipse.vcm.core.ignore">
-	<ignore pattern = "*.class" selected = "true"/>
-</extension>
-
-<!-- **************** View Actions ******************* -->
-<extension point="org.eclipse.ui.viewActions"> 
-	<viewContribution 
-		id="org.eclipse.vcm.packageViewContribution" 
-		targetID="org.eclipse.jdt.ui.PackageExplorer"> 
-		<action id="org.eclipse.vcm.vcminfoinpkg" 
-			label="%TogglePackagesViewVersionLabels.label" 
-			menubarPath="additions" 
-			state="false"
-			tooltip="%TogglePackagesViewVersionLabels.tooltip" 
-			class="org.eclipse.jdt.ui.vcm.TogglePackageViewVersionLabels">
-		</action> 
-	</viewContribution> 
-</extension> 
-   
-</plugin>
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.vcm/scripts/exportplugin.xml b/org.eclipse.jdt.ui.vcm/scripts/exportplugin.xml
deleted file mode 100644
index 35d3ba3..0000000
--- a/org.eclipse.jdt.ui.vcm/scripts/exportplugin.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-- build script to create a plugin from org.eclipse.jdt.ui.vcm -->
-<project name="org.eclipse.jdt.ui.vcm" default="export" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.eclipse.jdt.ui.vcm" />
-		<property name="dest"  value="${destdir}/${plugin}" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-		<jar 
-			jarfile="${dest}/jdtvcm.jar"
-			basedir="bin"
-		/>
-		<copy file="plugin.xml.off" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-		<zip zipfile="${dest}/jdtvcmsrc.zip">
-		    <fileset dir="vcm" />
-  		</zip>				
-	</target>
-</project>
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/ProfileStore.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/ProfileStore.java
index 770fce7..a1ef5ef 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/ProfileStore.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/formatter/ProfileStore.java
@@ -69,8 +69,8 @@
 
 			if (qName.equals(XML_NODE_SETTING)) {
 
-				final String key= attributes.getValue(XML_ATTRIBUTE_NAME);
-				final String value= attributes.getValue(XML_ATTRIBUTE_NAME);
+				final String key= attributes.getValue(XML_ATTRIBUTE_ID);
+				final String value= attributes.getValue(XML_ATTRIBUTE_VALUE);
 				fSettings.put(key, value);
 
 			} else if (qName.equals(XML_NODE_PROFILE)) {
diff --git a/org.junit/.classpath b/org.junit/.classpath
deleted file mode 100644
index e0b26de..0000000
--- a/org.junit/.classpath
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-    <classpathentry exported="true" kind="lib" path="junit.jar" sourcepath="/org.junit/junitsrc.zip"/>
-    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-    <classpathentry kind="output" path=""/>
-</classpath>
diff --git a/org.junit/.project b/org.junit/.project
deleted file mode 100644
index 29a06e7..0000000
--- a/org.junit/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.junit</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.junit/about.html b/org.junit/about.html
deleted file mode 100644
index 7cb2db3..0000000
--- a/org.junit/about.html
+++ /dev/null
@@ -1,47 +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>25th February, 2003</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>
-
-<p><b>JUnit 3.8.1</b></p>
-
-<p>The plug-in is accompanied by software developed by JUnit.org.  The JUnit 3.8.1 code included with the plug-in includes no modifications.
-Your use of JUnit 3.8.1 in both source and binary code form contained in the plug-in is subject to the terms and conditions of the IBM Public License 1.0
-which is available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>.
-The binary code is located in junit.jar and the source code is located in src.jar.</p>
-
-<p>i) IBM effectively disclaims 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;</p>
-
-<p>ii) IBM effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;</p>
-
-<p>iii) IBM states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party.</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/org.junit/build.properties b/org.junit/build.properties
deleted file mode 100644
index c308cec..0000000
--- a/org.junit/build.properties
+++ /dev/null
@@ -1,18 +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.xml,\
-               about.html,\
-               plugin.properties,\
-               junit.jar
-               
-src.includes = *.zip,about.html
-
-
diff --git a/org.junit/junit.jar b/org.junit/junit.jar
deleted file mode 100644
index 674d71e..0000000
--- a/org.junit/junit.jar
+++ /dev/null
Binary files differ
diff --git a/org.junit/junitsrc.zip b/org.junit/junitsrc.zip
deleted file mode 100644
index 8804909..0000000
--- a/org.junit/junitsrc.zip
+++ /dev/null
Binary files differ
diff --git a/org.junit/plugin.properties b/org.junit/plugin.properties
deleted file mode 100644
index 7e995ae..0000000
--- a/org.junit/plugin.properties
+++ /dev/null
@@ -1,13 +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=JUnit Testing Framework
-providerName=Eclipse.org
diff --git a/org.junit/plugin.xml b/org.junit/plugin.xml
deleted file mode 100644
index 1e39fc5..0000000
--- a/org.junit/plugin.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin
-  name="%pluginName"
-  id="org.junit"
-  version="3.8.1"
-  provider-name="%providerName">
-
-  <runtime>
-    <library name="junit.jar">
-      <export name="*"/>
-	  <packages prefixes="junit"/>
-    </library>
-  </runtime>
-</plugin>
diff --git a/org.junit/scripts/exportplugin.xml b/org.junit/scripts/exportplugin.xml
deleted file mode 100644
index 5574c67..0000000
--- a/org.junit/scripts/exportplugin.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!-- build script to create JUnit Plugin -->
-<project name="org.junit" default="export" basedir="..">
-	<target name="init">
-		<tstamp/>
-		<property name="destdir" value="../../plugin-export" />
-		<property name="plugin"  value="org.junit" />
-		<property name="dest"  value="${destdir}/${plugin}" />
-	</target>
-
-	<target name="build" depends="init">
-    	<eclipse.incrementalBuild project="${plugin}" kind="incr"/>
-	</target>
-
-	<target name="export" depends="build">
-		<mkdir dir="${destdir}" />
-		<delete dir="${dest}" />
-		<mkdir dir="${dest}" />
-
-		<copy file="junit.jar" todir="${dest}"/>
-		<copy file="junitsrc.zip" todir="${dest}"/>
-		<copy file="plugin.xml" todir="${dest}"/>
-		<copy file="about.html" todir="${dest}"/>
-		<copy file="plugin.properties" todir="${dest}"/>
-				
-	</target>
-</project>
